Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> LinuxシステムFAQ >> LinuxMalloc分析 - ユーザー空間からカーネル空間へ

LinuxMalloc分析 - ユーザー空間からカーネル空間へ

  
        

この記事では、ヒープ拡張操作におけるmallocとそのmallocの実装について説明し、仮想アドレスから物理アドレスへのマッピング方法を分析します。

オーダー元、元のリンク:http://blog.csdn.net/ordeder/article/details/41654509

1背景知識

1.1プロセスのユーザースペース< Br>



図1:ソースhttp://www.open-open.com/lib/view/open1409716051963.html


構造体は、task_struct.mm_structプロセスによって定義されます。mm_structは、次のように定義されます。


?1 2 3 4 5 6 7 8 9 10 11 12 13 13 15 15 struct mm_struct {struct vm_area_struct * mmap; /* VMAのリスト* /... pgd_t * pgd; //アドレスマッピングの場合はatomic_t mm_users; /*ユーザースペースを持つユーザーの数は?* /atomic_t mm_count; /*" mm_struct"への参照数ユーザーの国t /1)* /int map_count; /* VMAの数* /... //データセグメント、コードセグメント、スタックセグメントの符号なしlong start_code、end_code、start_data、end_data、unsigned long start_brk、 Brk、start_stack、unsigned long arg_start、arg_end、env_start、env_end、unsigned long rss、total_vm、locked_vm; ...};


構造内のstartxxxおよびendxxxは、プロセスユーザースペースデータセグメントを表します。住所ヒープスペースの場合、start_brkはヒープスペースの開始アドレスであり、ヒープは拡大されます。プロセスヒープスペースの拡張のために、brkはヒープのトップ位置を記録します。プロセスによって動的に適用されるスペースのアドレススペース(使用されている変数)がマップされ、これらのアドレススペースはリンクリストstruct vm_area_struct * mmapに記録されます。

1.2アドレスマッピング

仮想アドレスと物理アドレスのマッピング:http://blog.csdn.net/ordeder/article/details/41630945


< H1> 2 malloc and free

mallocは、ユーザースペースヒープ拡張のための関数インタフェースです。この関数は、関連するシステムコール(brk())をカプセル化したglibcライブラリ関数に属するCライブラリです。システムコールの代わりに(システムにsys_malloc()を持たせることはできません。malloc関数に関連するシステムカーネルの動作について説明すると、全体をユーザースペースレベルとカーネルスペースレベルに分けることができます。)

2.1ユーザー層< Br>


mallocのソースコードは、http://repo.or.cz/w/glibc.git /blob /HEAD:/malloc /malloc.cにあります。これはユーザーレベルで機能し、ヒープを管理するのにより便利なインターフェイスをユーザーに提供します主な役割は、空きヒープ領域のバッファーリストを管理することです。バッファーは、次のデータ構造で表すことができます。 >
?1 2 3 4 5 6 7 8 9 struct malloc_chunk {INTERNAL_SIZE_T prev_size; /*前のチャンクのサイズ(空きの場合)。* /INTERNAL_SIZE_Tのサイズ; /*オーバーヘッドを含むバイト単位のサイズ)* /struct malloc_chunk * Fd; /*ダブルリンク - 空いている場合にのみ使用されます。* /malloc_chunk * bk; /*大きなブロックにのみ使用されます:次に大きいサイズへのポインタ* /struct malloc_chunk * fd_nextsize; /*二重リンク - 空きの場合にのみ使用されます。* /struct malloc_chunk * bk_nextsize;};

< Br>

空きバッファリストを簡略化したものを以下に示しますが、その先頭は前述のmalloc_chunk構造体です。次にサイズのメモリ領域は、チャンクに対応するデータ領域です。

[malloc]

プロセスがmallocを呼び出すと、まずヒープバッファ内でプロセスに割り当てるのに十分なサイズのメモリブロックを探します(選択したバッファ内のブロックが最初にヒットし、 2つのアルゴリズムをヒットしましょう。 freechunklistが必要なチャンクを満たすことができなくなった場合、mallocはシステムコールbrk()を呼び出してプロセススペースのヒープを拡張し、新しく拡張されたヒープスペースに新しいチャンクを作成してfreelistに追加します。プロセスバッチは、システムにメモリの一部を適用するように要求します(サイズは実際の要求よりはるかに大きい場合があります)。

mallocによって返されるアドレスは、データを格納するために使用されるチャンクの最初のアドレスです。つまり、次のようになります。chunk + sizeof(chunk)


mallocの簡単な疑似先読みコード:

Copyright © Windowsの知識 All Rights Reserved