首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 系统运维 >

一场由mknod挑动的扯淡

2012-11-10 
一场由mknod引发的扯淡我们注册完字符、块驱动设备后,一般会用mknod去建立,应用层与驱动的管道。例如mtd的字

一场由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,去查找字符驱动的表(其实是一个数组),然后就能定位到相应的驱动设备的操作。


本人水平有限,有些不足或者错误之处还望多多指出


热点排行