⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000002.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<HTML><HEAD>  <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人:&nbsp;dfbb&nbsp;(赵无忌),&nbsp;信区:&nbsp;Linux&nbsp;<BR>标&nbsp;&nbsp;题:&nbsp;LINUX下的设备驱动程序&nbsp;<BR>发信站:&nbsp;BBS&nbsp;水木清华站&nbsp;(Sat&nbsp;Dec&nbsp;13&nbsp;15:54:36&nbsp;1997)&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>发信人:&nbsp;olly&nbsp;(剑胆琴心),&nbsp;信区:&nbsp;Linux&nbsp;<BR>标&nbsp;&nbsp;题:&nbsp;LINUX下的设备驱动程序&nbsp;<BR>发信站:&nbsp;BBS&nbsp;水木清华站&nbsp;(Sat&nbsp;Jun&nbsp;28&nbsp;14:00:08&nbsp;1997)&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以下是本人毕业论文的一部分,是关于Linux下设备驱动程序的编写的。&nbsp;<BR>请各位同志们指正。&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>三、UNIX系统下的设备驱动程序&nbsp;<BR>3.1、UNIX下设备驱动程序的基本结构&nbsp;<BR>在UNIX系统里,对用户程序而言,设备驱动程序隐藏了设备的具体细节,&nbsp;<BR>对各种不同设备提供了一致的接口,一般来说是把设备映射为一个特殊的设备文&nbsp;<BR>件,用户程序可以象对其它文件一样对此设备文件进行操作。UNIX对硬件设备&nbsp;<BR>支持两个标准接口:块特别设备文件和字符特别设备文件,通过块(字符)特别&nbsp;<BR>设备文件存取的设备称为块(字符)设备或具有块(字符)设备接口。&nbsp;<BR>块设备接口仅支持面向块的I/O操作,所有I/O操作都通过在内核地址空间&nbsp;<BR>中的I/O缓冲区进行,它可以支持几乎任意长度和任意位置上的I/O请求,即提&nbsp;<BR>供随机存取的功能。&nbsp;<BR>字符设备接口支持面向字符的I/O操作,它不经过系统的快速缓存,所以它&nbsp;<BR>们负责管理自己的缓冲区结构。字符设备接口只支持顺序存取的功能,一般不能&nbsp;<BR>进行任意长度的I/O请求,而是限制I/O请求的长度必须是设备要求的基本块长&nbsp;<BR>的倍数。显然,本程序所驱动的串行卡只能提供顺序存取的功能,属于是字符设&nbsp;<BR>备,因此后面的讨论在两种设备有所区别时都只涉及字符型设备接口。&nbsp;<BR>设备由一个主设备号和一个次设备号标识。主设备号唯一标识了设备类型,&nbsp;<BR>即设备驱动程序类型,它是块设备表或字符设备表中设备表项的索引。次设备号&nbsp;<BR>仅由设备驱动程序解释,一般用于识别在若干可能的硬件设备中,I/O请求所涉&nbsp;<BR>及到的那个设备。&nbsp;<BR>设备驱动程序可以分为三个主要组成部分:&nbsp;<BR>(1)&nbsp;自动配置和初始化子程序,负责检测所要驱动的硬件设备是否存在和是否&nbsp;<BR>能正常工作。如果该设备正常,则对这个设备及其相关的、设备驱动程序&nbsp;<BR>需要的软件状态进行初始化。这部分驱动程序仅在初始化的时候被调用一&nbsp;<BR>次。&nbsp;<BR>(2)&nbsp;服务于I/O请求的子程序,又称为驱动程序的上半部分。调用这部分是由&nbsp;<BR>于系统调用的结果。这部分程序在执行的时候,系统仍认为是和进行调用&nbsp;<BR>的进程属于同一个进程,只是由用户态变成了核心态,具有进行此系统调&nbsp;<BR>用的用户程序的运行环境,因此可以在其中调用sleep()等与进程运行环&nbsp;<BR>境有关的函数。&nbsp;<BR>(3)&nbsp;中断服务子程序,又称为驱动程序的下半部分。在UNIX系统中,并不是&nbsp;<BR>直接从中断向量表中调用设备驱动程序的中断服务子程序,而是由UNIX&nbsp;<BR>系统来接收硬件中断,再由系统调用中断服务子程序。中断可以产生在任&nbsp;<BR>何一个进程运行的时候,因此在中断服务程序被调用的时候,不能依赖于&nbsp;<BR>任何进程的状态,也就不能调用任何与进程运行环境有关的函数。因为设&nbsp;<BR>备驱动程序一般支持同一类型的若干设备,所以一般在系统调用中断服务&nbsp;<BR>子程序的时候,都带有一个或多个参数,以唯一标识请求服务的设备。&nbsp;<BR>在系统内部,I/O设备的存取通过一组固定的入口点来进行,这组入口点是&nbsp;<BR>由每个设备的设备驱动程序提供的。一般来说,字符型设备驱动程序能够提供如&nbsp;<BR>下几个入口点:&nbsp;<BR>(1)&nbsp;open入口点。打开设备准备I/O操作。对字符特别设备文件进行打开操&nbsp;<BR>作,都会调用设备的open入口点。open子程序必须对将要进行的I/O&nbsp;<BR>操作做好必要的准备工作,如清除缓冲区等。如果设备是独占的,即同一&nbsp;<BR>时刻只能有一个程序访问此设备,则open子程序必须设置一些标志以表&nbsp;<BR>示设备处于忙状态。&nbsp;<BR>(2)&nbsp;close入口点。关闭一个设备。当最后一次使用设备终结后,调用close&nbsp;<BR>子程序。独占设备必须标记设备可再次使用。&nbsp;<BR>(3)&nbsp;read入口点。从设备上读数据。对于有缓冲区的I/O操作,一般是从缓&nbsp;<BR>冲区里读数据。对字符特别设备文件进行读操作将调用read子程序。&nbsp;<BR>(4)&nbsp;write入口点。往设备上写数据。对于有缓冲区的I/O操作,一般是把数&nbsp;<BR>据写入缓冲区里。对字符特别设备文件进行写操作将调用write子程序。&nbsp;<BR>(5)&nbsp;ioctl入口点。执行读、写之外的操作。&nbsp;<BR>(6)&nbsp;select入口点。检查设备,看数据是否可读或设备是否可用于写数据。&nbsp;<BR>select系统调用在检查与设备特别文件相关的文件描述符时使用select入口点。&nbsp;<BR>如果设备驱动程序没有提供上述入口点中的某一个,系统会用缺省的子程序&nbsp;<BR>来代替。对于不同的系统,也还有一些其它的入口点。&nbsp;<BR>&nbsp;<BR>3.2、LINUX系统下的设备驱动程序&nbsp;<BR>具体到LINUX系统里,设备驱动程序所提供的这组入口点由一个结构来向系&nbsp;<BR>统进行说明,此结构定义为:&nbsp;<BR>#include&nbsp;&lt;linux/fs.h&gt;&nbsp;<BR>struct&nbsp;file_operations&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;(*lseek)(struct&nbsp;inode&nbsp;*inode,struct&nbsp;file&nbsp;*filp,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;off_t&nbsp;off,int&nbsp;pos);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;(*read)(struct&nbsp;inode&nbsp;*inode,struct&nbsp;file&nbsp;*filp,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*buf,&nbsp;int&nbsp;count);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;(*write)(struct&nbsp;inode&nbsp;*inode,struct&nbsp;file&nbsp;*filp,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*buf,int&nbsp;count);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;(*readdir)(struct&nbsp;inode&nbsp;*inode,struct&nbsp;file&nbsp;*filp,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;dirent&nbsp;*dirent,int&nbsp;count);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;(*select)(struct&nbsp;inode&nbsp;*inode,struct&nbsp;file&nbsp;*filp,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;sel_type,select_table&nbsp;*wait);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;(*ioctl)&nbsp;(struct&nbsp;inode&nbsp;*inode,struct&nbsp;file&nbsp;*filp,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;cmd,unsigned&nbsp;int&nbsp;arg);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;(*mmap)&nbsp;(void);&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;(*open)&nbsp;(struct&nbsp;inode&nbsp;*inode,&nbsp;struct&nbsp;file&nbsp;*filp);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;(*release)&nbsp;(struct&nbsp;inode&nbsp;*inode,&nbsp;struct&nbsp;file&nbsp;*filp);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;(*fsync)&nbsp;(struct&nbsp;inode&nbsp;*inode,&nbsp;struct&nbsp;file&nbsp;*filp);&nbsp;<BR>};&nbsp;<BR>其中,struct&nbsp;inode提供了关于特别设备文件/dev/driver(假设此设备名&nbsp;<BR>为driver)的信息,它的定义为:&nbsp;<BR>#include&nbsp;&lt;linux/fs.h&gt;&nbsp;<BR>struct&nbsp;inode&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i_dev;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;&nbsp;&nbsp;i_ino;&nbsp;&nbsp;/*&nbsp;Inode&nbsp;number&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;umode_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i_mode;&nbsp;/*&nbsp;Mode&nbsp;of&nbsp;the&nbsp;file&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nlink_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i_nlink;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uid_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i_uid;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gid_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i_gid;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i_rdev;&nbsp;&nbsp;/*&nbsp;Device&nbsp;major&nbsp;and&nbsp;minor&nbsp;numbers*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;off_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i_size;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i_atime;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i_mtime;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i_ctime;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;&nbsp;&nbsp;i_blksize;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;&nbsp;&nbsp;i_blocks;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;inode_operations&nbsp;*&nbsp;i_op;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;super_block&nbsp;*&nbsp;i_sb;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;wait_queue&nbsp;*&nbsp;i_wait;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;file_lock&nbsp;*&nbsp;i_flock;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;vm_area_struct&nbsp;*&nbsp;i_mmap;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;inode&nbsp;*&nbsp;i_next,&nbsp;*&nbsp;i_prev;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;inode&nbsp;*&nbsp;i_hash_next,&nbsp;*&nbsp;i_hash_prev;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;inode&nbsp;*&nbsp;i_bound_to,&nbsp;*&nbsp;i_bound_by;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;short&nbsp;i_count;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;short&nbsp;i_flags;&nbsp;&nbsp;/*&nbsp;Mount&nbsp;flags&nbsp;(see&nbsp;fs.h)&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i_lock;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i_dirt;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i_pipe;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i_mount;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i_seek;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i_update;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;union&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;pipe_inode_info&nbsp;pipe_i;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;minix_inode_info&nbsp;minix_i;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;ext_inode_info&nbsp;ext_i;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;msdos_inode_info&nbsp;msdos_i;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;iso_inode_info&nbsp;isofs_i;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;nfs_inode_info&nbsp;nfs_i;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;u;&nbsp;<BR>};&nbsp;<BR>&nbsp;<BR>struct&nbsp;file主要用于与文件系统对应的设备驱动程序使用。当然,其它设&nbsp;<BR>备驱动程序也可以使用它。它提供关于被打开的文件的信息,定义为:&nbsp;<BR>#include&nbsp;&lt;linux/fs.h&gt;&nbsp;<BR>struct&nbsp;file&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mode_t&nbsp;f_mode;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev_t&nbsp;f_rdev;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;needed&nbsp;for&nbsp;/dev/tty&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;off_t&nbsp;f_pos;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Curr.&nbsp;posn&nbsp;in&nbsp;file&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;short&nbsp;f_flags;&nbsp;&nbsp;&nbsp;/*&nbsp;The&nbsp;flags&nbsp;arg&nbsp;passed&nbsp;to&nbsp;open&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;short&nbsp;f_count;&nbsp;&nbsp;&nbsp;/*&nbsp;Number&nbsp;of&nbsp;opens&nbsp;on&nbsp;this&nbsp;file&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;short&nbsp;f_reada;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;inode&nbsp;*f_inode;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;pointer&nbsp;to&nbsp;the&nbsp;inode&nbsp;struct&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;file_operations&nbsp;*f_op;/*&nbsp;pointer&nbsp;to&nbsp;the&nbsp;fops&nbsp;struct*/&nbsp;<BR>};&nbsp;<BR>&nbsp;<BR>在结构file_operations里,指出了设备驱动程序所提供的入口点位置,分&nbsp;<BR>别是:&nbsp;<BR>(1)&nbsp;lseek,移动文件指针的位置,显然只能用于可以随机存取的设备。&nbsp;<BR>(2)&nbsp;read,进行读操作,参数buf为存放读取结果的缓冲区,count为所要&nbsp;<BR>读取的数据长度。返回值为负表示读取操作发生错误,否则返回实际读取&nbsp;<BR>的字节数。对于字符型,要求读取的字节数和返回的实际读取字节数都必&nbsp;<BR>须是inode-&gt;i_blksize的的倍数。&nbsp;<BR>(3)&nbsp;write,进行写操作,与read类似。&nbsp;<BR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -