mount -t devtmpfs
有趣的是,在现代系统中,/dev
通常是文件系统类型,可以在所需的任何位置挂载。Ubuntu 16.04:
mkdir d
sudo mount -t devtmpfs none d
head -c 10 d/random
sudo umount d
该功能由启用CONFIG_DEVTMPFS=y
,并允许内核本身根据需要创建和销毁设备文件。
CONFIG_DEVTMPFS_MOUNT=y
此选项使内核在上自动挂载devtmpfs /dev
。
drivers/base/Kconfig
文件:
config DEVTMPFS_MOUNT
bool "Automount devtmpfs at /dev, after the kernel mounted the rootfs"
depends on DEVTMPFS
help
This will instruct the kernel to automatically mount the
devtmpfs filesystem at /dev, directly after the kernel has
mounted the root filesystem. The behavior can be overridden
with the commandline parameter: devtmpfs.mount=0|1.
This option does not affect initramfs based booting, here
the devtmpfs filesystem always needs to be mounted manually
after the rootfs is mounted.
With this option enabled, it allows to bring up a system in
rescue mode with init=/bin/sh, even when the /dev directory
on the rootfs is completely empty.
file_operations
最后,您应该创建自己的字符设备内核模块,以查看发生了什么。
这是一个最小的可运行示例:了解字符设备(或字符特殊)文件
最重要的步骤是设置file_operations
结构,例如:
static const struct file_operations fops = {
.owner = THIS_MODULE,
.read = read,
.open = open,
};
static int myinit(void)
{
major = register_chrdev(0, NAME, &fops);
return 0;
}
其中包含为每个与文件相关的系统调用而调用的函数指针。
很明显,您可以覆盖那些与文件相关的系统调用以执行所需的任何操作,因此内核就是这样实现设备的/dev/zero
。
/dev
自动创建条目,无需mknod
最后一个谜是内核如何自动创建/dev
条目。
可以通过制作一个自己执行的内核模块来观察该机制,如下所示:https : //stackoverflow.com/questions/5970595/how-to-create-a-device-node-from-the-init-module- linux-kernel-module / 45531867#45531867代码,然后进行device_create
通话。