16

GNU/Linux システムで動的メモリ管理が低レベルでどのように機能するか (別名、ptmalloc がどのように機能するか) を理解することを楽しみにしています。

もちろん、私はコードを読みましたが、多くの疑問があります。データ構造はある程度理解していますが、情報漏えいが多発しています。

私の質問は、誰かが実装を詳細に説明しているリソースについて知っているかどうかです。たとえば、「ヒープを分割して理解する」や「Malloc Malleficarum」シリーズおよびポスト シリーズなどの論文を読んだことがあります。彼らは素晴らしい仕事をしていますが、もちろん、多くの実装の詳細を説明するよりも、悪用に重点を置いています。

どのリソースについてもわからない場合は、ここに私の質問をいくつか示します。

  • アリーナって実際どうなの?heap_info構造体の変数ar_ptrのコードには、「このヒープのアリーナ」というコメントがあるため、アリーナをヒープにすることはできません (どこでも言われているように)。

  • heap_info構造体に次のポインターがなく、のポインターがあるのはなぜですか? main_arenaのせいですか?main_arenaとは何ですか?

  • すべての heap_info構造体は、複数のアリーナ (異なるmalloc_state構造体を指す) を持つことができますか?

  • ニュース アリーナはいつ作成され、どのコードがそれを処理しますか? データを保存するために要求されたアリーナがロックされたときに新しいアリーナが作成されることを読みました(プロセスまたはプロセススレッドがそれで動作しているため)。また、各プロセススレッドには異なるアリーナがあることも読みました。ここで重要なことは、これらの状況を処理するコードを知っているかどうかです

  • また、すべてのメモリ操作が最上位のチャンクまたは最もワイルドなチャンクから生まれたと人々が言うのも理解できません。このコードがどこにあるかわかりますか?

ところで、ミューテックスの詳細については深く掘り下げたくありません。

glibc 2.12.1 での ptmalloc の実装を見直しています。すべての全体的な構造についていくつかの図を作成したいので、これらのことを理解する必要があります!

ありがとうございました。

4

2 に答える 2

9

わかりました、私はいくつかの調査を行い、それらの質問の多くに対する答えを持っています.

  • アリーナは、プロセスのすべての動的データが格納されるメモリ領域です。つまり、アリーナは、過去にヒープと呼ばれていたメモリ構造です。最近では (マルチスレッド機能を使用して) プロセスごとに複数のヒープが必要な場合、アリーナと呼ばれるものを作成して処理しますが、このアリーナは単なるヒープにすぎません。heap_info構造は、プロセスの複数の存在するアリーナのみを管理します。

  • のポインターしかない理由がわかりません。私が知っているのは、通常、すべての動的データはmain_arenaに格納されているということです。これは、そのプロセス用に作成されたアリーナです。どのような状況でmain_arenaが使用されないかはわかりません。メモリ チャンクのサイズフィールドにNON_MAIN_ARENAビットが設定されている場合、main_arenaは使用されず、アルゴリズムはクリアから新しいアリーナ アドレスを取得します。heap_for_ptr()マクロを使用して、そのメモリ チャンク ポインタの下位 20 ビットを取り出します。要約すると、通常の状況では、main_arenaが常に使用されます。

  • はい、私が言ったように、各heap_info構造体は複数のアリーナを持つことができます。これは、ロックの競合が原因です。十分な時間がある場合は、[1] でこれについて読むことができます。

  • 私はこれを覚えていません。しかし実際には、アリーナが使用中、ロックされている場合、新しいアリーナが作成されます。new_arena() または new_heap() に似た関数への呼び出しを検索します。関数名がそれに似ていたのを覚えています。

  • これは、最初はヒープのすべてのメモリ空間がトップ チャンク (または荒野チャンク) であることを意味しているだけだと思います。そのため、プロセスから新しいメモリ リクエストが要求されると、このトップ チャンクが分割され、断片化されます。したがって、すべては一番上のチャンクから始まります。

偉そうにするつもりはありませんが、3 か月後には、私の質問により適した回答が得られると思いますので、それを正しい回答とします。一方、他のすべての回答に感謝します。彼らは本当に役に立ちました。

ところで、私はこのすべての研究を論文にまとめましたが、スペイン語であることを考えると、ここでは役に立たないと思います。また、スパムと見なされるかどうかもわかりません. [2]

[1] http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.16.4439

[2] ここに論文があります: http://overflowedminds.net/papers/newlog/linux_heap_exploiting_revisited.pdf

于 2012-10-06T23:25:33.840 に答える
2

ヒープは基本的に、割り当てられた 1 つ以上のオブジェクトを個別に処理する多くの小さな領域に分割されます。そのような領域の 1 つは、アリーナまたはゾーンと呼ばれることがあります。主にヒープは、1 つの操作で 1 つのアリーナの割り当てを解除できるという要件を備えたオブジェクトを提供するアリーナのコレクションです。これを可能にするために、1 つのアリーナ全体が単一の連続するメモリ アドレス範囲として割り当てられます。

アリーナとゾーンの違いは何となくグレーです。Linux についてはよくわかりませんが、1 つの例として、Oceon と呼ばれる Cavium ネットワークによる実際のマルチコア ネットワーク プロセッサ ファミリがあります。割り当てられたメモリをアリーナまたはゾーンとして扱いますが、アリーナは異なるサイズのオブジェクトを持つことができるのに対し、ゾーンは固定の等しいサイズのオブジェクトを割り当てることができるという違いがあります。これは、アリーナの場合、当然のことながら断片化をもたらします。しかし、それがLinuxにも当てはまるかどうかは確認できません。

リージョンベースのメモリ管理

于 2012-10-05T19:07:58.397 に答える