2022年linux驱动程序的开发 .pdf
《2022年linux驱动程序的开发 .pdf》由会员分享,可在线阅读,更多相关《2022年linux驱动程序的开发 .pdf(9页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、返回首页业界资讯源码世界知识中心技术论坛在线培训应用开发解决方案朗新产品专栏您的位置:首页 应用开发 编程语言 C、C+ 查看文章内容=操作提示 搜索引擎 = 搜索综合业界资讯源码世界知识中心在线培训应用开发解决方案技巧提示中的LINUX下的设备驱动程序null 01-01-08 20:45 6850p null - 发信人 : olly ( 剑胆琴心 ), 信区 : Linux 标题: LINUX下的设备驱动程序三、 UNIX 系统下的设备驱动程序3.1、UNIX 下设备驱动程序的基本结构在 UNIX 系统里,对用户程序而言,设备驱动程序隐藏了设备的具体细节,对各种不同设备提供了一致的接口,
2、一般来说是把设备映射为一个特殊的设备文件,用户程序可以象对其它文件一样对此设备文件进行操作。UNIX 对硬件设备支持两个标准接口:块特别设备文件和字符特别设备文件,通过块(字符)特别设备文件存取的设备称为块(字符)设备或具有块(字符)设备接口。块设备接口仅支持面向块的I/O 操作,所有I/O 操作都通过在内核地址空间中的 I/O 缓冲区进行,它可以支持几乎任意长度和任意位置上的I/O 请求,即提供随机存取的功能。字符设备接口支持面向字符的I/O 操作,它不经过系统的快速缓存,所以它们负责管理自己的缓冲区结构。字符设备接口只支持顺序存取的功能,一般不能进行任意长度的I/O 请求,而是限制I/O
3、请求的长度必须是设备要求的基本块长名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 9 页 - - - - - - - - - 的倍数。显然,本程序所驱动的串行卡只能提供顺序存取的功能,属于是字符设备,因此后面的讨论在两种设备有所区别时都只涉及字符型设备接口。设备由一个主设备号和一个次设备号标识。主设备号唯一标识了设备类型,即设备驱动程序类型,它是块设备表或字符设备表中设备表项的索引。次设备号仅由设备驱动程序解释,一般用于识别在若干可能的硬件设备中,I/O 请求所涉及到的那
4、个设备。设备驱动程序可以分为三个主要组成部分:(1) 自动配置和初始化子程序,负责检测所要驱动的硬件设备是否存在和是否能正常工作。如果该设备正常,则对这个设备及其相关的、设备驱动程序需要的软件状态进行初始化。这部分驱动程序仅在初始化的时候被调用一次。(2) 服务于 I/O 请求的子程序,又称为驱动程序的上半部分。调用这部分是由于系统调用的结果。这部分程序在执行的时候,系统仍认为是和进行调用的进程属于同一个进程,只是由用户态变成了核心态,具有进行此系统调用的用户程序的运行环境,因此可以在其中调用sleep()等与进程运行环境有关的函数。(3) 中断服务子程序,又称为驱动程序的下半部分。在UNIX
5、 系统中,并不是直接从中断向量表中调用设备驱动程序的中断服务子程序,而是由UNIX 系统来接收硬件中断,再由系统调用中断服务子程序。中断可以产生在任何一个进程运行的时候,因此在中断服务程序被调用的时候,不能依赖于任何进程的状态,也就不能调用任何与进程运行环境有关的函数。因为设备驱动程序一般支持同一类型的若干设备,所以一般在系统调用中断服务子程序的时候,都带有一个或多个参数,以唯一标识请求服务的设备。在系统内部, I/O 设备的存取通过一组固定的入口点来进行,这组入口点是由每个设备的设备驱动程序提供的。一般来说,字符型设备驱动程序能够提供如下几个入口点:(1) open 入口点。打开设备准备I/
6、O 操作。对字符特别设备文件进行打开操作,都会调用设备的open 入口点。 open 子程序必须对将要进行的I/O 操作做好必要的准备工作,如清除缓冲区等。如果设备是独占的,即同一时刻只能有一个程序访问此设备,则open子程序必须设置一些标志以表示设备处于忙状态。(2) close 入口点。关闭一个设备。当最后一次使用设备终结后,调用close 子程序。独占设备必须标记设备可再次使用。(3) read 入口点。从设备上读数据。对于有缓冲区的I/O 操作,一般是从缓冲区里读数据。对字符特别设备文件进行读操作将调用read子程序。(4) write 入口点。往设备上写数据。对于有缓冲区的I/O 操
7、作,一般是把数据写入缓冲区里。对字符特别设备文件进行写操作将调用write 子程序。(5) ioctl 入口点。执行读、写之外的操作。(6) select 入口点。检查设备,看数据是否可读或设备是否可用于写数据。select系统调用在检查与设备特别文件相关的文件描述符时使用select 入口点。如果设备驱动程序没有提供上述入口点中的某一个,系统会用缺省的子程序来代替。对于不同的系统,也还有一些其它的入口点。3.2、LINUX系统下的设备驱动程序名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - -
8、- 第 2 页,共 9 页 - - - - - - - - - 具体到 LINUX系统里,设备驱动程序所提供的这组入口点由一个结构来向系统进行说明,此结构定义为:#include struct file_operations int (*lseek)(struct inode *inode,struct file *filp, off_t off,int pos); int (*read)(struct inode *inode,struct file *filp, char *buf, int count); int (*write)(struct inode *inode,struct f
9、ile *filp, char *buf,int count); int (*readdir)(struct inode *inode,struct file *filp, struct dirent *dirent,int count); int (*select)(struct inode *inode,struct file *filp, int sel_type,select_table *wait); int (*ioctl) (struct inode *inode,struct file *filp, unsigned int cmd,unsigned int arg); int
10、 (*mmap) (void); int (*open) (struct inode *inode, struct file *filp); void (*release) (struct inode *inode, struct file *filp); int (*fsync) (struct inode *inode, struct file *filp); ; 其中, struct inode 提供了关于特别设备文件/dev/driver (假设此设备名为 driver)的信息,它的定义为:#include struct inode dev_t i_dev; unsigned long
11、 i_ino; /* Inode number */ umode_t i_mode; /* Mode of the file */ nlink_t i_nlink; uid_t i_uid; gid_t i_gid; dev_t i_rdev; /* Device major and minor numbers*/ off_t i_size; time_t i_atime; time_t i_mtime; time_t i_ctime; unsigned long i_blksize; unsigned long i_blocks; struct inode_operations * i_op
12、; struct super_block * i_sb; struct wait_queue * i_wait; struct file_lock * i_flock; struct vm_area_struct * i_mmap; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 9 页 - - - - - - - - - struct inode * i_next, * i_prev; struct inode * i_hash_next, * i_hash_prev;
13、 struct inode * i_bound_to, * i_bound_by; unsigned short i_count; unsigned short i_flags; /* Mount flags (see fs.h) */ unsigned char i_lock; unsigned char i_dirt; unsigned char i_pipe; unsigned char i_mount; unsigned char i_seek; unsigned char i_update; union struct pipe_inode_info pipe_i; struct mi
14、nix_inode_info minix_i; struct ext_inode_info ext_i; struct msdos_inode_info msdos_i; struct iso_inode_info isofs_i; struct nfs_inode_info nfs_i; u; ; struct file 主要用于与文件系统对应的设备驱动程序使用。当然,其它设备驱动程序也可以使用它。它提供关于被打开的文件的信息,定义为:#include struct file mode_t f_mode; dev_t f_rdev; /* needed for /dev/tty */ off
15、_t f_pos; /* Curr. posn in file */ unsigned short f_flags; /* The flags arg passed to open */ unsigned short f_count; /* Number of opens on this file */ unsigned short f_reada; struct inode *f_inode; /* pointer to the inode struct */ struct file_operations *f_op;/* pointer to the fops struct*/ ; 在结构
16、 file_operations 里,指出了设备驱动程序所提供的入口点位置,分别是:(1) lseek,移动文件指针的位置,显然只能用于可以随机存取的设备。(2) read,进行读操作,参数buf 为存放读取结果的缓冲区,count 为所要读取的数据长度。返回值为负表示读取操作发生错误,否则返回实际读取的字节数。对于字符型,要求读取的字节数和返回的实际读取字节数都必须是 inode-i_blksize 的的倍数。(3) write ,进行写操作,与read类似。(4) readdir,取得下一个目录入口点,只有与文件系统相关的设备驱动程序名师资料总结 - - -精品资料欢迎下载 - - - -
17、 - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 9 页 - - - - - - - - - 才使用。(5) selec,进行选择操作,如果驱动程序没有提供select 入口, select 操作将会认为设备已经准备好进行任何的I/O 操作。(6) ioctl ,进行读、写以外的其它操作,参数cmd 为自定义的的命令。(7) mmap,用于把设备的内容映射到地址空间,一般只有块设备驱动程序使用。(8) open,打开设备准备进行I/O 操作。返回0 表示打开成功,返回负数表示失败。如果驱动程序没有提供open 入口,则只要 /d
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年linux驱动程序的开发 2022 linux 驱动程序 开发
限制150内