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!

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
  • 516

Linux中命令cat /proc/meminfo读出的内核信息进行解释

linux free命令
  • zxygww
  • zxygww
  • 2015年09月25日 11:14
  • 3165

Linux OS下,你真的读懂了cat /proc/cpuinfo 吗?

我们知道linux下查看cpu信息可以用 cat /proc/cpuinfo 指令。 最近需要给程序加速,开openmp。开openmp之前需要了解以下知识。 but,你真的读懂了 cat ...
  • dongfang1984
  • dongfang1984
  • 2016年12月23日 16:46
  • 824

caffe安装系列——安装NVIDIA显卡驱动

说明 网上关于caffe的安装教程非常多,但是关于每一步是否操作成功,出现了什么样的错误又该如何处理没有给出说明。因为大家的操作系统的环境千差万别,按照博客中的教程一步步的安装,最后可能失败——这是很...
  • xuezhisdc
  • xuezhisdc
  • 2015年09月24日 10:40
  • 9282

通过/proc查看Linux内核态调用栈来定位问题

前几天碰到一个问题:一个进程运行过程中挂死了,把gdb挂上去之后bt打印的内容为空,后来通过查看 /proc 文件系统,查看程的调用栈,才发现是发消息给内核态程序时,内核态一直没有响应,导致用户态进程...
  • hintonic
  • hintonic
  • 2014年01月08日 17:25
  • 5918

Linux内核和用户空间通信的方式(一)— proc文件和mmap共享内存

动态的将内核空间的物理地址和大小传给用户空间。本文也演示了内核空间和用户空间进行通信可以使用的两种常用方法:proc文件系统和mmap共享内存。 整个内核模块,在模块插入时建立proc文件,分配内存...
  • CaspianSea
  • CaspianSea
  • 2014年11月05日 00:19
  • 1781

用户空间与内核空间的接口:proc文件系统

最早在接触Linux BSP时,项目中有一项规格就是底层需向上层提供硬件PCB及BOM信息。由于在Linux的根文件系统/proc目录下有硬件CPU、内存、存储器等与硬件相关的信息,并且在用户空间通过...
  • u014255998
  • u014255998
  • 2014年05月26日 10:04
  • 619

linux驱动——cmdline原理及利用

最近项目中想要内核qi
  • sgmenghuo
  • sgmenghuo
  • 2014年11月18日 19:25
  • 2549

cat /proc/cpuinfo 引发的思考--CPU 物理封装-物理核心-逻辑核心-超线程之间关系

cat /proc/cpuinfo 引发的思考--CPU 物理封装 物理核心 逻辑核心 超线程之间关系
  • hittata
  • hittata
  • 2015年08月18日 19:31
  • 2425

/proc/mtd 各个参数含义 -- linux内核

通过/proc虚拟文件系统读取MTD分区表:cat /proc/mtd mtd .name = raspi, .size = 0x00400000 (4M) .erasesize = 0x000...
  • ccy365263452
  • ccy365263452
  • 2014年10月29日 15:38
  • 3865
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cat proc/version在内核中是如何实现的?
举报原因:
原因补充:

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