linux 内核版本号 的生成和修改

linux下可以通过 cat /proc/version 命令查看内核版本信息。

root@am57xx-evm:~# cat /proc/version
Linux version 4.14.79-gbde58ab01e (allen@david-virtual-machine) (gcc version 7.2.1 20171011 (Linaro GCC 7.2-2017.11)) #248 SMP PREEMPT Mon Dec 16 14:39:09 CST 2019

这个proc文件是在内核源码 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);

proc_create("version", 0, NULL, &version_proc_fops):
在proc目录下创建了version文件,打开这个文件时,会去调用其open方法,open里调用version_proc_show(),即执行下面这行代码:

seq_printf(m, linux_proc_banner,utsname()->sysname,utsname()->release,utsname()->version);

linux_proc_banner的定义在 init/version.c里:

const char linux_proc_banner[] =
	"%s version %s"
	" (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ")"
	" (" LINUX_COMPILER ") %s\n";

utsname()->sysname,->release,->version也在 init/version.c里初始化

struct uts_namespace init_uts_ns = {
	.kref = KREF_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
};

等价于:

seq_printf(m, "%s version %s (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") %s\n",UTS_SYSNAME,UTS_RELEASE,UTS_VERSION);

以我的环境为例:
UTS_SYSNAME:linux
UTS_RELEASE:4.14.79-gbde58ab01e ---根据MAkefile和内核配置生成
LINUX_COMPILE_BY:编译内核的用户
LINUX_COMPILE_HOST:编译内核的主机
LINUX_COMPILER:编译内核使用的编译器版本
UTS_VERSION:scripts/mkcompile_h里生成:

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
UTS_VERSION="$UTS_VERSION $CONFIG_FLAGS $TIMESTAMP"

在这里UTS_VERSION="#$VERSION $CONFIG_FLAGS $TIMESTAMP",VERSION在KBUILD_BUILD_VERSION为空时,就是 .version文件的内容。.version里面记录的是内核编译次数,每编译一次这个文件中的值便会加1,删掉即可清零。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生成不同版本的 Linux 内核通用的 .ko 模块,可以按照以下步骤进行: 1. 安装内核源代码和编译工具链 在 Linux 系统中,可以通过包管理器安装内核源代码和编译工具链。例如,在 Ubuntu 系统中,可以使用以下命令来安装: ``` sudo apt-get install linux-source build-essential ``` 2. 解压内核源代码 在安装完内核源代码后,需要解压到本地,解压后会生成一个源代码目录。可以使用以下命令来解压: ``` tar xvf linux-source-版本号.tar.xz ``` 3. 进入内核源代码目录,并编译模块 进入解压后的内核源代码目录,使用以下命令进行编译: ``` make modules ``` 编译完成后,会在内核源代码目录的 /lib/modules/版本号 目录下生成 .ko 模块文件。 4. 使用生成的 .ko 模块 生成的 .ko 模块可以在不同版本的 Linux 内核中使用。如果要使用该模块,需要将该模块文件放到系统的 /lib/modules/版本号/kernel/drivers 目录下,并执行以下命令更新模块依赖关系: ``` depmod -a ``` 然后,可以通过 modprobe 命令加载该模块: ``` modprobe 模块名 ``` 加载成功后,可以通过 lsmod 命令查看已加载的模块信息: ``` lsmod ``` 如果要卸载该模块,可以使用以下命令: ``` rmmod 模块名 ``` 卸载成功后,可以通过 lsmod 命令查看已加载的模块信息,确认该模块已被卸载。 总之,要生成通用的 .ko 模块,需要在相同的内核版本下进行编译,然后将生成的模块文件放到不同版本的内核中使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值