?设备文件通常位于/dev目录下:
crw-rw-rw- 1 root root 5, 0 2020-04-17 18:51 tty
crw-rw---- 1 radio radio 237, 3 2020-04-17 18:51 ttyC0
crw-rw---- 1 radio radio 237, 7 2020-04-17 18:51 ttyC1
?其中c表示字符设备。在现在的Linux系统中,设备文件通常是自动创建的,但我们还是可以通过mknod命令手动创建一个设备文件:
# mknod /dev/vser0 c 256 0
# ls -li /dev/vser0
46347 crw-rw---- 1 root root 256, 0 2020-04-19 17:36 /dev/vser0
?mknod命令创建了一个节点,在Linux中一个节点代表一个文件,创建一个文件的最主要的工作就是分配一个新的节点(node),包含节点号(46347唯一)的分配。以ext2文件系统为例:
/*fs/ext2/ext2.h*/
/*
* Structure of an inode on the disk
*/
struct ext2_inode {
__le16 i_mode; /* File mode */
__le16 i_uid; /* Low 16 bits of Owner Uid */
__le32 i_size; /* Size in bytes */
__le32 i_atime; /* Access time */
__le32 i_ctime; /* Creation time */
__le32 i_mtime; /* Modification time */
......
__le32 i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
......
};
?inode成员结构在上面的结构里做了表述,在/fs/ext2/inode.c中:
static int __ext2_write_inode(struct inode *inode, int do_sync) {
struct ext2_inode *raw_inode = ext2_get_inode(sb, ino, &bh); //获得一个要写入磁盘的ext2_inode结构,并初始化了部分成员。
}
?同理,目录本身也是一个文件,在fs/ext2/ext2.h也有struct ext2_dir_entry
结构来描述目录。
?mknod的执行,将文件名、文件类型和主、次设备号等信息保存在了磁盘上。
?对字符设备来说,设备号、cdev和file_operations至关重要,内核找到路径名对应的inode后,要和驱动建立连接,首先要做的就是根据inode中的设备号找到cdev,然后根据cdev找到file_operations集合。
原文:https://www.cnblogs.com/hansenn/p/12738162.html