file:(成员不完全)
cdev:
inode:(成员不完全)
file,cdev,inode之间的关系:
整体关系(应用,glib,内核VFS,文件层):
首先(cdev):
驱动先装载,注册字符设备(主设备号,fops结构体等),把字符设备存到链表中,提供查找。
然后(inode):
mknod函数创建设文件“dev/led”,创建后文件自动分配一个inode节点(有主次设备号),存在文件系统当中。
最后(应用)open(***)时通过“dev/led”路径,(应用->文件层)找到inode节点,即找到设备号。遍历链表的cdev.
遍历链表的cde v后从链表找到对应驱动的cdev,调用cdev(cdev->fop->open)执行open函数,(open->led_drv_open)操作硬件。
最后(file):
应用open是产生一个struct file.(fd_table表格)
struct file中 f_op
将cdev中的fops赋值给struct file的f_op.如果应用open,write,read,都要遍历查找cdev.很耗时间。所以为了避免多次查找,将cdev中的fops赋值给struct file保存起来 ,当调用write,read时根据文件描述符找到struct file的f_op。
然后f_op调用cdev中的fops.