📄 ipage4.htm
字号:
<font size="2" color="#3D5063"> write:write_test,</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> open: open_test,</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> release:release_test</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063">};</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063">/*</font></span><span style="font-family:宋体"><font size="2" color="#3D5063">安装模块<span lang="EN-US">,</span>注册设备</font><span lang="EN-US"><font size="2" color="#3D5063">*/</font></span></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063">int init_module(void){</font></span></p>
<p class="MsoNormal" style="text-indent: 21.0pt">
<span lang="EN-US" style="font-family:宋体"><font size="2" color="#3D5063">int
result;</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> result = register_chrdev(0, "test", &test_fops);</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> if (result < 0) {</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> printk(KERN_INFO "test: can't get major
number\n");</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> return result;</font></span></p>
<p class="MsoNormal" style="text-indent: 21.0pt">
<span lang="EN-US" style="font-family:宋体"><font size="2" color="#3D5063">}</font></span></p>
<p class="MsoNormal" style="text-indent: 21.0pt">
<span lang="EN-US" style="font-family:宋体"><font size="2" color="#3D5063">if (test_major
== 0) test_major = result; </font></span></p>
<p class="MsoNormal" style="text-indent: 21.0pt">
<span lang="EN-US" style="font-family:宋体"><font size="2" color="#3D5063">return
0;</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063">}</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> </font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063">/*</font></span><span style="font-family:宋体"><font size="2" color="#3D5063">卸载模块<span lang="EN-US">,</span>注销设备</font><span lang="EN-US"><font size="2" color="#3D5063">*/</font></span></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063">void cleanup_module(void){</font></span></p>
<p class="MsoNormal" style="text-indent: 31.5pt">
<span lang="EN-US" style="font-family:宋体"><font size="2" color="#3D5063">
unregister_chrdev(test_major, "test");</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063">}</font></span></p>
<p class="MsoNormal"> </p>
<p class="MsoNormal"> </p>
<p class="MsoNormal"> </p>
<p class="MsoNormal"><span style="font-family:宋体">
<font size="2" color="#3D5063">为了测试虚拟字符设备能否正常工作,编写了以下的测试程序<span lang="EN-US">testdriver.c</span>:</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063">#include <stdio.h></font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063">#include <sys/types.h></font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063">#include <sys/stat.h></font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063">#include <fcntl.h></font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> </font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063">int main(void){</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> </font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> int testdev;</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> int i,j,k;</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> </font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> char buf[10];</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> char buf1[10];</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> </font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> testdev = open("/dev/test",O_RDWR);
/*</font></span><span style="font-family:
宋体"><font size="2" color="#3D5063">打开字符设备</font><span lang="EN-US"><font size="2" color="#3D5063">*/</font></span></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> if ( testdev == -1 ){</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> printf("Cann't open file \n");</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> exit(0);</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> }</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> </font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> printf("Input the info:");</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> scanf("%s",buf);</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> </font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> j=write(testdev,buf,10);
/*</font></span><span style="font-family:宋体"><font size="2" color="#3D5063">向字符设备写入信息</font><span lang="EN-US"><font size="2" color="#3D5063">*/</font></span></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> </font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> k=read(testdev,buf1,10);
/*</font></span><span style="font-family:宋体"><font size="2" color="#3D5063">从字符设备读已写的信息</font><span lang="EN-US"><font size="2" color="#3D5063">*/</font></span></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> </font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> for (i = 0; i < 10;i++)</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> printf("%c",buf1[i]);</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> printf("\n%d\n%d\n",j,k);</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> </font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> close(testdev);</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> </font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> return 0;</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063">} </font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> </font></span></p>
<p class="MsoNormal"><span style="font-family:宋体">
<font size="2" color="#3D5063">调试分析:</font></span></p>
<p class="MsoNormal" style="text-indent: 21.0pt"><span style="font-family:宋体">
<font size="2" color="#3D5063">先使用命令<span lang="EN-US">gcc –c test.c –Wall –DMODULE
–D__KERNEL__ -DLINUX –I /usr/src/linux-2.4.20-8/include</span>来进行驱动程序的编译产生<span lang="EN-US">test.o</span>文件;然后用命令<span lang="EN-US">insmod
–f test.o</span>安装设备驱动;按照成功后(用命令<span lang="EN-US">cat /proc/devices</span>看)用命令</font><span lang="EN-US"><font size="2" color="#3D5063">mknod </font></span></span>
<span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063">/dev/test c 254 0 </font></span>
<span style="font-family:宋体"><font size="2" color="#3D5063">创建字符设备<span lang="EN-US">(</span>应在<span lang="EN-US">/dev/</span>生成<span lang="EN-US">test)</span>。</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> </font></span><span style="font-family:宋体">
<font size="2" color="#3D5063">成功创建字符设备后,使用命令<span lang="EN-US">gcc –o
testdriver testdriver.c</span>编译测试程序并执行之,证明所编写的设备驱动满足了要求。</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> </font></span></p>
<font size="2" color="#3D5063"> </font></TD></TR>
<TR>
<TD height=30 vAlign=bottom width=657>
<P align=right><FONT color=#3D5063 size=2><SPAN> <a href="ipage5.htm"><font color="#3D5063"> 实验四</font></a> </SPAN></FONT>
<FONT size=2><A href="../index.htm">
<FONT color="#3d5063"style="FONT-FAMILY: 宋体; FONT-STYLE: normal; FONT-WEIGHT: normal">返回目录页</FONT></A></FONT></P></TD>
<TD height=30 vAlign=bottom width=43></TD></TR>
</TBODY></TABLE></CENTER></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -