linux內存描述符mm_struct


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; //存放着當前進程使用的段起始地址
};


struct vm_area_struct
{
struct mm_struct *vm_mm; //The address space we belong to
unsigned long vm_start; //our start address within vm_mm
unsigned long vm_end;

struct vm_area_struct *vm_next;

pgprot_t vm_page_prot; //Access permission of this VMA
unsigned long vm_flags;

rb_node_t vm_rb; //rb Tree

struct vm_area_struct *vm_next_share;
struct vm_area_struct *vm_pprev_share;

struct vm_operations_struct *vm_ops; //Function pointer to deal with this struct

unsigned long vm_pgoff;

struct file *vm_file;
unsigned long vm_raend;
void *vm_private_data;
};


struct vm_operations_struct
{
void (*open)(struct vm_area_struct *area);
void (*close)(struct vm_area_struct *area);
struct page *(*nopage)(struct vm_area_struct *area,unsigned long address,int unused);
};


typedef struct rb_node_s
{
struct rb_node_s *rb_parent;
int rb_color;
#define RB_RED 0
#define RB_BLACK 1
struct rb_node_s *rb_right;
struct rb_node_s *rb_left;
}rb_node_t;

typedef struct rb_root_s
{
struct rb_node_s *rb_node;
}rb_root_t;

//在樹中,所有的vm_area_struct虛存段都作為樹的一個節點,節點中vm_rb的左指針rbleft指向相鄰的低地址虛存段,右指針rbright指向相鄰的高地址虛存段
//用於調整紅黑樹的平衡
static void __rb_rotate_left(rb_node_t *node,rb_root_t *root);
static void __rb_rotate_right(rb_node_t *node,rb_root_t *root);

//插入一個新節點
void rb_insert_color(rb_node_t *node,rb_root_t *root);
//刪除一個節點
static void __rb_erase_color(rb_node_t *node,rb_node *parent,rb_root_t *root);
//刪除后對剩余顏色的調整
void rb_erase(rb_node_t *node,rb_root_t *root);


//對給定的內存地址找到屬於哪一個內存區域
struct vm_area_struct *find_vma(struct mm_struct *mm,unsigned long addr)
{
struct vm_area_struct *vma=NULL;

if(mm)
{
vma=mm->mmap_cache;
if(!(vma&&vma->vm_end>addr&&vma->start<=addr))
{
struct rb_node *rb_node;
rb_node=mm->mm_rb.rb_node;
vma=NULL;
while(rb_node)
{
struct vm_area_struct *vma_tmp;

vma_tmp=rb_entry(rb_node,struct vm_area_struct,vm_rb);

if(vma_tmp->vm_end>addr)
{
vma=vma_tmp;
if(vma_tmp->vm_start<=addr)
break;
rb_node=rb_node->rb_left;
}
else
rb_node=rb_node->rb_right;
}
if(vma)
mm->mmap_cache=vma;
}
}
return vma;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM