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

转载 2015年07月07日 15:14:27

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

举报

相关文章推荐

linux 中/proc 详解

Linux-proc      proc 文件系统   在Linux中有额外的机制可以为内核和内核模块将信息发送给进程-- /proc 文件系统。最初设计的目的是允许更方便的对进程...

字符设备驱动之/proc/devices和/dev的关系

/proc/devices/下的设备是驱动程序生成的,它可产生一个major供mknod作为参数。  /dev/下的设备是通过mknod加上去的,用户通过此设备名来访问驱动。 The fo...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

/proc/devices和/dev的关系

/proc/devices/下的设备是驱动程序生成的,它可产生一个major供mknod作为参数。  /dev/下的设备是通过mknod加上去的,用户通过此设备名来访问驱动。 The follow...

安卓使用cat查看proc下文件帮助

cat boot_mode 查看cpu版本 cat cmdline cat cpuinfo 查看cup详细信息 cat devices cat diskstats cat dma-mappings c...

Linux cat命令详解

cat命令是linux下的一个文本输出命令,通常是用于观看某个文件的内容的; cat主要有三大功能: 1.一次显示整个文件。 $ cat   filename 2.从键盘创建一个文件。 $ ...

cat /proc/interrupts, cat /proc/stat

------------------>Part 1: cat /proc/interrupts 文件/proc/interrupts是中断报告文件,可以查看中断发生的次数。 Linux内核通常...

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

proc/version 平时的时候我们都在用cat /proc/version来获得我们内核的版本号,但是是如何产生的呢?let's see see fs/proc/version.c。 ...

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

平时的时候我们都在用cat /proc/version来获得我们内核的版本号,但是是如何产生的呢?let's see see fs/proc/version.c。 static int ...
  • l_nan
  • l_nan
  • 2015-09-01 21:15
  • 438

在spring MVC和hibernate项目中如何实现hibernate的session在请求发起时开启数据渲染后自动关闭

对于才接触hibernate的初学者来说可能会遇到的一个问题就是hibernate的session的管理问题,简单举一个列子,假设一个电商网站,我要读取产品信息,用户发起请求后我们后台去数据库查询产品...

32 整数在内存中是如何存储的

整数在内存中是如何存储的
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)