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


proc/version

平时的时候我们都在用cat /proc/version来获得我们内核的版本号,但是是如何产生的呢?let's see see fs/proc/version.c。
  1. static int version_proc_show(struct seq_file *m, void *v)  
  2. {  
  3.     seq_printf(m, linux_proc_banner,  
  4.         utsname()->sysname,  
  5.         utsname()->release,  
  6.         utsname()->version);  
  7.     return 0;  
  8. }  
  9.   
  10.   
  11. static int version_proc_open(struct inode *inode, struct file *file)  
  12. {  
  13.     return single_open(file, version_proc_show, NULL);  
  14. }  
  15.   
  16.   
  17. static const struct file_operations version_proc_fops = {  
  18.     .open       = version_proc_open,  
  19.     .read       = seq_read,  
  20.     .llseek     = seq_lseek,  
  21.     .release    = single_release,  
  22. };  
  23.   
  24.   
  25. static int __init proc_version_init(void)  
  26. {  
  27.     proc_create("version", 0, NULL, &version_proc_fops);  
  28.     return 0;  
  29. }  
  30. module_init(proc_version_init);  
如此简单的文件在内核中很少见,有木有!!Too young to simple, 有木有!
这里看到show,是不是紧张了,现在就看看这些值是哪里赋值的。来看include/linux/utsname.h
  1. static inline struct new_utsname *utsname(void)  
  2. {  
  3.     return ¤t->nsproxy->uts_ns->name;  
  4. }  
在utsname中有一个nsproxy。这个在kernel/nsproxy中定义了uts_ns
  1. struct nsproxy init_nsproxy = {  
  2.     .count  = ATOMIC_INIT(1),  
  3.     .uts_ns = &init_uts_ns,  
  4. #if defined(CONFIG_POSIX_MQUEUE) || defined(CONFIG_SYSVIPC)   
  5.     .ipc_ns = &init_ipc_ns,  
  6. #endif   
  7.     .mnt_ns = NULL,  
  8.     .pid_ns = &init_pid_ns,  
  9. #ifdef CONFIG_NET   
  10.     .net_ns = &init_net,  
  11. #endif   
  12. };  
看到了所使用的uts_ns了吧,在init/version.c中
  1. struct uts_namespace init_uts_ns = {  
  2.     .kref = {  
  3.         .refcount   = ATOMIC_INIT(2),  
  4.     },  
  5.     .name = {  
  6.         .sysname    = UTS_SYSNAME,  
  7.         .nodename   = UTS_NODENAME,  
  8.         .release    = UTS_RELEASE,  
  9.         .version    = UTS_VERSION,  
  10.         .machine    = UTS_MACHINE,  
  11.         .domainname = UTS_DOMAINNAME,  
  12.     },  
  13. };  
所以我们在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!

相关内容