linuxメモリ管理ノート--1

2547 ワード

1)プロセス毎にtask_があります.struct構造体
2)task_structはmm_を含みますstruct構造体、これがプロセスのメモリ管理者(カーネル中のデータ構造)です.
3)mm_structには二つのチェーンが含まれています.rb_vマ    リスト.vmaは、実際には、プロセスのvmaチェーンを指していますが、組織の方式は違っています.
4)vmaとは何ですか?https://blog.csdn.net/ywf861029/article/details/6114794
各プロセスには4 Gの仮想アドレス空間があります.この4 G空間をどのように管理しますか?メモリ領域を通じて説明します.
struct vm_area_struct {
        struct mm_struct             *vm_mm;        /* associated mm_struct */
        unsigned long                vm_start;      /* VMA start, inclusive */
        unsigned long                vm_end;        /* VMA end , exclusive */
        struct vm_area_struct        *vm_next;      /* list of VMA's */
        pgprot_t                     vm_page_prot;  /* access permissions */
        unsigned long                vm_flags;      /* flags */
        struct rb_node               vm_rb;         /* VMA's node in the tree */
        union {         /* links to address_space->i_mmap or i_mmap_nonlinear */
                struct {
                        struct list_head        list;
                        void                    *parent;
                        struct vm_area_struct   *head;
                } vm_set;
                struct prio_tree_node prio_tree_node;
        } shared;
        struct list_head             anon_vma_node;     /* anon_vma entry */
        struct anon_vma              *anon_vma;         /* anonymous VMA object */
        struct vm_operations_struct  *vm_ops;           /* associated ops */
        unsigned long                vm_pgoff;          /* offset within file */
        struct file                  *vm_file;          /* mapped file, if any */
        void                         *vm_private_data;  /* private data */
};
ユーザプロセスがアドレス空間の一部を申請すると、2つのシナリオが存在するかもしれません.
  1)新規のアドレス空間が既存のvmaで説明されているメモリ属性線と同じであれば、現在のvmaにマージされ、vmaの長さ+1
  2)新規出願のアドレス空間が、既存のvmaと何の関連もない場合、新たにvmaを作成する.
 
vmaのいくつかの質問:
  1)vmaは本当のメモリアドレスですか?もちろん、vmaは現在のプロセス4 G空間の使用状況を説明するためだけに使用されます.
  2)Vmaが本当のアドレスでない場合、ユーザーはどのように真実のメモリにアクセスしますか?
         大体の流れはこうです.
        1)プロセスがある仮想アドレスにアクセスしようとすると、アドレス空間がvma記述のアドレス範囲内に含まれていることを確認し、仮想アドレス空間に対応するvma_を返す.struct;
         2)cpuのmmuユニットは、まずcr 3レジスタから現在のプロセスのページ表を取り出し、ページ表から仮想アドレスに対応する真実のページを見つけます.
          プロセスのページ表は最初は空いていますが、ページがプロセスのページ表にないとどうなりますか?vm_アーアアウstruct構造の中のvm_ops->nopageが指し示す関数は、落丁異常なアドレスを生成します.
この住所はプロセスのページ表にマークされますか?できるでしょう?そして、プロセスのページ表は古いデータを定期的に削除するべきですか?