本章内容是为后续介绍内容做一个铺垫,主要是帮助大家快速了解kernel config的内容和含义;需要大家了解常用config的选项,以及kernel编译构建时的配置过程。
在Linux kernel编译过程中,有一个系统的配置文件,用来指定哪些模块需要被编译进内核,哪些模块不需要用到,这个配置文件可以在顶层通过make menuconfig进行配置,如下:
成功运行后会弹出文本选项终端:
当我们选择好所有选项并且保存后,会生成一个配置文件,这时候编译kernel,就会根据config文件来决定什么模块编译进去。
在menuconfig配置选项的前面可以看到 [ ]、< >、{ }、( )这几种表示方式,选中表示需要编译到内核中:
[ ] 有两种状态:* 代表选中,空代表未选中:
< > 有三种状态:* 代表选中,空代表未选中,M代表模块;该选项和[ ]的区别在于可以把模块编译成ko模块进行动态加载:
{ }有两种状态:* 代表选中,M代表模块。
( ) 存放十进制或十六进制或字符串:
选择好退出会提示是否保存:
保存后在当前目录下可以看到一个.config文件:
make menuconfig后进入general setup也叫常规选项:
Cross-compiler tool prefix
CONFIG_CROSS_COMPILE
交叉编译工具前缀(比如"arm-linux-"相当于使用"make
CROSS_COMPILE=arm-linux-"进行编译).除非你想配置后默认自动进行交叉编译,否则不要使用此选项.
Compile also drivers which will not load
CONFIG_COMPILE_TEST
显示专属于其他平台(非x86平台)的驱动选项(需要交叉编译),仅供驱动开发者使用,普通的发行版制作者应该选"N".
Local version - append to kernel release
CONFIG_LOCALVERSION
在内核版本后面加上自定义的版本字符串(最大64字符),可以用"uname -a"命令看到
Automatically append version information to the version string
CONFIG_LOCALVERSION_AUTO
自动在版本字符串(CONFIG_LOCALVERSION)后面添加版本信息(类似"-gxxxxxxxx"格式),需要有perl以及git仓库支持
Default hostname
CONFIG_DEFAULT_HOSTNAME
设置默认主机名,默认值是"(none)".用户可以随后使用系统调用sethostname()来修改主机名.
Support for paging of anonymous memory (swap)
CONFIG_SWAP
使用交换分区或者交换文件来做为虚拟内存
System V IPC
CONFIG_SYSVIPC
System V 进程间通信(IPC)支持,用于进程间同步和交换数据,许多程序需要这个功能.选"Y"。
POSIX Message Queues
CONFIG_POSIX_MQUEUE
POSIX消息队列是POSIX IPC的一部分,如果你想编译和运行那些使用"mq_*"系统调用的程序(比如为Solaris开发的程序),或者需要使用Docker容器,就必须开启此选项.POSIX消息队列可以作为"mqueue"文件系统挂载以方便用户对队列进行操作.不确定的选"Y".
open by fhandle syscalls
CONFIG_FHANDLE
用户程序可以使用句柄(而非文件名)来追踪文件(使用open_by_handle_at(2)/name_to_handle_at(2)系统调用),即使某文件被重命名,用户程序依然可定位那个文件.此特性有助于实现用户空间文件服务器(userspace file server).建议选"Y",因为systemd和udev依赖于它.
uselib syscall
CONFIG_USELIB
启用老旧的uselib()系统接口支持,仅在你需要使用基于libc5的古董级程序时才需要,不确定的选"N".
Auditing support
CONFIG_AUDIT
内核审计(跟踪每个进程的活动情况)支持,某些安全相关的内核子系统(例如SELinux)需要它.但是它会与systemd冲突,所以在使用systemd的系统上必须关闭.
Enable system-call auditing support
CONFIG_AUDITSYSCALL
对系统调用进行审计.既可独立使用,也可被其他内核子系统(例如SELinux)使用.
IRQ subsystem
IRQ(中断请求)子系统
Expose hardware/virtual IRQ mapping via debugfs
CONFIG_IRQ_DOMAIN_DEBUG
通过debugfs中的irq_domain_mapping文件向用户显示硬件IRQ号/Linux IRQ号之间的对应关系.仅用于开发调试.
Timer tick handling
内核时钟滴答处理程序。
Periodic timer ticks (constant rate, no dynticks)
CONFIG_HZ_PERIODIC
无论CPU是否需要,都强制按照固定频率不断触发时钟中断.这是最耗电的方式,不推荐使用。
Idle dynticks system (tickless idle)
CONFIG_NO_HZ_IDLE
CPU在空闲状态时不产生不必要的时钟中断,以使处理器能够在较低能耗状态下运行以节约电力,适合于大多数场合
Full dynticks system (tickless)
CONFIG_NO_HZ_FULL
完全无滴嗒:即使CPU在忙碌状态也尽可能关闭所有时钟中断,适用于CPU在同一时间仅运行一个任务,或者用户空间程序极少与内核交互的场合.即使开启此选项,也需要额外设置"nohz_full=?"内核命令行参数才能真正生效.
篇幅所限,我们提供一个文档,路径在:…/2. 系统篇/5.内核Config,也就是本章的目录下;文件名称是:Linux内核(4.x)config选项介绍.pdf,里面会较为详细的解析其他config选项的含义,可以参考。
正常配置完menuconfig并生成.config文件后,我们只需要在kernel目录下直接进行编译即可,我们也可以把配置文件重命名为其他文件,然后make xxxconfig的方式来生效配置;先前的课程我们用到的配置文件其实是:
生效配置:make rk3308_linux_defconfig
实际上就是把我们自定义的配置写到.config中。
其实我们查看rk3308_linux_defconfig文件会发现就是一堆选项,部分选项截图如下:
==================================================================================================================================
内核Config学习就先到这里啦!!逐渐增加挑战性,还是很Easy!!
如果觉得对您有帮助并想进一步深入学习交流可以扫描以下微信二维码或加入QQ群:928840648
欢迎共同学习成长,有一群爱学习的小伙伴一起勉励!!一起加油!!也可点击
笔者基于嵌入式系统框架内容如下整理编辑: