在使用proc之前,我们必须首先初始化并挂载proc,并在内核内存中创建数据结构来描述文件系统。但是,不同的体系结构拥有不同的proc内容,所以,在初始化阶段并不完全创建子目录的内容,有些文件要等到系统运行时动态创建。Proc文件系统初始化的流程图如下:
proc_root_init的定义定义如下:
void __init proc_root_init(void)
{
int err = proc_init_inodecache();
err = register_filesystem(&proc_fs_type);
。。。
proc_mnt = kern_mount_data(&proc_fs_type, &init_pid_ns);
proc_misc_init();
proc_net_init();
。。。
proc_root_fs = proc_mkdir("fs", NULL);
proc_root_driver = proc_mkdir("driver", NULL);
proc_mkdir("fs/nfsd", NULL);
。。。
proc_bus = proc_mkdir("bus", NULL);
proc_sys_init();
}
int __init proc_init_inodecache(void):为proc_inode创建slab cache,这是proc文件系统的主要部分,通常需要快速创建或销毁。
int register_filesystem(struct file_system_type * fs):注册文件系统类型proc,这个过程是文件系统初始化的关键步骤,下边会专门解释这个步骤。
struct vfsmount *kern_mount_data(struct file_system_type *type, void *data)
{
return vfs_kern_mount(type, MS_KERNMOUNT, type->name, data);
}
vfs_kern_mount:创建与proc_fs_type相关的vfsmount结构,该函数在VFS中已有讲述。
proc_misc_init:创建/proc目录下的文件和子目录,每个文件的创建都由相应的函数来完成,例如:meminfo的创建由 create_proc_read_entry 创建,而meminfo_read_proc则用于初始化meminfo的read_proc函数。其实际的调用过程是:
void __init proc_misc_init(void)
{
static struct {
char *name;
int (*read_proc)(char*,char**,off_t,int,int*,void*);
} *p, simple_ones[] = {
{"loadavg", loadavg_read_proc},
{"uptime", uptime_read_proc},
{"meminfo", meminfo_read_proc},
{"version", version_read_proc},
。。。
{"filesystems", filesystems_read_proc},
{"cmdline", cmdline_read_proc},
{"execd

本文详细解析了Linux内核中proc文件系统的初始化过程,包括proc_init_inodecache、register_filesystem、proc_misc_init等关键步骤。介绍了如何创建proc的根目录、子目录以及相关文件,如/proc/fs、/proc/driver等,以及如何通过create_proc_read_entry和create_seq_entry创建只读和可读写文件。此外,还探讨了proc_get_sb和proc_fill_super在获取super_block及初始化inode和dentry中的作用。
--proc初始化&spm=1001.2101.3001.5002&articleId=4958169&d=1&t=3&u=c8eaff51ef2a4c04ac0722e53a2de6e2)
159

被折叠的 条评论
为什么被折叠?



