我正在学习Linux设备驱动程序并且卡在主要,次要号码上。到目前为止我所拥有的是:
通过文件系统中的名称访问设备。那些名字 被称为特殊文件或设备文件或文件的inode 系统
每个设备文件都与捆绑在dev_t
类型中的MAJOR和MINOR号码相关联。
register_chrdev_region
有些问题令我不安......
fops
结构是否与文件结构的f_ops
字段相关联
我们初始化cdev_init(&c_dev, &fops);
等设备时的设备文件?open("/dev/mydev", O_RONLY);
的来电如何实际调用open()
司机的功能。数字是否出现在这里
找到设备驱动程序的实际写入方法,如果是,如何?open()
read()
write()
等设备文件执行操作时?答案 0 :(得分:10)
我认为故事应该从你输入时发生的事情开始:
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: / p>
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;
}
之后,每次系统调用如read / write / close都会直接转到cdev_init()中注册的函数指针!
所以,对于你的第一个问题: