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-に示されているように、自分でそれを行うカーネルモジュールを作成することで確認できます。 code-of-a-linux-kernel-module / 45531867#45531867をdevice_create
呼び出します。