cat proc/version在内核中是如何实现的?
2011-09-23 22:31
295 查看
proc/version
平时的时候我们都在用cat /proc/version来获得我们内核的版本号,但是是如何产生的呢?let's see see fs/proc/version.c。
如此简单的文件在内核中很少见,有木有!!Too young to simple, 有木有!
这里看到show,是不是紧张了,现在就看看这些值是哪里赋值的。来看include/linux/utsname.h
在utsname中有一个nsproxy。这个在kernel/nsproxy中定义了uts_ns
看到了所使用的uts_ns了吧,在init/version.c中
所以我们在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来获得我们内核的版本号,但是是如何产生的呢?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!
相关文章推荐
- cat proc/version在内核中是如何实现的?
- cat proc/version在内核中是如何实现的?
- cat proc/version在内核中是如何实现的?
- linux内核是如何实现分页机制的
- 教你如何实现在原系统上编译升级新内核的编译
- 如何将 Linux 内核实现的红黑树 rbtree 运用到你的 C 程序中?
- 如何将 Linux 内核实现的红黑树 rbtree 运用到你的 C 程序中?
- 内核里面writel(readl)是如何实现的
- 内核里面writel是如何实现的
- linux 使用/proc文件系统 实现用户空间与内核模块之间通信
- ioctl是如何实现用户态向内核传参的
- PHP内核探索 —— 变量概述:变量在PHP的内部如何实现
- 忙里偷闲 教你如何通过修改android内核实现root
- 内核和用户空间共享内存的实现例程-proc和mmap
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何实现开平方的Pow函数
- PHP内核中是如何实现 empty, isset 这些函数的?
- C# winform webbrowser如何指定内核为IE11? 输出 this.webbrowser.Version 显示版本是IE11的,但实际版本不是啊! 网上打的修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULA
- 如何实现内核休眠
- 如何实现内核旁路(Kernel bypass)?
- 使用proc文件映射的方式实现用户态跟内核态的数据交互