11

カーネル モジュール (通常はデバイス ドライバー) が消費するメモリ量を見積もる際に、.ko (.bss、.data、.text など) の静的メモリ領域のサイズを示すsizeユーティリティを使用してみました。したがって、これらの値の合計は、モジュールを挿入した直後にlsmodコマンドによって得られる出力と正確に等しいと予想していました。

init() 関数では動的メモリ割り当て (kmalloc または vmalloc) が実行されないため、違いが生じていないことが保証されます。では、なぜ不一致があるのでしょうか?

不思議なことに、ほとんどの場合、ミスマッチは固定量であることがわかりました!!

コマンド出力は次のとおりです。

サイズ chardev.ko

text    data     bss     dec     hex   filename
172     448    1024016 1024636  fa27c chardev.ko

lsmod

Module  Size    Used by    Tainted: P
chardev 1025040 0 - Live   0xc009d000
4

3 に答える 3

4

init 関数では割り当てが行われないとおっしゃいましたが、デバイス インスタンスに内部的にメモリを割り当てる register_chrdev(9) などの呼び出しは考慮されていますか? 恒常的な差だというコメントは、これが原因なのだろうかと考えさせられます。

于 2009-03-24T14:43:41.363 に答える
1

モジュールが使用する関数は、モジュールのサイズにカウントされますか? 試す

cat /proc/kallsyms | grep module_name

2 つのサイズの違いは 404 です。テキスト + データ + 404 = 1024 です。これは何らかの粒度の問題でしょうか? サイズがカーネル内でどのように計算されるかわかりません...

ただし、カーネル コードとデータは動的メモリを使用して割り当てられます。また、kmalloc は事前に割り当てられたメモリ ブロックを使用するため、コードとデータ セクションが割り当てられるときに切り上げが発生する可能性が非常に高くなります。

データ セクションのサイズを増やしてみて、lsmod がサイズの変更を報告するかどうかを確認します。

于 2009-03-19T15:37:31.683 に答える
0

これ以上の情報がなければ、デバッグのオーバーヘッドであると推測したくなります。私はあなたのカーネル構成を持っていないので、誘惑されたと言いました。

于 2009-03-20T06:08:50.043 に答える