• 在使用linux的时候,我们使用cat /proc/version命令来获得我们内核的版本号,但是是如何产生的呢? 请看内核源码中的fs/proc/version.c文件: #include <linux/fs.h> #include <linux/init....

    在使用linux的时候,我们使用cat /proc/version命令来获得我们内核的版本号,但是是如何产生的呢?

    请看内核源码中的fs/proc/version.c文件:

    #include <linux/fs.h>
    #include <linux/init.h>
    #include <linux/kernel.h>
    #include <linux/proc_fs.h>
    #include <linux/seq_file.h>
    #include <linux/utsname.h>
    
    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;
    }
    fs_initcall(proc_version_init);
    

    这里有个version_proc_show函数,继续跟踪代码----->include/linux/utsname.h:

    static inline struct new_utsname *utsname(void)
    {
    	return &current->nsproxy->uts_ns->name;
    }

    在utsname中有一个nsproxy。这个在kernel/nsproxy.c中定义。其中,有一个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_for_children	= &init_pid_ns,
    #ifdef CONFIG_NET
    	.net_ns			= &init_net,
    #endif
    };

    继续搜索init_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,
    	},
    	.user_ns = &init_user_ns,
    	.ns.inum = PROC_UTS_INIT_INO,
    #ifdef CONFIG_UTS_NS
    	.ns.ops = &utsns_operations,
    #endif
    };

    nit_uts_ns中使用的UTS_VERSION的定义在哪里定义的呢?

    搜索,发现在内核源码目录的/include/generated/compile.h中:

    当发现没有的时候,可以查看一下内核源码目录的/scripts/mkcompile_h文件:

    #!/bin/sh
    
    TARGET=$1
    ARCH=$2
    SMP=$3
    PREEMPT=$4
    RT=$5
    CC=$6
    
    vecho() { [ "${quiet}" = "silent_" ] || echo "$@" ; }
    
    # If compile.h exists already and we don't own autoconf.h
    # (i.e. we're not the same user who did make *config), don't
    # modify compile.h
    # So "sudo make install" won't change the "compiled by <user>"
    # do "compiled by root"
    
    if [ -r $TARGET -a ! -O include/generated/autoconf.h ]; then
      vecho "  SKIPPED $TARGET"
      exit 0
    fi
    
    # Do not expand names
    set -f
    
    # Fix the language to get consistent output
    LC_ALL=C
    export LC_ALL
    
    if [ -z "$KBUILD_BUILD_VERSION" ]; then
    	if [ -r .version ]; then
    		VERSION=`cat .version`
    	else
    		VERSION=0
    		echo 0 > .version
    	fi
    else
    	VERSION=$KBUILD_BUILD_VERSION
    fi
    
    if [ -z "$KBUILD_BUILD_TIMESTAMP" ]; then
    	TIMESTAMP=`date`
    else
    	TIMESTAMP=$KBUILD_BUILD_TIMESTAMP
    fi
    if test -z "$KBUILD_BUILD_USER"; then
    	LINUX_COMPILE_BY=$(whoami | sed 's/\\/\\\\/')
    else
    	LINUX_COMPILE_BY=$KBUILD_BUILD_USER
    fi
    if test -z "$KBUILD_BUILD_HOST"; then
    	LINUX_COMPILE_HOST=`hostname`
    else
    	LINUX_COMPILE_HOST=$KBUILD_BUILD_HOST
    fi
    
    UTS_VERSION="#$VERSION"
    CONFIG_FLAGS=""
    if [ -n "$SMP" ] ; then CONFIG_FLAGS="SMP"; fi
    if [ -n "$PREEMPT" ] ; then CONFIG_FLAGS="$CONFIG_FLAGS PREEMPT"; fi
    if [ -n "$RT" ] ; then CONFIG_FLAGS="$CONFIG_FLAGS RT"; fi
    UTS_VERSION="$UTS_VERSION $CONFIG_FLAGS $TIMESTAMP"
    
    # Truncate to maximum length
    
    UTS_LEN=64
    UTS_TRUNCATE="cut -b -$UTS_LEN"
    
    # Generate a temporary compile.h
    
    ( echo /\* This file is auto generated, version $VERSION \*/
      if [ -n "$CONFIG_FLAGS" ] ; then echo "/* $CONFIG_FLAGS */"; fi
    
      echo \#define UTS_MACHINE \"$ARCH\"
    
      echo \#define UTS_VERSION \"`echo $UTS_VERSION | $UTS_TRUNCATE`\"
    
      echo \#define LINUX_COMPILE_BY \"`echo $LINUX_COMPILE_BY | $UTS_TRUNCATE`\"
      echo \#define LINUX_COMPILE_HOST \"`echo $LINUX_COMPILE_HOST | $UTS_TRUNCATE`\"
    
      echo \#define LINUX_COMPILER \"`$CC -v 2>&1 | grep ' version '`\"
    ) > .tmpcompile
    
    # Only replace the real compile.h if the new one is different,
    # in order to preserve the timestamp and avoid unnecessary
    # recompilations.
    # We don't consider the file changed if only the date/time changed.
    # A kernel config change will increase the generation number, thus
    # causing compile.h to be updated (including date/time) due to the
    # changed comment in the
    # first line.
    
    if [ -r $TARGET ] && \
          grep -v 'UTS_VERSION' $TARGET > .tmpver.1 && \
          grep -v 'UTS_VERSION' .tmpcompile > .tmpver.2 && \
          cmp -s .tmpver.1 .tmpver.2; then
       rm -f .tmpcompile
    else
       vecho "  UPD     $TARGET"
       mv -f .tmpcompile $TARGET
    fi
    rm -f .tmpver.1 .tmpver.2

    compile.h是由该脚本来生成的。每次重新编译内核,都会生成一个新的compile.h文件,要修改UTS_VERSION等参数,我们可以直接修改该脚本或者是compile.h文件即可。

    展开全文
  • Linux kernel 版本说明 2018-06-29 14:04:47
    下载地址:www.kernel.org第一列,版本性质:主分支(mainline),稳定版(stable),长期维护版(longterm)第二列,版本号。-rc表示非正式发布版本,[EOL]表示本分支最后一个版本。第三列,版本发布日期。patch列是补丁...
  • Linux kernel版本开发过程 2013-12-24 22:30:01
    来源:百度质量部 前言 Linux基金会在4月3日公布了Linux开发年报,向我们展示了linux kernel作为世上最大开源合作项目之一的...目前在Linus Torvalds的监督之下,Linux核心约2到3个月发布一个新的稳定版本,每次更
  • Android内核基于Linux kernel,需要知道Android系统的Linux kernel版本号,才能对其内核进行编译移植
  • kernel的官网上有三种版本,mainline,stable,longterm mainline是主线版本,最新的, stable是稳定版, longterm是长期支持版 进入linux kernel官网 https://www.kernel.org/ 找到stable,点击browse 点击...
  • Android和Linux kernel发展史(BY 夕つ云 整理) 英文名 中文名 Android系统版本 发布时间 Linux kernel内核版本 备注 Astro 铁臂阿童木 Android beta 2007年11月5日 未知 它作为一个面向开发者的软件开发包...
  • Linux 查看内核( Kernel版本的方法   目前尝试过三种方法:     源自 “Debian” 的 “Linux ” 发行版推荐使用如下命令:   dpkg --get-selections|grep linux  会显示所有内核版本信息...
  • 在本地Git的版本库根目录下执行以下命令,将会同步Linux Kernel版本库到本地,进行镜像。 git clone --bare git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 当然,该命令只会在本地建立版本库...
  • https://www.kernel.org/pub/linux/kernel/ 最新内核:www.kernel.org
  • LINUX kernel内核各版本下载 2013-03-30 19:39:36
    LINUX内核 各版本下载链接: https://www.kernel.org/pub/linux/kernel/
  • 最终指向历史版本网址:https://kernelnewbies.org/LinuxVersions以下内容转自http://blog.csdn.net/juS3Ve/article/details/78588888?locationNum=6&amp;fps=1进入网站: https://kernelnewbies.org/点选...
  • 由于Linux版本的在不断更新,当设备驱动去兼容不同版本的内核时,需要知道当前使用的内核源码版本,以此来调用对应版本的内核API,这两个宏定义在文件 /usr/include/linux/version.h #define LINUX_VERSION_CODE ...
  • kernel版本以及版本含义 2018-10-30 10:05:47
    mainline mainline指由Linus Torvalds亲自制作的内核发布版,是官方当前最新版本kernel source。...mainline事实上代表着一个linux kernel分支,这个分支有另一个名称,叫做vanilla。 longterm longt...
  • linux_kernel下载网站 2019-08-14 14:35:58
    linux_kernel :https://mirrors.edge.kernel.org/pub/linux/kernel/v3.x/ hi3531d使用的kernel版本为v3.18.20
  • 将从google 官网(http://code.google.com/p/android/downloads/list )下载的Android 的Linux Kernel 和标准的Linux 2.6.25 版本Kernel 比较,Android 系统的Kernel 主要增加如下内容“ 1. 基于 ARM 架构增加 ...
  • 将从google官网(http://code.google.com/p/android/downloads/list)下载的Android的Linux Kernel和标准的Linux 2.6.25版本Kernel比较,Android系统的Kernel主要增加如下内容“ 1.
  • 光从官网上找到的是没有历史版本的直接下载选项的,只有通过终端或者采用输入网址的方法才能得到。 直接将后面内核的版本号修改即可。 修改方法: 1. 查看linux内核版本号: uname -a 2. 对照官网官网地址修改...
  • linux有两种版本,一种是核心版本,一种是发行版本。核心版本序号由三部分数字组成,形式为major.minor.patchlevel。其中major为主版本号,minor为次版本号,二者构成核心版本号,patchlevel表示对该版本的修订次数...
  • linux kernel启动流程 2016-08-06 11:59:30
    来源:Linux社区 作者:ce123_zhouwei 本文写的真心不错,层次清晰,内容详略得当,值得一阅,谨做笔记使用。 Linux内核启动流程   arch/arm/kernel/head-armv.S   该文件是内核最先执行的一个文件,...
1 2 3 4 5 ... 20
收藏数 361,572
精华内容 144,628