cat proc/version在内核中是如何实现的?
2014-10-14 16:51
211 查看
http://blog.csdn.net/skywalkzf/article/details/6806928
proc/version
平时的时候我们都在用cat /proc/version来获得我们内核的版本号,但是是如何产生的呢?let's see see fs/proc/version.c。
[cpp]
view plaincopy
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
[cpp]
view plaincopy
static inline struct new_utsname *utsname(void)
{
return ¤t->nsproxy->uts_ns->name;
}
在utsname中有一个nsproxy。这个在kernel/nsproxy中定义了uts_ns
[cpp]
view plaincopy
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中
[cpp]
view plaincopy
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!
proc/version
平时的时候我们都在用cat /proc/version来获得我们内核的版本号,但是是如何产生的呢?let's see see fs/proc/version.c。
[cpp]
view plaincopy
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
[cpp]
view plaincopy
static inline struct new_utsname *utsname(void)
{
return ¤t->nsproxy->uts_ns->name;
}
在utsname中有一个nsproxy。这个在kernel/nsproxy中定义了uts_ns
[cpp]
view plaincopy
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中
[cpp]
view plaincopy
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!
相关文章推荐
- cat proc/version在内核中是如何实现的?
- cat proc/version在内核中是如何实现的?
- cat proc/version在内核中是如何实现的?
- 内核和用户空间共享内存的实现例程-proc和mmap
- 内核里面writel(readl)是如何实现的
- 利用proc 实现内核和用户态交换数据
- 内核和用户空间共享内存的实现例程-proc和mmap(zt)
- 内核和用户空间共享内存的实现例程-proc和mmap
- PHP内核探索 —— 变量概述:变量在PHP的内部如何实现
- 内核和用户空间共享内存的实现例程-proc和mmap
- Linux中命令cat /proc/meminfo读出的内核信息进行解释
- 使用proc文件映射的方式实现用户态跟内核态的数据交互
- 如何使用proc文件系统让用户空间和内核空间进行交互
- PHP内核探索 —— 变量的类型:PHP弱类型变量特性是如何实现?
- 如何通过sysfs或proc将内核参数显示和更新
- 教你如何实现在原系统上编译升级新内核的编译
- 内核和用户空间共享内存的实现例程-proc和mmap
- 如何将 Linux 内核实现的红黑树 rbtree 运用到你的 C 程序中?
- Linux系统中,有两个文件file1和file2,每个文件的每一行都是#UUID,其中的每一UUID表示一个号。要找出在file1中有而在file2中没有的UUID,使用cat,sort,uniq三个命令如何实现
- 利用proc 实现内核和用户态交换数据