正文:
- 可被进程访问的虚拟内存的地址区间称为内存区域,通过内核,进程可以给自己的地址空间动态地添加或减少内存区域。
- 进程只能访问有效内存区域内的内存地址,每个内存区域具有相关的权限,如对相关进程有可读,可写,可执行属性。如果一个进程访问了不在有效范围中的内存区域,或以不正确的方式访问了有效地址,那么内核就会终止该进程,并返回段错误信息。
- 内存区域可以包含各种内存对象:可执行文件代码的内存映射(代码段);可执行文件的已初始化全局变量的内存映射(数据段);包含未初始化全局变量,也就是bss段的零页的内存映射;用于进程用户空间栈的零页的内存映射;每个诸如c库或动态链接程序等共享库的代码段,数据段和bss也会被载入进程的地址空间;任何内存映射文件;任何共享内存段;任何匿名内存映射,比如malloc()分配的内存。
- 内核使用内存描述符结构体来表示进程的地址空间,其中包含了进程地址空间有关的全部信息。
- 内核线程没有进程地址空间,也没有相关的内存描述符。内核线程的真正含义是它们没有用户上下文。内核线程并不需要访问任何用户空间的内存,其在用户空间中没有任何页。
- 创建地址区间函数:do_mmp().删除地址区间函数:do_munmmp().
- 地址转换需要将虚拟地址分段,使每段虚拟地址都作为一个索引指向页表,而页表项则指向下一级别的页表或最终的物理页面。Linux使用了三级页表。
- 每个进程都有自己的页表,操作和检索页表时必须使用page_table_lock锁,该锁在相应的进程的内存描述符中,以防止竞争条件。
- TLB作为一个将虚拟地址映射到物理地址的硬件缓存,可以加快内存访问。