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