引言
内核代表启动时通常会看到下面第二行信息的内容,它们是当前内核的版本、编译工具版本、编译环境等信息。
要在启动中的任何打印过程中,都经过一番讨论和了解才要在大家的发布。一条信息,但有一条信息,但实际上却隐藏了一些隐藏的故事。
要打印版本信息 为什么
当启动之后有很多种方式确定内核版本号系统信息,在嵌入式或安卓内核系统下,查看版本信息:
无名
进程/版本
在发布版linux系统环境下,还可以用下面的查看版本信息:
主机名
lsb_release
以上方法都是系统启动正常、加载文件系统需要之后使用的。
那么,系统启动过程中是否有打印内核版本信息呢?答案是完全有完成必要的。
比如下面几个应用场景:
SoC 芯片的内核适配
可负载驱动程序调试
多分支版本加载
内核伪装
内核版本实现原理
内核版本的标签打印信息 start_kernl(中的linux_kernl)字符串。
这里的横幅比是 ubuntu 系统里的 ssh 基本横幅一样,信息展示了系统的一些。
横幅字符串的定义位于init/version.c中,注意,它是一个只读字符串,不要删除它。
由以下几部分组成:
UTS_RELEASE
“5.4.124+”
LINUX_COMPILE_BY
“好笑”,我的编译机好笑
LINUX_COMPILE_HOST 玩
“搞笑”,我的编译机主机很搞笑
LINUX_COMPILER
“gcc version 6.5.0 (Linaro GCC 6.5-2018.12”)
UTS_VERSION
"#30 SMP 11 11 10:28 CST 20"
UTS:Unix 时间 Sat12,从这个名字 11:10:28 的 UNIX 印记。
对这些字符串逐条进行解析
这些宏的第一级定义在./scripts/mkcompile_h文件中。
UTS_VERSION
LINUX_COMPILE_BY
LINUX_COMPILE_HOST
LINUX_COMPILER
UTS_ 重点分析的来源
是一个在kernel 的宏内核——Makefile 中定义的一个宏,如下:
提高制作的等级可以看到,该脚本的打印内容经过翻译后如下:
现在可以确定KERNELRELEASE就是从kernel.release文件中获取到的。打开kernel.release确认一下:
其中。KERNELRELEASE_5.4.124+
KERNELRELEASE 是怎么来的呢
? 。
自动化命令2>/dev/null中的含义是:若猫失败即没有取到文件内容,于是将错误信息输出到黑洞文件。
通过下面的验证:
一切代码准备好之后,通过下面的将UTS更新到UTS中。
其中filechk的定义位于scripts/Kbuild.include
而utsrelease.h中的内容如下:
这就是我们启动内核的过程中打印出来的内核版本信息。
原作者:Linux与SoC
|