最小の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. sysfsprocfsなどのメモリ集約型カーネルコンポーネントを無効にしますprintk。この変更はカーネルスペースを大幅に削減しますが、これにより特定の機能が正しく機能しなくなる可能性がありますfreepsmountprocfs

  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ファイルには約800バイトtext、約3KB程度が格納されますdata

関連情報