应该如何生成最小的 Linux 内核?

应该如何生成最小的 Linux 内核?

我正在开发一个嵌入式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 内核的方法。
这里是。

  1. 按照正常和常见的方式运行make menuconfig以完成大量配置并禁用不使用/不需要的内容,这就是方式risk-less。请记住构建并启动内核以检查更改是否按预期工作。

  2. 禁用占用大量内存的内核组件,例如sysfsprocfsprintk。此更改将大大减少内核占用空间,但这可能会阻止某些功能正常工作,例如free,,,ps它们mount严重依赖于procfs.所以这是内存大小和功能的权衡。

  3. 从引导加载程序自定义内核参数,以禁用或设置某些内核功能以使用更少的内存。

  4. 用于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

相关内容