继续上一篇的分析,我们在使用命令: mknod /dev/my_chr_dev0 c $major 0 创建设备文件的时候,内核做了哪些事呢?可以肯定的一点是,内核肯定创建了一个 inode 结构体,并加入到系统里面,要不然在打开设备文件的时候,会因为lookup_fast()函数找不到相应的 inode,从而使得打开失败。也许你会说,lookup_fast()函数失败了,还有lookup_slow()函数呢?这里因为是特殊文件,情况有所不同,如果lookup_fast()函数失败了,那么就会导致打开失败,不会在lookup_slow()函数里面动态创建 inode,而创建inode的工作其实是在 mknod 系统调用里面完成的。下面来简单分析其具体过程。
首先通过 strace 来查看下系统调用的传入参数:
strace -o syscall mknod /dev/test c 243 0
结果如下:
...
mknod("/dev/test", S_IFCHR|0666, makedev(243, 0)) = 0
...
好了,现在来看下内核里面关于 mknod 系统调用的定义,在 source/fs/namei.c 文件中(Linux所有系统调用都是通过宏 SYSCALL_DEFINEn 定义的,关于这个宏的详细说明,参考这里):
SYSCALL_DEFINE3(mknod, const char __user *, filename, umode_t, mode, unsigned, dev)
{
return sys_mknodat(AT_FDCWD