一场由mknod引发的扯淡
我们注册完字符、块驱动设备后,一般会用mknod去建立,应用层与驱动的管道。例如mtd的字符驱动,我们会用mknod /dev/mtdchar1 c 30 0,创建/dev/mtdchar1来映射mtd第一个字符设备。
由于代码没法红字,代码中有color:#ff6666 开头的行数,为重点分析的
接下来我们用代码来分析,这个过程。
第一个函数asmlinkage long sys_mknod(const char __user *filename, int mode, unsigned dev) //在fs/namei.c里,filename就是所创建的路径:/dev/mtdchar1,mode: S_IFCHR | S_IRUSR | S_IWUSR,这个意思是可读可写的字符特殊文件;dev为设备号,主设备号跟次设备号的结合体。
上面那个函数没什么可分析的,再下来进入 long sys_mknodat(int dfd, const char __user *filename, int mode,unsigned dev)
代码一:
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;elseprintk(KERN_DEBUG "init_special_inode: bogus i_mode (%o)\n", mode);}根据上面加红部分,可以看到驱动设备号已经跟inode关联起来的。mknod的使命也完成了。
最后:
一些废话:在sys_open打开这个文件时,open = f->f_op->open,会根据inode->i_rdev,去查找字符驱动的表(其实是一个数组),然后就能定位到相应的驱动设备的操作。
本人水平有限,有些不足或者错误之处还望多多指出