`
fanrey
  • 浏览: 255049 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

linux内核版本为何有时会自动添加“+”号

 
阅读更多
转载自:http://blog.csdn.net/adaptiver/article/details/7225980

1.   引子
编译2.6.35.7 kernel版本的时候发现,“2.6.35.7“的内核版本编译成功后生成的版本号变成了“2.6.35.7+”,为什么后面会多一个加号呢?问题出现在linux的版本控制这一块:
打开Makefile我们可以在文件的最上面可以发现
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 35
EXTRAVERSION = .7
NAME = Yokohama
这些就是告诉我们内核版本的版本号,生成出来的版本号理论上不应带+号,但为什么带+号呢

include/config/kernel.release文件是生成的带有版本号的文件,该文件由内核顶层Makefile的如下脚本处理:
# Store (new) KERNELRELASE string in include/config/kernel.release
include/config/kernel.release: include/config/auto.conf FORCE
        $(Q)rm -f $@
        $(Q)echo "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))" > $@

使用scripts/setlocalversion工具来生成include/config/kernel.release。“+”号就是在调用这个脚本时添加的。

阅读scripts/setlocalversion文件,并查阅资料,做如下笔记:

2.   为何会添加“+”号
在scripts/setlocalversion文件中有这么一段
# scm version string if not at a tagged commit
if test "$CONFIG_LOCALVERSION_AUTO" = "y"; then
# full scm version string
res="$res$(scm_version)"
else
# apped a plus sign if the repository is not in a clean tagged
# state and  LOCALVERSION= is not specified
if test "${LOCALVERSION+set}" != "set"; then
  scm=$(scm_version --short)
  res="$res${scm:++}"
fi
fi

2.1. 如果定义了CONFIG_LOCALVERSION_AUTO(CONFIG_LOCALVERSION_AUTO=y)
此时会执行第二个if下的脚本。执行res="$res$(scm_version)"
如果代码属于git管理:
打了tag,则会添加tag相关字符;
没有打tag,则会添加log相加字符,例如最新的commit是
commit cdebe039ded3e7fcd00c6e5603a878b14d7e564e
则编译之后文件include/config/kernel.release的内容为2.6.35.7-gcdebe03

2.2. 如果没有定义了CONFIG_LOCALVERSION_AUTO。
此时会执行else下的脚本。
A. 如果没有定义LOCALVERSION,版本号后面会添加“+”号:执行else里的if下的脚本scm=$(scm_version --short),在函数scm_version --short里,如果传入参数short会添加“+”号,
   if $short; then
    echo "+"
    return
   fi

B. 定义了LOCALVERSION则不会执行else里if所在的脚本,从而不会在后面添加“+”号。
C. LOCALVERSION变量可在命令行定义:
make LOCALVERSION=.88 include/config/kernel.release
或者添加为环境变量。
如果既不想添加字符,又不想有“+”号:不定义CONFIG_LOCALVERSION_AUTO,将LOCALVERSION变量定义为空:LOCALVERSION=

3.   往版本号里添加字符的方式
在scripts/setlocalversion文件中还有有这么一段:
# localversion* files in the build and source directory
res="$(collect_files localversion*)"
if test ! "$srctree" -ef .; then
res="$res$(collect_files "$srctree"/localversion*)"
fi

# CONFIG_LOCALVERSION and LOCALVERSION (if set)
res="${res}${CONFIG_LOCALVERSION}${LOCALVERSION}"
由此可看出,如果想往版本号里添加字符,有几种方式:
1. 使用LOCALVERSION变量(或者在命令行,或者添加为环境变量)
2. 在linux-2.6.35目录下添加文件localversion,文件内容会自动添加到版本号里去。
3. 定义CONFIG_LOCALVERSION变量
4. 如果linux-2.6.35目录下有文件localversion(其内容为.33),也使用了LOCALVERSION变量,也定义了CONFIG_LOCALVERSION=".XYZ"。
make LOCALVERSION=.44 include/config/kernel.release
此时对2.6.35.7的内核,include/config/kernel.release的内容为2.6.35.7.33.XYZ.55。
可看到添加的三种字符的顺序:文件localversion内容在前,然后是CONFIG_LOCALVERSION的值,最后是LOCALVERSION的值。

4.   另外,关于scripts/setlocalversion文件:
1. 在scripts/setlocalversion文件中,可用echo "aaa" >&2来输出显示相关信息,例如:
echo "LOCALVERSION=${LOCALVERSION}" >&2

2. 这个文件里很多地方是跟根据一些git命令来进行判断的,例如

         if head=`git rev-parse --verify --short HEAD 2>/dev/null`; then

                   if [ -z "`git describe --exact-match 2>/dev/null`" ]; then

                   if git config --get svn-remote.svn.url >/dev/null; then

                   [ -w . ] && git update-index --refresh --unmerged > /dev/null

                   if git diff-index --name-only HEAD | grep -v "^scripts/package" \

需要仔细注意

分享到:
评论

相关推荐

    Linux内核编译与裁剪

    版本号通常由三部分组成:`VERSION.PATCHLEVEL.SUBLEVEL`,有时还会附加一个`EXTRAVERSION`。 - **主版本号 (VERSION + PATCHLEVEL)**:主版本号用来区分内核的大版本。稳定版本的主版本号通常是偶数(例如2.4、2.6...

    linux-内核编译各个选项的含义

    * Automatically append version information to the version string:自动在版本字符串后面添加版本信息,编译时需要有 perl 以及 git 仓库支持。 三、虚拟内存相关选项 虚拟内存相关选项是 Linux 内核编译选项中...

    Linux内核编译配置选项简介

    例如,可以设置是否显示内核版本号,是否自动添加版本信息等。此外,还有关于内核编译时是否需要Perl支持和Git仓库。这些设置为内核提供了必要的版本控制信息,使得跟踪内核版本和配置变得更为便捷。 3. 内存分页...

    内核模块的操作和使Linux系统支持ntfs读写

    Linux内核模块的存放路径通常位于/lib/modules/,这个目录下包含了当前系统内核版本的所有模块。通过ls命令,我们可以列出该目录下的所有模块。例如,进入/lib/modules/4.4.0/kernel/fs/目录后,我们可以看到包含的...

    疯狂内核之——Linux预备知识.pdf

    具体来说,当发生系统调用或异常时,处理器会自动保存当前上下文(包括寄存器状态),并将控制权交给内核,这时就会发生堆栈切换。 **1.2.2 80x86分段的总结** 80x86架构下的分段机制是理解用户态与内核态切换的...

    linux-2.6.19.x内核编译配置选项简介.pdf

    - **Automaticallyappendversioninformationtotheversionstring**:这个选项让编译器自动在版本字符串后面添加版本信息。需要注意的是,编译时需要有Perl和Git仓库支持。 ### 3. 系统V IPC (SystemVIPC) - 这是...

    linux内核裁剪的几种方法

    Linux内核裁剪是一种优化手段,用于根据特定平台的需求,移除Linux内核中不需要的功能,以达到减小系统大小、提升系统性能的目的。本文将介绍几种Linux内核裁剪的方法,并针对不同的应用场景,如一般PC、PDA和小型...

    linux内核编译详细指导

    ### Linux内核编译详细指导 #### 一、前言 在Linux系统中,内核是操作系统的核心部分,负责管理系统的硬件资源,并提供基础服务给其他应用程序。有时我们需要对内核进行定制化编译,以适应特定的需求或者解决某些...

    Ubuntu+Systemtap进行Linux内核和用户空间开发测试

    然而,有时候自动安装的SystemTap可能无法正常工作,这时用户可能需要升级系统或手动下载最新的源代码包进行编译安装。编译安装SystemTap需要用户卸载通过apt-get自动安装的SystemTap软件包,然后下载相应版本的源...

    android对linux内核的改造及影响

    - **充分利用现有机制**:利用Linux内核已有的功能和机制,减少重复工作。 - **使用标准化的内容**:例如使用标准化的驱动程序,简化开发过程。 - **必要的扩展**:针对移动设备的特点,添加必要的功能扩展。 在...

    Linux提权思路+实战 _ Mugen1

    Linux内核版本分为稳定版和开发版,版本号由三部分组成,其中奇数次位表示开发中版本,偶数次位表示稳定版本。 提权的一个常见途径是利用内核漏洞。例如,“脏牛”(Dirty COW)是一个著名的Linux内核漏洞,允许低...

    linux 在grub2中添加windows启动项

    在Linux安装过程中,GRUB2通常会自动检测并添加其他存在的操作系统,但有时可能需要手动配置。 添加Windows启动项的步骤如下: 1. **检查硬盘分区**:使用`fdisk -l`命令查看硬盘分区情况,找到Windows系统的安装...

    360随身WIFI Linux 驱动

    然而,由于Linux内核与硬件的兼容性问题,有时需要安装特定的驱动程序才能使这些设备正常工作。本文将深入探讨如何在Linux环境下为360随身WiFi安装驱动,以及解决可能遇到的问题。 首先,了解360随身WiFi的工作原理...

    七彩虹主板linux 网卡驱动

    你需要根据你的Linux内核版本选择合适的驱动版本进行编译。可以查看`uname -a`来确定当前内核版本。 在编译驱动前,你需要确认你的系统中是否已经存在了Realtek的其他旧版本驱动,如果有,可能需要先卸载。这可以...

    Linux下安装 Realtek R8125 驱动源码,(ver 05),Ubuntu 18.04.6安装时缺少的驱动文件

    这时,可以考虑重新编译驱动并将其添加到`dkms`管理,这样在内核升级时,驱动会自动重建。使用以下命令实现: ```bash sudo dkms add ./ # 添加驱动到dkms sudo dkms build -m r8125 -v 9.005.01 # 构建驱动 sudo ...

    Linux 4.4.0内核源码分析TCP实现

    Linux内核中的网络子系统是由多个层次构成的,每个层次都有其特定的功能。从最高层到最低层依次是应用程序层、协议层、网络层、链路层和硬件接口层。每一层都有自己的数据结构来存储相关信息。 ##### 2.2 sock 底层...

    RTL8189ES在linux系统下驱动

    不同的Linux内核版本可能需要不同版本的驱动。确保你使用的驱动版本与当前运行的Linux内核兼容。在“RTL8189ES_linux_v4.3.10.1_13373.20150129”这个版本中,4.3.10.1可能意味着它适用于内核4.3.x系列。如果你的...

    USB转485驱动大全,linux ,windows都有

    由于Linux的开源特性,有时还需要用户自行编译内核以添加对新硬件的支持。 在实际应用中,USB转485驱动的配置和使用涉及到串口设置,如波特率、数据位、停止位、校验位等。用户可能需要使用串口通信软件(如Putty、...

    Linux考试知识点

    Bash Shell 命令补全功能可以在执行命令的时候不想按下太多的按键(例如命令 pcprofiledump),在输入了 pcprofile 之后,再按下 [Tab] 键的话,那么 bash 马上会自动的将后面的 dump 接上来。如果有重复的命令,...

    rtl8188cu网卡linux驱动

    需要注意的是,Realtek的驱动程序有时可能会存在兼容性问题,或者需要针对特定Linux内核版本进行调整。此外,某些Linux发行版可能已经包含了对rtl8188cu的支持,因此在安装前最好检查内核日志(`dmesg`命令)或尝试...

Global site tag (gtag.js) - Google Analytics