Linux中数据结构的分析——原创 转载请通知

本文主要对Linux系统中物理页面page和虚存区间vm_area_struct的数据结构进行分析。详细列出了page结构体的各项属性,如列表、映射、索引等;也展示了vm_area_struct结构体的参数,包括起始地址、结束地址、访问权限等,有助于了解系统内存管理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

物理页面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;};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值