Linux 系统调用之 mknod

本文探讨了Linux系统调用mknod在创建设备文件时的内核处理流程,包括创建inode和dentry的过程。通过strace观察参数传递,详细分析了dentry和inode的创建,特别是inode中设备号的保存以及如何通过设备号找到对应的文件操作函数集。此外,还提到了文件操作函数集def_chr_fops和chrdev_open在字符驱动文件操作中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

继续上一篇的分析,我们在使用命令: 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, filename, mode, dev);
}

好了,来看 sys_mknodat 的定义

SYSCALL_DEFINE4(m
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值