📄 ipage4.htm
字号:
<HTML><HEAD><TITLE>实验三 设备驱动程序</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<META content="Microsoft FrontPage 6.0" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId></HEAD>
<BODY background=images/back.gif>
<DIV align=center>
<CENTER>
<TABLE border=0 cellPadding=0 cellSpacing=0 height=4117 width=700>
<TBODY>
<TR>
<TD colSpan=2 height=46 vAlign=bottom width=698><font size="5" color="#3D5063">
实验三 设备驱动程序
</font><FONT color=#3d5063 size=5 style="CURSOR: hand"> </FONT><FONT color=#3d5063 size=2 style="CURSOR: hand"> </FONT></TD></TR>
<TR>
<TD colSpan=2 height=305 width=698>
<p class="MsoNormal"><span style="font-family:宋体">
<font size="2" color="#3D5063"> </font>
<font color="#3D5063"> 题目:掌握增加设备驱动程序的方法。通过模块方法,增加一个新的设备驱动程序,其功能可以简单。要求实现字符设备的驱动。</font></span></p>
<p class="MsoNormal"><span 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"> (1)</font></span><span style="font-family:
宋体"><font size="2" color="#3D5063">注册设备:在<span lang="EN-US">init_module()</span>中调用<span lang="EN-US">register_chrdev()</span>函数来注册设备,并返回主设备号。</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> (2)</font></span><span style="font-family:宋体"><font size="2" color="#3D5063">定义功能函数:其中包括打开函数<span lang="EN-US">(open_test)</span>与释放函数<span lang="EN-US">(release_test)</span>;读操作函数<span lang="EN-US">(read_test)</span>与写操作函数<span lang="EN-US">(write_test)</span>。</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> (3)</font></span><span style="font-family:宋体"><font size="2" color="#3D5063">卸载设备:在<span lang="EN-US">cleanup_module()</span>中调用<span lang="EN-US">unregister_chrdev()</span>函数来卸载设备。</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">test.c</font></span><span 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">#define __NO_VERSION__</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">#include <linux/module.h></font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063">#include <linux/config.h></font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063">#include <linux/version.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">#include <asm/uaccess.h></font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063">#include <asm/segment.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">#include <linux/types.h></font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063">#include <linux/fs.h></font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063">#include <linux/mm.h></font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063">#include <linux/errno.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">unsigned int test_major = 0;/*</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">char mybuf[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">/*</font></span><span style="font-family:宋体"><font size="2" color="#3D5063">将内核空间的<span lang="EN-US">mybuf</span>中的字符串赋给用户空间的<span lang="EN-US">buf</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">static ssize_t read_test(struct file *file,char *buf,size_t
count,loff_t *f_pos){ </font></span></p>
<p class="MsoNormal" style="text-indent: 21.0pt">
<span lang="EN-US" style="font-family:宋体"><font size="2" color="#3D5063">int
length=strlen(mybuf);</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 (verify_area(VERIFY_WRITE,buf,count)
== -EFAULT )</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> return -EFAULT;</font></span></p>
<p class="MsoNormal" style="text-indent: 21.0pt">
<span lang="EN-US" style="font-family:宋体"><font size="2" color="#3D5063">
if(count>9)count=9;</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> count=length-*fpos;</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> if(copy_to_user(buf,mybuf,count))</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> return -EFAULT;</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> *f_pos+=count;</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> return count;</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"><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">buf</span>字符串赋给内核空间的<span lang="EN-US">mybuf[]</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">static ssize_t write_test(struct file *file,
const char *buf, size_t count, loff_t *f_pos){</font></span></p>
<p class="MsoNormal" style="text-indent: 21.0pt">
<span lang="EN-US" style="font-family:宋体"><font size="2" color="#3D5063">int
num;</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> num=count<10?count:10;</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> if(copy_from_user(mybuf,buf,num))</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> return -EFAULT;</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> return num;</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">打开设备函数,将用户数增一</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">static int open_test(struct inode *inode,struct
file *file ){</font></span></p>
<p class="MsoNormal" style="text-indent: 21.0pt">
<span lang="EN-US" style="font-family:宋体"><font size="2" color="#3D5063">
MOD_INC_USE_COUNT;</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><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">static int release_test(struct inode *inode,struct
file *file ){</font></span></p>
<p class="MsoNormal" style="text-indent: 21.0pt">
<span lang="EN-US" style="font-family:宋体"><font size="2" color="#3D5063">
MOD_DEC_USE_COUNT;</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><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">struct file_operations test_fops = {</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
<font size="2" color="#3D5063"> read:read_test,</font></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -