写点什么

Linux Lab 进阶: Linux 内核

用户头像
贾献华
关注
发布于: 2021 年 02 月 04 日
Linux Lab 进阶: Linux 内核

非交互方式配置


Linux 内核提供了一个脚本 scripts/config,可用于非交互方式获取或设置内核的配置选项值。基于该脚本,实验环境增加了两个选项 kernel-getconfig 和 kernel-setconfig,可用于调整内核的选项。基于该功能我们可以方便地实现类似 "enable/disable/setstr/setval/getstate" 内核选项的操作。


获取一个内核模块的状态:


$ make kernel-getconfig m=minix_fsGetting kernel config: MINIX_FS ...
build/aarch64/linux-v5.1-virt/.config:CONFIG_MINIX_FS=m
复制代码

使能一个内核模块:


$ make kernel-setconfig m=minix_fsSetting kernel config: m=minix_fs ...
build/aarch64/linux-v5.1-virt/.config:CONFIG_MINIX_FS=m
Enable new kernel config: minix_fs ...
复制代码

更多 kernel-setconfig 命令的控制选项:y, n, c, o, s, v


选项说明y编译内核中的模块或者使能其他内核选项c以插件方式编译内核模块,类似 m 选项o以插件方式编译内核模块,类似 m 选项n关闭一个内核选项sRTC_SYSTOHC_DEVICE="rtc0",设置 rtc 设备为 rtc0vv=PANIC_TIMEOUT=5, 设置内核 panic 超时为 5 秒


在一条命令中使用多个选项:


make kernel-setconfig m=tun,minix_fs y=ikconfig v=panic_timeout=5 s=DEFAULT_HOSTNAME=linux-lab n=debug_infomake kernel-getconfig o=tun,minix,ikconfig,panic_timeout,hostname
复制代码

使用内核模块


编译所有的内部内核模块:


make modulesmake modules-installmake root-rebuild     // not need for nfs bootmake boot
复制代码

列出 src/modules/ 和 boards/<BOARD>/bsp/modules/ 路径下的所有模块:


make modules-list
复制代码

如果加上 m 参数,除了列出 src/modules/ 和 boards/<BOARD>/bsp/modules/ 路径下的所有模块外,还会列出 src/linux-stable/ 下的所有模块:


$ make modules-list m=hello     1	m=hello ; M=$PWD/src/modules/hello$ make modules-list m=tun,minix     1	c=TUN ; m=tun ; M=drivers/net     2	c=MINIX_FS ; m=minix ; M=fs/minix
复制代码

使能一个内核模块:


$ make kernel-getconfig m=minix_fsGetting kernel config: MINIX_FS ...
build/aarch64/linux-v5.1-virt/.config:CONFIG_MINIX_FS=m
$ make kernel-setconfig m=minix_fsSetting kernel config: m=minix_fs ...
build/aarch64/linux-v5.1-virt/.config:CONFIG_MINIX_FS=m
Enable new kernel config: minix_fs ...
复制代码

编译一个内核模块(例如:minix.ko)


make modules M=fs/minix/# 或make modules m=minix
复制代码

安装和清理模块:


$ make modules-install M=fs/minix/make modules-clean M=fs/minix/
复制代码

其他用法:


make kernel-setconfig m=tunmake kernel x=tun.ko M=drivers/netmake kernel x=drivers/net/tun.komake kernel-run drivers/net/tun.ko
复制代码

编译外部内核模块(类似编译内部模块):


make modules m=hello# 或make kernel x=$PWD/src/modules/hello/hello.ko
复制代码

使用内核特性


内核的众多特性都集中存放在 src/feature/linux/,其中包括了特性的配置补丁,可以用于管理已合入内核主线的特性和未合入的特性功能。


$ make feature-list[ /labs/linux-lab/src/feature/linux ]:  + 9pnet  + core    - debug    - module  + ftrace    - v2.6.36      * env.g3beige      * env.malta      * env.pc      * env.versatilepb    - v2.6.37      * env.g3beige  + gcs    - v2.6.36      * env.g3beige      * env.malta      * env.pc      * env.versatilepb  + kft    - v2.6.36      * env.malta      * env.pc  + uksm    - v2.6.38
复制代码

这里列出了针对某项特性验证时使用的内核版本,如果其他条件未改变的话该特性应该可以正常工作。


例如,为了使能内核模块支持,可以执行如下简单的操作:


make feature f=modulemake kernel-olddefconfigmake kernel
复制代码

为了在 malta 开发板上验证基于 2.6.36 版本的 kft 特性,可以执行如下操作:


make BOARD=maltaexport LINUX=v2.6.36make kernel-checkoutmake kernel-patchmake kernel-defconfigmake feature f=kftmake kernel-olddefconfigmake kernelmake boot
复制代码

新建开发分支


如果希望新建一个分支来做开发,那么可以参考如下步骤。


首先在 src/linux-stable 或配置的其他 KERNEL_SRC 目录下基于某个内核版本新建一个 git 分支,假设历史版本是 v5.1:


cd src/linux-stablegit checkout -b linux-v5.1-dev v5.1
复制代码

然后通过 kernel-clone 从 Linux Lab 的 v5.1 克隆一份配置和相应目录:


make kernel-clone LINUX=v5.1 LINUX_NEW=linux-v5.1-dev
复制代码

之后就可以跟往常一样开发。


如果基础版本不是 v5.1,那么可以从支持的版本中挑选一个比较接近的,以 i386/pc 为例:


make b=i386/pc list linux# v2.6.10 v2.6.11.12 v2.6.12.6 v2.6.21.5 v2.6.24.7 v2.6.34.9 v2.6.35.14 v2.6.36 v4.6.7 [v5.1] v5.2
复制代码

例如,想进行 v2.6.38 开发,可以考虑从 v2.6.36 来克隆,就近的配置更接近,出问题可能更少。


cd src/linux-stablegit checkout -b linux-v2.6.38-dev v2.6.38
make kernel-clone LINUX=v2.6.36 LINUX_NEW=linux-v2.6.38-dev
复制代码

开发过程中,请及时 commit,另外,请慎重使用如下命令,避免清除重要变更:


  • kernel-checkout, 检出某个指定版本,可能会覆盖掉当前修改

  • kernel-cleanup, 清理 git 仓库,可能会清理掉当前修改

  • kernel-clean, 清除历史编译记录,可能会自动执行上述 cleanup 动作


发布于: 2021 年 02 月 04 日阅读数: 24
用户头像

贾献华

关注

及时当勉励 岁月不待人 2018.06.04 加入

https://2020.iosdevlog.com

评论

发布
暂无评论
Linux Lab 进阶: Linux 内核