[Linux]进程(十)——进程地址空间

1,进程的虚拟内存:

背景知识
a.out分段以及运行时候内存的结构点击打开链接

linux进程地址空间

linux进程地址空间

\

struct mm_struct { 
        struct vm_area_struct  *mmap;               /* list of memory areas */
        struct rb_root         mm_rb;               /* red-black tree of VMAs */
		。。。。。。。。。
}
mmap和mm_rb两个不同的数据结构描述的对象都是相同的,描述的是该地址空间全部的内存区域(struct vm_area_struct),但是前者以链表形式,后者以红黑树形式,链表优点是可以高效遍历所有元素,而红黑树更适合搜索指定的元素。mm_struct结构体双向链表结构体的首元素是init_mm内存描述符,它代表init进程的地址空间.进程描述符task_struct中有一个mm域,这里边存放的就是该进程使用的内存描述符,通过current->mm便可以指向当前进程的内存描述符

内核线程没有地址空间,所以内核线程中task_struct中该成员为空。在内核调度的时候,如果发现mm_struct区域为空,则会保留前一个进程的地址空间

2,VMA结构

内存区域由vm_area_struct结构体表示,描述指定地址空间内连续空间上一个独立的内存范围。内核将每个内存区域都作为一个单独的内存对象管理,每个内存对象有一致性属性,比如访问权限等

·代码VMA,rx,有映像文件

数据VMA,rwx,有映像文件

·堆VMA,rwx,无映像文件,匿名,可向上扩展
·栈VMA,rx,无映像文件,匿名,可向下扩展


可以通过/proc/<pid>/maps的输出来查看各个进程地址空间的全部区域,每行的格式输入

开始--结束地址范围  访问权限(P代表私有,S代表共享),偏移主设备号:次设备号i节点文件

mmap()和do_mmap()函数
内核使用do_mmap()函数来创建一个新的地址空间,如果创建的地址空间和一个已经存在的地址空间相邻并且属性都相同,那么两个区间会合并为一个。do_mmap()函数会将一个地址空间加入到进程的地址空间

struct mm_struct { 
        pgd_t                  *pgd;                /* page global directory */
		。。。。。。。。
	}
页表是用来实现虚拟地址到物理地址的转变的,每个进程的内存描述符都有自己的页表,在mm_struct结构体的pgd成员指向。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值