2012-02-07 16 views
3

mipsアセンブリ、特にSPIMシミュレータでヒープを手動で管理するにはどうすればよいですか?mipsメモリ管理

ヒープは、sbrkのシステムコールを使用すると、0x10040000から始まります。

li $t0, 1

li $s0, 9

syscall

sw $t0, ($s0) # 1 located at 0x10040000

ので、SBRKの呼び出しを使用すると、次の空きメモリスロットを取り戻すことを保証しませんか?たとえば、1つの4バイトのスペースにsbrkを呼び出した場合、SPIMはアドレス0x10040000-0x10040003を割り当てます。ただし、別の4バイト空間の2回目の呼び出しは、以前の4バイト割り当てと無関係かもしれませんか?したがって、どのメモリスロットが割り当てられたかを追跡するためには、データ構造が必要ですか?最後に、メモリマネージャは、特定のデータ構造によって追跡されるアドレス間にある空き領域を判断して、sbrkへの呼び出し回数を減らそうとしますか?

答えて

6

実際のシステムでは、sbrkはページ単位の割り当てを返します。私はSPIMシミュレータが(貧弱なオンラインドキュメントは、バイト指向の粒度を返すことを暗示している)かどうかはわかりません。

一般的に、sbrkシステムコールは "end-of-heap"ポインタを設定するだけです。基礎となるすべてのOSが知っているのは、ヒープの開始点(sbrkがプログラムの先頭で起動した場所)と、現在のヒープエンドポインタです。その境界内のすべてのメモリは、プログラムによって使用されている(OSの観点から)ヒープメモリとみなされます。

(注、あなたのケースで私は、暗黙的にすべてのメモリが連続していると私は休憩が常に増加していると思いますが、SPIMシミュレータによってポインタをバンプするために整数を取ると考えている?)

「malloc関数」API一般的にsbrk上に構築されているため、単純な連続したメモリ領域以上のものが提供されます。良いmallocライブラリは、一般的に、メモリの領域を "空き"としてマークすることができます(したがって、それは後続のmalloc呼び出しを満たすために使用できます)。 OSは一般に、この「フリー」については知らないことに注意してください。 Mallocは無料であるかどうかを記録します。一般に、mallocはヒープのこの任意の領域をOSに戻すことはできません。これは、ヒープがOSの観点から見て単一の連続領域であるためです。

実際のmalloc実装では、割り当て要求とページサイズの不一致を処理する必要があります(通常のsbrkは、ページ単位のページサイズ割り振りの倍数しか返しません)。 sbrkがきめ細かくなっているため、シミュレータのケースにこの問題はありません。

どのメモリが使用されているかどうかを追跡するにはメモリが必要なので、mallocにはオーバーヘッドがあります。実装の中には、このような簿記の大部分を「フリー」メモリに格納するように設計されているものがあります(クライアントの見かけのコストを削減します)。 mallocをsbrkにマッチさせるための他にもたくさんの戦略があります(mallocをsbrkにマッピングすると、あまりにも多くのメモリを割り当てない限り、no-opを '動作させる'ことができます...) http://web.eecs.utk.edu/~huangj/cs360/360/notes/Malloc1/lecture.html

:ここ

mallocsbrkは、それは私は転写する忍耐を持っていないいくつかのASCIIアートを描く関連付ける方法の概要です