栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

【linux kernel】linux内核伪文件系统—proc分析

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【linux kernel】linux内核伪文件系统—proc分析

linux内核伪文件系统—proc分析

文章目录

linux内核伪文件系统—proc分析一、proc文件系统简介二、proc文件系统源码分析

(2-1)linux内核下的/proc文件系统如何创建条目(2-2)linux内核如何初始化/proc文件系统 三、总结

一、proc文件系统简介

首先/proc文件系统是一个接口,linux内核通过它可以获取一个linux系统上运行信息。很多用户空间程序都需要依靠/proc文件系统中的内容来完成它们的工作。如下图所示:

linux内核中运行的每一个用户进程都会由/proc文件系统中的一个对应条目代表。例如:1号线程init。他在/proc对应的条目则为1。可以使用:

ls -l /proc/1

得到init进程相关的条目:

linux系统中运行的用户进程都有对应的条目。对于这些信息,在开发过程中,就可以查看对应的条目,从而得到系统中运行进程的相关信息。

如果需要获取到init进程相关联的内存信息,则使用:

cat /proc/1/maps

如果需要获取init进程的状态信息,则使用:

cat /proc/1/status

如果需要获取系统中的处理器信息,可使用cpuinfo条目。

如果需要获取系统内存的统计信息,则使用meminfo条目。

如果需要获取linux内核版本的信息,则使用version条目。

对于/proc文件系统来说,其给出了许多关于linux内核运行过程中的信息(这里不一一列举啦)。其中有很多的信息条目值得仔细分析和学习。同样的,有很多的软件帮助我们提取/proc文件系统中的条目信息。例如:top、ps命令等。

通过修改/proc/sys目录下条目,可以动态更改内核参数或变量。

sysctl接口提供了动态更改某些内核参数和变量的方法,而不需要重新编译内核或重新引导系统。会在/proc/sys目录下生成一棵可修改的sysctl条目树。即修改该目录下的值可以动态的更改内核中的某些参数和变量。

二、proc文件系统源码分析

本小结将分析以下两个小问题:

(1)linux内核下的/proc文件系统如何创建条目?

(2)linux内核如何初始化/proc文件系统?

(2-1)linux内核下的/proc文件系统如何创建条目

/proc文件系统的源码位于(/fs/proc)目录下,如下图所示:

从Makefile文件可知,其大致的编译流程。从其目录的源文件组织结构,大致是与ls /proc命令下的条目相关联。l例如:/proc目录下有个version条目,则在源码目录结构下将有一个对应的version.c源文件。

(/fs/proc/version.c)

static const struct file_operations version_proc_fops = {
	.open		= version_proc_open,
	.read		= seq_read,
	.llseek		= seq_lseek,
	.release	= single_release,
};

static int __init proc_version_init(void)
{
	proc_create("version", 0, NULL, &version_proc_fops);
	return 0;
}
fs_initcall(proc_version_init);

(/include/linux/init.h)

#define __define_initcall(fn, id) 
	static initcall_t __initcall_##fn##id __used 
	__attribute__((__section__(".initcall" #id ".init"))) = fn; 
	LTO_REFERENCE_INITCALL(__initcall_##fn##id)

#define fs_initcall(fn)			__define_initcall(fn, 5)

从以上代码片段可见:version.c文件的写法与设备驱动编写类似:定义一个struct file_operations,并指定对应的callback,然后使用proc_create()创建version条目,最后使用fs_initcall()宏进行初始化。(注:其目录下的许多文件都有类似的程序结构和写法,大同小异)

(2-2)linux内核如何初始化/proc文件系统

​ /proc是一个文件系统,那么在linux内核源码中,就应该使用struct file_system_type来描述。其定义如下(/fs/proc/root.c):

static struct file_system_type proc_fs_type = {
	.name		= "proc",
	.mount		= proc_mount,
	.kill_sb	= proc_kill_sb,
	.fs_flags	= FS_USERNS_VISIBLE | FS_USERNS_MOUNT,
};

​ 在start_kernel()函数中将调用proc_root_init()函数来初始化/proc文件系统。

(/fs/proc/root.c)

void __init proc_root_init(void)
{
	int err;

    //初始化 proc的inode cache
	proc_init_inodecache();
	err = register_filesystem(&proc_fs_type);
	if (err)
		return;

	proc_self_init();
	proc_thread_self_init();
	proc_symlink("mounts", NULL, "self/mounts");

	proc_net_init();

#ifdef CONFIG_SYSVIPC
	proc_mkdir("sysvipc", NULL);
#endif
	proc_mkdir("fs", NULL);
	proc_mkdir("driver", NULL);
	proc_create_mount_point("fs/nfsd"); 
#if defined(CONFIG_SUN_OPENPROMFS) || defined(CONFIG_SUN_OPENPROMFS_MODULE)
	
	proc_create_mount_point("openprom");
#endif
	proc_tty_init();
	proc_mkdir("bus", NULL);
	proc_sys_init();
}

上述代码第7行,调用register_filesystem()函数向linux 内核注册/proc文件系统。

上面代码中多处调用proc_mkdir()函数创建对应的/proc下的条目((/fs/proc/generic.c)):

struct proc_dir_entry *proc_mkdir(const char *name,struct proc_dir_entry *parent)
{
	return proc_mkdir_data(name, 0, parent, NULL);
}

最后都将调用到共同的proc_mkdir_data()函数(/fs/proc/generic.c):

struct proc_dir_entry *proc_mkdir_data(const char *name, umode_t mode,
		struct proc_dir_entry *parent, void *data)
{
	struct proc_dir_entry *ent;

	if (mode == 0)
		mode = S_IRUGO | S_IXUGO;
	//创建proc下的目录节点
	ent = __proc_create(&parent, name, S_IFDIR | mode, 2);
	if (ent) {
		ent->data = data;
		ent->proc_fops = &proc_dir_operations;
		ent->proc_iops = &proc_dir_inode_operations;
		parent->nlink++;
        //将通过__proc_create()创建出的目录节点添加到父节点
		if (proc_register(parent, ent) < 0) {
			kfree(ent);
			parent->nlink--;
			ent = NULL;
		}
	}
	return ent;
}
三、总结

​ 本文没有过多分析proc文件系统背后的实现细节和机制。描述了在开发中,/proc文件系统下关于系统运行的信息条目;从源码的角度简单分析了/proc文件系统,描述了linux内核启动过程中是如何初始化/proc文件系统的。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/728851.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号