我正在学习Linux设备驱动程序,并陷入了主要的小数字。 我到目前为止是:
设备通过文件系统中的名称进行访问。 这些名称被称为文件系统的特殊文件或设备文件或inode。
并且每个设备文件都与MAJOR和MInor号码捆绑在一起,并且与dev_ttypes相关联。
这些数字通过函数register_chrdev_region分配给设备
有些问题还困扰着我…
fgets():通过控制台确定,坏了pipe道
有没有办法以编程方式检查是否连接了Mac或PC键盘?
C / C ++ Linux:将最大的固定内存块写入文件(1 Hz)
不是全局命名空间的成员?
当我们初始化像cdev_init(&c_dev,&fops);这样的设备时, fops结构是否连接到设备文件的文件结构的f_ops字段cdev_init(&c_dev,&fops); ?
如何open("/dev/mydev",O_RONLY);一个调用open("/dev/mydev",O_RONLY); 实际上调用驱动程序的open()函数。 数字是否来自这里的图片find设备驱动程序的实际写入方法,如果是的话,怎么样?
数字主要用于识别设备驱动程序和次要设备文件。 当我们在设备文件(如open() read() write()等read()上执行操作时,这个数字的实际作用是什么?
Python将0写入文件
Windows硬盘实时复制
有没有IcopyHook.copyCallback文件或替代它?
在Windows上的C目录中find最旧的文件
我想这个故事应该从你输入的内容开始:
mknod /dev/c83 c 8 3
它将调用ext2_mknod(“/ dev”,“c83”,CHAR,DEV(8,3)),大多数文件系统将mknod作为init_special_inode的包装:
void init_special_inode(struct inode *inode,umode_t mode,dev_t rdev) { inode->i_mode = mode; if (S_ISCHR(mode)) { inode->i_fop = &def_chr_fops; inode->i_rdev = rdev; } else if (S_ISBLK(mode)) { inode->i_fop = &def_blk_fops; inode->i_rdev = rdev; } else if (S_ISFIFO(mode)) inode->i_fop = &def_fifo_fops; else if (S_ISSOCK(mode)) inode->i_fop = &bad_sock_fops; else printk(KERN_DEBUG "init_special_inode: bogus i_mode (%o)n",mode); }
当你最后调用open(“/ dev / c83”)时,它将进入函数def_chr_fops.chrdev_open,它将用你在cdev_init()中注册的fops代替文件“/ dev / c83”的fops。
int chrdev_open(struct inode * inode,struct file * filp) { struct cdev *p; ... p = inode->i_cdev; ... filp->f_op = fops_get(p->ops); ... if (filp->f_op->open) { lock_kernel(); ret = filp->f_op->open(inode,filp); unlock_kernel(); } ... return ret; }
之后,每个系统调用(如读/写/关闭)直接转到注册在cdev_init()中的函数指针!
所以,对于你的第一个问题:
是的,正如你在chrdev_open()中看到的那样。
是的,因为设备的fops与在cdev_init中注册的相同
在open()中起着重要的作用,因为open()使用pair来查找正确的设备驱动程序。 但在此之后,其他文件操作(例如read / write / close())不再参与,所有内容都通过在open()中解析的fops中的函数指针。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。