Linuxカーネル検討--第七章

2738 ワード

本文は個人が《Linuxカーネルの設計と実現》を分析して書いた総括で、転載を歓迎して、出典を明記してください:
                                                                               http://blog.csdn.net/dlutbrucezhang/article/details/13621133
第七章--プロセスアドレス空間
カーネルはカーネルアドレス空間で実行され、それに応じて、ユーザープログラムは実行する必要があり、アドレス空間も必要であることは間違いなく、これは実際にはリソースに属している.プロセスは独自のアドレス空間で実行され、プロセス記述子にはこのアドレスを指すポインタがあります.スレッドには独自のアドレス空間がないので、プロセスとアドレス空間を共有します.つまり、スレッドのアドレス空間フィールドもそのプロセスのアドレス空間を指します.
      1.アドレス空間
メモリ領域は、複数の異なるメモリオブジェクトを含む仮想メモリ領域とも呼ばれます.
コードセグメント:実行可能ファイルのメモリマッピング
≪データ・セグメント|Data Segments|oem_src≫:ファイルが初期化されたグローバル変数のメモリ・マッピングを実行できます.
bssセグメント:ファイルが初期化されていないグローバル変数のメモリマッピングを実行可能
プロセスのユーザースペーススタックのゼロページメモリマッピング
共有ライブラリのコードセグメント、データセグメント、bssセグメントもプロセスのアドレス空間に含まれます.
      ......
      2.メモリディスクリプタ
プロセスのアドレス空間をよりよく理解するために、まずデータ構造を貼り付け、その後、フィールドを簡単に紹介します.
struct mm_struct
{
    struct vm_area_struct *mmap;     //list of VMA
    rb_root_t mm_rb;                     //  vma       
    struct vm_area_struct *mmap_cache;   //last find_vma result               
    pgd_t *pgd;                            //          
    atomic_t mm_users;                    //how many users with user space
    atomic_t mm_count;                    //how many reference to "struct mm_struct"
    int map_count;                        //Number of VMA
    struct rw_semaphore mmap_sem;        // mmap        
    spinlock_t page_table_lock;            //Protects task page tables and mm->rss
    struct list_head mmlist;            //list of all active mm's. These are globally together off init_mm.mmlist,and are protected by mmlist_lock
    unsigned 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;     //rss                
    unsigned long def_flags;
    unsigned long cpu_vm_mask;
    unsigned long swap_address;     //              

    unsigned dumpable:1;
    //Architecture-specific MM context
    mm_context_t context;                //               
};

プロセスには、コードセグメント、データセグメント、bssエンド、スタックなどのメモリ領域が含まれていることがわかります.各メモリ領域について、マッピングされた物理メモリ、パーミッション(読み取り可能、書き込み可能、実行可能)など、一貫したプロパティ記述があります.
      3.mm_structとカーネルスレッド
カーネルスレッドはユーザのアドレス空間にアクセスしないため、アドレス空間は存在しないが、このフィールドは空ではないので、効率のためにLinuxの設計案はカーネルスレッドが実行されると、前の実行プロセスのアドレス空間フィールドを使用し、もちろんプロセスのページテーブルを含む.カーネルスレッドはユーザアドレス空間にアクセスしませんが、カーネルと対話する必要があります.