您的位置:首页 > 运维架构 > Linux

读深入理解Linux内核 (第9章 进程地址空间, 第一部分 ---- 概念)

2016-10-21 18:02 543 查看

进程地址空间的概念

不同于内核态,用户态进程请求内存,并不立即分配页面,而是得到一段线性地址,这些地址被访问时内核才分配页面。

一个进程的地址空间包括所有它可以使用的线性地址,每个进程的地址空间不相同,内核可以动态增加或删除进程的线性地址区间。

内核用内存区域(MemoryRegion)来表述一段线性地址区间,以下是创建内存区域的典型情景。

1. 当用户在控制台敲下命令时,shell进程创建一个新的进程,该进程共用shell进程的地址空间

2. 新进程装载程序时,释放旧的地址空间,创建新的内存区域,比如代码区,堆栈区

3. map文件时

4.用户态的堆栈扩张时

5.进程间内存共享

6.malloc()

内存描述符(mm_struct)

进程的地址空间用mm_struct描述,存放在进程描述符的mm字段

内核线程的内存描述符

内核线程只在内核态运行,它们从不访问小于TASK_SIZE(0xC0000000)的地址空间。事实上,大于TASK_SIZE的线性地址区域对应的页表是相同的,也就是说,无论进程怎么切换,它们在这部分区域的页表是相同的(映射高端内存时会改变)。因此切换到内核线程时,会沿用之前进程的页表和内存描述符,这样避免了页表更新。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息