您的位置:首页 > 其它

cat proc/version在内核中是如何实现的?

2011-09-23 22:31 295 查看
proc/version

平时的时候我们都在用cat /proc/version来获得我们内核的版本号,但是是如何产生的呢?let's see see fs/proc/version.c。

static int version_proc_show(struct seq_file *m, void *v)
{
	seq_printf(m, linux_proc_banner,
		utsname()->sysname,
		utsname()->release,
		utsname()->version);
	return 0;
}

static int version_proc_open(struct inode *inode, struct file *file)
{
	return single_open(file, version_proc_show, NULL);
}

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;
}
module_init(proc_version_init);


如此简单的文件在内核中很少见,有木有!!Too young to simple, 有木有!

这里看到show,是不是紧张了,现在就看看这些值是哪里赋值的。来看include/linux/utsname.h

static inline struct new_utsname *utsname(void)
{
	return ¤t->nsproxy->uts_ns->name;
}


在utsname中有一个nsproxy。这个在kernel/nsproxy中定义了uts_ns

struct nsproxy init_nsproxy = {
	.count	= ATOMIC_INIT(1),
	.uts_ns	= &init_uts_ns,
#if defined(CONFIG_POSIX_MQUEUE) || defined(CONFIG_SYSVIPC)
	.ipc_ns	= &init_ipc_ns,
#endif
	.mnt_ns	= NULL,
	.pid_ns	= &init_pid_ns,
#ifdef CONFIG_NET
	.net_ns	= &init_net,
#endif
};


看到了所使用的uts_ns了吧,在init/version.c中

struct uts_namespace init_uts_ns = {
	.kref = {
		.refcount	= ATOMIC_INIT(2),
	},
	.name = {
		.sysname	= UTS_SYSNAME,
		.nodename	= UTS_NODENAME,
		.release	= UTS_RELEASE,
		.version	= UTS_VERSION,
		.machine	= UTS_MACHINE,
		.domainname	= UTS_DOMAINNAME,
	},
};


所以我们在version_proc_show中看到的utsname中使用了version等等。

言归正传,看看init_uts_ns中的UTS_VERSION的定义,where?

在kernel/include/generated/compile.h中,看到这里去找文件,( ⊙ o ⊙ )啊!,怎么没有你说的??稍等,继续往下看。

在kernel/scripts/mkcompile_h文件中呢,这里都是用脚本来生成的compile.h这个文件。

到了这里呢,所有在proc/version能看到的东西都找到了,所以kernel开放给你了,找找总会找到的。

Have Fun!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: