liunx驱动数据结构

上传人:ss****gk 文档编号:209184482 上传时间:2021-11-09 格式:DOC 页数:3 大小:60.50KB
返回 下载 相关 举报
liunx驱动数据结构_第1页
第1页 / 共3页
liunx驱动数据结构_第2页
第2页 / 共3页
liunx驱动数据结构_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《liunx驱动数据结构》由会员分享,可在线阅读,更多相关《liunx驱动数据结构(3页珍藏版)》请在金锄头文库上搜索。

1、一、总体介绍linux 驱动的内核数据结构:file_operations file inode; inode:用于表示文件file:用于表示打开的文件描述,因为单个文件可能有多个打开文件的描述符,就有可能有多个file结构,但是都是指向一个inode结构;file_operations:I/O设备存収的特定入口结构体,通常设备驱动结构由file_operation结构体想系统说明二、详细介绍(本结构体都含有_USer;这足一种规范,表示用户空间的指针(1) file_operations: /linux-2.6.22/linux/fs.h struct file_operationsstru

2、ct module *owner;/不是一个操作,一般初始化为宏(THIS_MODULE),防止在操作中 被卸载,宏在linux/module.h中定义。loff_t (*llseek)(struct file *filp, loff_t pjnt orig);flip:目标文件结构体指针;不能为NULL :文件定位偏移量(保证64位宽):文件定位起始地址:用于改变文件当前读/写位置porig作用ssize_t(*read)(struct file *filp, char _user* buffer, size,-loff_t *p/同步操作filp:目标文件结构体指针;buffer:存放信息

3、的缓冲区,即用户空间size:要读取的信息长度P:读位置相对于文件头的开头偏移,在读取后一般会自 动移动,移动的值为要读取的长度值ssize_t(*aio_read)(struct kiocb *, char _user * buffer, sizet size, loft_t pb/异步操作kiocb:每一个I/O请求对应一个kiocb结构体P:异步操作不耑要修改文件的位置,所以非指针/初始化异步读可能函数返回前不结束读取操作,如果这个方法为 NULL,则所有操作右同步代替进行ssize_t(*write)(struct file *filp, char _user * buffer, si

4、zei_t size, loff_t *ppos);/同步写filp:文件结构指针buffer:写入信息缓冲size:写入长度ppos:当前偏移值,通常用来判断文件是否越界ssize_t(*aio_write)(struct kiocb *, const _char_user *1buffer,sizesize, loff_t ppos);/异步写参数股理同aio_read()函数; int (*readdir)(struct file *filp, void filldir_t);对于设备文件此方法应为空,它用来读取目录,仅对文件系统有效 unsigned int (*poll)(struc

5、t flip *, struct poll_table_struct *);设备轮询函数,第一个参数是file指针,第二个参数是轮询表指针 用于获取设备资源状态,POLLIN, POLLOUT, POLLPRI, POLLERR, POUNVAL等宏的位“或”结果int (*ioctl)(struct inode *inode, struct file*filp, unsigned int cmd, unsigned arg);inode和filp :指针对应应用程序传递文件描述符fs的值,和传递给open方法的相同参数cmd :从用户那里传下来,或者参数arg以一个unsigned long

6、 形式传递,arg :可选参数,如果调用程序部传递它,那被驱动程序操作的 arg值无意义作用解决特殊命令的方法int(*mmap)(struct file *,struct vm_area_struct *);用来请求将设备内存映射到进程的地址空间 int(*open)(struct inode *inode,struct file *filp);inode :文件结点,无论打开多少个文件,都只是对应一个结点 filo:只要打开一个文件,就对应着一个file结构。如果此方法为NULL,设备打幵一直成功,但是驱动程序得不到通知int(*release)(struct inode struct f

7、ile *);与openG方法对应,当最后一个打开的进程执行close()系统调用吋, 内核将调用驱动程序releaseO函数int (*flush)(struct file *);此方法在进程关闭它的设备文件描述符的拷贝时调用,以等待设备 完成操作,此方法在驱动中很少用,SCSI磁带驱动使用,以确保在 关闭前把所有的数据写到磁带上int (*synch)(struct file struct dentry *,int datasync);刷新待处理的数据,允许进程吧所有脏缓存刷新到磁盘int (*aio_fsync)(struct kiocb *,int);异步刷新待处理的数裾int (*l

8、ock)(struct file *, int struct file_lock *);用于实现文件加锁,用于常规文件,设备文件不用此方法ssize_t(*readv)(struct file *, const struct iovec *, unsiged long, loff_t *);ssize_t(*writev)(struct file *z const struct iovec *, unsiged long, loff_t *);用于实现发散/汇聚读或写,有时需要做一个包含多个内存区的单个 读或写操作,而不必对数据进行额外拷W,如果此方法为NULL, read 和write方法可

9、能多一次被调用ssize_t(*sendfile)(struct file*, loff_t *, size_t,read_actor_t,void *);使得系统读,用最少的拷贝从一个文件描述符搬移数据到另一个ssize_t(*sendpage)(struct file *, struct page *, int, size_t, loff_t *, int);由内核发送数据,一次一页,设备驱动不用实现此方法 驱动程序不涉及sendfile()和sendpage()方法unsigned long (*get_unmapped_area)(struct file *, unsigned lon

10、g, unsined long, unsined long, unsined long);在进程控件找一个合适的位置来映射底层设备上的内存段,通常 用于内存管理代码进行,是驱动强制特殊设备可能有的任何对齐 请求,大部分可以设置为NULLint (*cheke_flags)(int);用于允许模块检查传递给fnctl(F_SETFL.)调用标志int (*dir_notify)(struct file *, unsigned long);应用程序使用fcntl来请求目录改变通知,对文件系统有效;(2) file文件结构这里的file和应川程序的FILE指针不同,FILE是用户层,file是内核控

11、件数据结构。file结构体指示一个己经 被打开的文件,及每打开一个文件在内核中都有一个struct file结构体与之对应,直至文件被关闭,内核才会 才释放file结构,在内核中可以用(本身)file或者(指针)filpfmode_t f_mode :此文件模式通过FMODE_READ,FMODE_WRITE识别文件为可读,可写的,在open或ioctl方法中可能需 检查此域确认文件的读写,自己不必直接去检查读写权限,内核ioctl本身自动就检测loff_t f_pos :当前读写文件的位置。为64位,可以通过它知道当前文件的位置,驱动程序可以读但是不应更改它 对于read和write来说,l

12、off_t型指针作为最后一个参数,用来更新文件的位罝,而不需要执行filp-f_pos 而llseek的方法就是用它来改变文件的位置。unsigned int f一flags:文件标志,如O_RDONLY, O_NONBLOCK, O_SYNC。在驱动中检查O_NONBLOCK标志查看是否有非肌塞 请求,在读写权限检查时使用f_mode而不是f_flog。struct file_operations *fop:与文件相关的各种操作。void *private_data :在系统调用open时没置此指针为NULL,可以自由的将其作为自己需要的数据域或者不管它,但是在 file_operation

13、s被内核销毁之前的release发放中释放这些数据内存空间。此指针在系统调用期间保存各种 状态信息是非常有用的(3) 、inode 结构内核使用inode结构体在内核部分表示一个文件。我们可以用多个file文件结构表示同一个文件的多个文 件描述符,但是所有的file都得指向同一个inode结构体,inode包含信息众多,就驱动而言只要关注两 个域。dev t i_rdev:表示设备文件的结点,实际包含了设备号struct cdev *i_cdev:struct cdev是内核的内部结构。它用来表示字符设备,当inode结点指叫字符设备文件时,此域为一个指 向inode结构的指针unsigned int iminor(struct *inode);内核提供的次获取主设备号。 unsigned int imajor(struct *inode);内核提供的宏获取次设备号。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号