首页 > 代码库 > MMU

MMU

page : logic virtual page

page frame : physical memory page ,

struct page {  unsigned long flags :   atomic_t count ;  struct list_head list;  struct address_space *mapping;  unsigned long index;  union  {    struct pte_chain *chain;   pte_addr_t direct;  }  unsigned long private;  #if defined WANT_PAGE_VIRTUAL   void *virtual;  #endif}

here we have the definition of memory zone :

struct zone {    spinlock_t lock; //for read and write synchronization     unsigned long free_pages; //the left blank pages    unsigned long pages_min , pages_low , pages_high ; //threshold , for kernel judging current usage situation         spinlock_t lru_lock;    struct list_head active_list;    struct list_head inactive_list;    atomic_t refill_counter;    unsigned long nr_active , nr_inactive;    int all_unreclaimable;    unsigned long pages_scanned;        int temp_priority;    int prev_priority;        struct free_area free_area[MAX_ORDER];    wait_queue_head_t *wait_table;    unsigned long wait_table_size;    unsigned long wait_table_bits;        };struct kmem_cache_s {    struct kmem_list3 lists; //partial , complete , empty list    unsigned int objsize; //object size in the cache     unsigned int flag;     unsigned int num; //num of object         unsigned int gfporder; //order of cache in page    unsigned int gfpflags; //flag of cache in page        size_t color;     unsigned int color_off;    unsigned int color_next;    kmem_cache_t *slabp_cache; //    unsigned int dflags;        void (*ctor)(void *,kmem_cache_t *,unsigned long);    void (*dtor)(void *,kmem_cache_t *,unsigned long);        const char *name; //name of object    struct list_head next;};struct mm_struct {    struct vm_area_struct *mmap;    struct rb_root mm_rb;    struct vm_area_struct *mmap_cache;    unsigned long free_area_cache;    pgd_t *pgd;    atomic_t mm_users;    atomic_t mm_count;    int map_count;    struct rw_semaphore mmap_sem;    spinloct_t page_table_lock;    struct list_head mmlist;    unsigned long start_code , end_code , start_data , end_data;    unsigned long start_brk , brk , start_stack;  //we call heap as brick, namely brk in kernel     unsigned long arg_start , arg_end , env_start , env_end;    unsigned long rss , total_vm , locked_vm;    unsigned long def_flags;    cpumask_t cpu_vm_mask;    unsigned long swap_address;    };

 

 

struct vm_area_struct {    struct mm_struct *vm_mm;     unsigned long vm_start, vm_end;        struct vm_area_struct *vm_next;    unsigned long vm_flags;    struct rb_node vm_rb;    struct vm_operations_struct *vm_ops;};

 

when application call for malloc() to expand current heap space , kernel will use sys_brk() to move brk to new place .

 

3 level paging mechanical here:

PGD : page global diretory

PMD : page middle directory

PTE : page table entry

 

MMU