Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1246400
  • 博文数量: 105
  • 博客积分: 127
  • 博客等级: 入伍新兵
  • 技术积分: 962
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-29 15:22
文章分类

全部博文(105)

文章存档

2021年(1)

2019年(3)

2018年(1)

2017年(11)

2016年(47)

2015年(32)

2014年(4)

2012年(6)

我的朋友

分类: 嵌入式

2017-07-05 20:11:12

平时的时候我们都在用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这个文件。

阅读(2701) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~