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

来源:互联网 发布:c语言阶乘函数 编辑:程序博客网 时间:2024/06/04 17:52

平时的时候我们都在用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!


转载自:http://blog.csdn.net/skywalkzf/article/details/6806928

0 0
原创粉丝点击