平时的时候我们都在用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这个文件。
阅读(2691) | 评论(0) | 转发(0) |