6

メモリが破損しているように見えるカーネル モジュールをデバッグしています。基本的に、「net_device」インスタンス用に alloc_netdev() によって割り当てられたメモリの一部が破損しています。

1)カーネルで ,CONFIG_DEBUG_KERNELをオンにしましたが、から何が期待できるかわかりません。を読むたびに、疑わしいメモリリークのトレースダンプを出力することになっていますか? によって蓄積された統計/情報をリセットする方法はありますか? 最も重要な - 誰でも出力を解読するのを助けることができますか、例えば:CONFIG_DEBUG_SLABCONFIG_DEBUG_KMEMLEAK.configkmemleak/sys/kernel/debug/kmemleakkmemleak

unreferenced object 0xc625e000 (size 2048):
  comm "swapper", pid 1, jiffies 4294937521
  backtrace:
    [<c00c89f0>] create_object+0x11c/0x200
    [<c00c6764>] __kmalloc_track_caller+0x138/0x178
    [<c01d78c0>] __alloc_skb+0x4c/0x100
    [<c01d8490>] dev_alloc_skb+0x18/0x3c
    [<c0198b48>] eth_rx_fill+0xd8/0x3fc
    [<c019ac74>] mv_eth_start_internals+0x30/0xf8
    [<c019c5fc>] mv_eth_start+0x70/0x244
    [<c019c810>] mv_eth_open+0x40/0x64
    [<c01e00f0>] dev_open+0xb4/0x118
    [<c01df788>] dev_change_flags+0x90/0x168
    [<c001a3e4>] ip_auto_config+0x1bc/0xecc
    [<c00212f4>] do_one_initcall+0x5c/0x1bc
    [<c00083d0>] kernel_init+0x8c/0x108
    [<c0022f58>] kernel_thread_exit+0x0/0x8
    [<ffffffff>] 0xffffffff

2)このメモリに「読み取り専用」属性を適用できるかどうかも疑問に思っていました。この方法でOops、誰かがメモリを変更しようとしたときに生成されると予想されます。合理的に聞こえますか?

アドバイスをいただければ幸いです。

マーク

4

1 に答える 1

9

不正なメモリ アクセスを検出するには、KAsanまたはkmemcheckの方がおそらく役立つでしょう。ただし、Kmemcheck は、場合によっては許容できない重大な問題を引き起こすことが知られているため、決定するのはユーザー次第であることに注意してください。KASan ははるかに高速である必要があります。

1. kmemleak については、カーネルのドキュメントにその動作が詳しく説明されています。

要するに、実行する方が信頼性が高くなります

echo scan > /sys/kernel/debug/kmemleak

を読み取る直前にルートとしてメモリ分析をトリガーします/sys/kernel/debug/kmemleak。kmemleak のレポートを読む前に、上記のコマンドを 2 回実行した方が信頼できる場合もあります。

kmemleak によって収集されたデータを「リセット」するには、次のコマンドを実行できます。

echo clear > /sys/kernel/debug/kmemleak

0xc625e000投稿した出力は、kmemleak が、ツールが最後にメモリを分析した時点で、アドレスのサイズが 2Kb のメモリ領域が解放されていないと考えていることを意味します。バックトレースは、メモリが割り当てられた場所を示します。「swapper」は、そのメモリ領域を割り当てたプロセスの名前です。

2. メモリーを読み取り専用に設定することに関する限り、この手法はカーネルの一部の場所で実際に使用されています。たとえば、カーネル本体とモジュールのコードを保護するためです。ここで正確な手順を説明することはできませんが、set_page_attributes() 関数の実装は掘り下げるのに適した場所です。

上で述べた kmemcheck は、メモリアクセスを追跡するために多少似た手法を使用していることに注意してください。ページが存在しないように「見える」ようにするため、ページへのアクセスごとにページフォールトが発生するなどです。詳細は、いつものようにカーネルドキュメントにあります。

于 2012-10-18T07:10:59.730 に答える