加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

cat proc/version在内核中是如何达成的?

发布时间:2021-12-22 11:36:32 所属栏目:PHP教程 来源:互联网
导读:proc/version 平时的时候我们都在用cat /proc/version来获得我们内核的版本号,但是是如何产生的呢?lets 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,

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

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读