我正在开发一个嵌入式Linux系统(5.10.24),现在我想检查我可以构建的最小内核是什么,所以通过大量的内核配置,现在我有了以下内核。
# dmesg | grep 'Memory:'
Memory: 12620K/16384K available (1933K kernel code, 128K rwdata, 236K rodata, 192K init, 55K bss, 3764K reserved, 0K cma-reserved)
# free
total used free shared buff/cache available
Mem: 12812 2624 8808 0 1380 8928
Swap: 0 0 0
我已经禁用了一些关键的内核代码,例如sysfs
驱动程序。
所以目前,我无法优化内核配置来减少内核内存使用。
这是正常的内核,运行在具有 MMU 的 MPU 上,目前我可能不会转向 uCLinux。
接下来,我可以通过禁用或简化内核代码来手动更改代码。但在此之前,我首先想缩小比其他功能使用更多内存的内核功能的范围。
那么有什么建议我应该首先关注哪些代码吗?有没有什么工具可以帮助我找出内核的哪一部分占用更多内存,我应该注意?
答案1
我找到了生成最小 Linux 内核的方法。
这里是。
按照正常和常见的方式运行
make menuconfig
以完成大量配置并禁用不使用/不需要的内容,这就是方式risk-less
。请记住构建并启动内核以检查更改是否按预期工作。禁用占用大量内存的内核组件,例如
sysfs
、procfs
和printk
。此更改将大大减少内核占用空间,但这可能会阻止某些功能正常工作,例如free
,,,ps
它们mount
严重依赖于procfs
.所以这是内存大小和功能的权衡。从引导加载程序自定义内核参数,以禁用或设置某些内核功能以使用更少的内存。
用于
readelf
检查哪些函数和数据正在占用内存。更改内核代码,根据特定硬件平台简化一些功能,例如IRQ数量等。
每次更改后都需要构建和测试内核映像。
经过反复试验,最终得到的内核镜像如下:
-rw-rw-r-- 1 t t 972961 Nov 29 22:09 vmlinuz
text data bss dec hex
1860928 242232 28032 2131192 2084f8
# free
total used free shared buff/cache available
Mem: 5620 2140 2188 0 1292 2660
Swap: 0 0 0
禁用 sh 时
根据 paladin 的评论,我尝试在内核中禁用“sh”并比较结果。
改变之前。
text data bss dec hex
7905846 1791740 135872 9833458 960bf2
改变后
text data bss dec hex
7905026 1787608 135872 9828506 95f89a
因此,.txt 文件中保存了大约 800Bytes text
,大约 3KB data
。