物理页面page的数据结构分析
typedef struct page{
struct list_head list;
struct address_space *mapping;
unsigned long index; /*如果页面属于某个文件,代表页面在文件中的序号;页面内容被换到交换设备上,但还保留内容作缓冲时,指明页面去向。*/
struct page *next_hash;
atomic_t count; /*指明页面被共享进程的个数,对这个属性的操作必须是原子性的*/
unsigned long flags;/*这个标志用于I/O同步*/
struct list_head lru;/*指明页面当前的属于哪个列表*/
unsigned long age;/*页面的年龄,在页面换出的时候作为参考*/
wait_quence_head_t wati;/*等待队列指针*/
struct page **pprev_hash;
struct buffer_head *buffer;/*如果该页作为缓冲区,则指示地址*/
void *virtul;
struct zone_struct zone;/*指明页面处在那个管理区*/
} mem_map_t;
MM_STRUCT结构
mm_struct结构用来描述一个进程的虚拟内存,在/include/linux/sched.h中描述如下:
struct mm_struct{
struct vm_area_struct mmap;/*用来建立一个虚存空间结构的单链线性队列*/
struct vm_area_struct mmap_avl;/*建立一个虚存空间结构的AVL树*/
struct vm_area_struct mmap_cache;/*指向最近一次用到的那个虚存空间的结构*/
pgd_t * pgd; /*进程的页目录,当内核调度一个进程进入运行时,将这个指针转化成物理地址,写入CR3*/
atomic_t mm_users;
atomic_t mm_count;/*和上一个属性一起,方面mm_struct被其他进程共享所设置的*/
int map_count;
struct semaphore mmap_sem;/*对mmap操作的互斥信号量*/
spinlock_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;/*堆栈段的起始*/
unsigned long arg_start,arg_end,env_start,env_end;/*存放进程参数位置、环境变量的起始位置*/
unsigned long rss,total_vm,locked_vm;
unsigned long def_flags;
unsigned long cpu_vm_mask;
unsigned long swap_cnt;/*反映一个进程在一轮换出页面的努力中尚未受到考察的页面数量*/
unsigned long swap_address;
mm_context_t context;/*有关进程的上下文,在进程切换的时候使用*/};
vm_area_struct描述一个进程的虚拟地址区域,在/include/linux/mm.h中描述如下: struct vm_area_struct{ struct mm_struct * vm_mm;/*虚存区间参数*/ unsigned long vm_start;/*虚存区间的起始地址包含在虚存区间里*/ unsigned long vm_end;/*虚存区间的结束地址不包含在虚存区间里*/ struct vm_area_struct *vm_next;/*连接同属一个进程但有不同权限的虚存区间*/ pgprot_t vm_page_prot;/*访问权限*/ unsigned long vm_flags;/*属性*/ short vm_avl_height;/*AVL树高*/ struct vm_area_struct * vm_avl_left;/*左子树*/ struct vm_area_struct * vm_avl_right;/*右子树*/ struct vm_area_struct *vm_next_shart; struct vm_area_struct **vm_pprev_share; struct vm_operations_struct *vm_ops;/*描述在这个虚存区间上的操作*/ unsigned long vm_pgoff; struct file * vm_file;/*和下个属性一起用于记录和管理虚存区间与磁盘文件的联系*/ unsigned long vm_raend; void * vm_private_data;};
struct vm_area_struct{
struct mm_struct * vm_mm;/*虚存区间参数*/
unsigned long vm_start;/*虚存区间的起始地址包含在虚存区间里*/
unsigned long vm_end;/*虚存区间的结束地址不包含在虚存区间里*/
struct vm_area_struct *vm_next;/*连接同属一个进程但有不同权限的虚存区间*/
pgprot_t vm_page_prot;/*访问权限*/
unsigned long vm_flags;/*属性*/
short vm_avl_height;/*AVL树高*/
struct vm_area_struct * vm_avl_left;/*左子树*/
struct vm_area_struct * vm_avl_right;/*右子树*/
struct vm_area_struct *vm_next_shart;
struct vm_area_struct **vm_pprev_share;
struct vm_operations_struct *vm_ops;/*描述在这个虚存区间上的操作*/
unsigned long vm_pgoff;
struct file * vm_file;/*和下个属性一起用于记录和管理虚存区间与磁盘文件的联系*/
unsigned long vm_raend;
void * vm_private_data;};