Linux内存寻址——分页与分段

2020-09-12  本文已影响0人  睡不醒的大橘

物理地址与虚拟地址

  1. 内存使用效率低。有内存碎片的问题。
  2. 进程地址空间不隔离。一个进程中的代码可以更改正在由另一进程或操作系统使用的物理内存。
  3. 运行的地址不确定。由于操作系统给进程分配的物理地址是不确定的,而某些硬件是需要在固定的地址才能运行。

分段机制

分段机制
段选择符
逻辑地址到线性地址的转换
  1. 通过逻辑地址中 段选择符的TI 判断描述符是在GDT还是LDT中
  2. 段描述符地址 = GDT/LDT首地址 + index * 8
  3. 线性地址 = 段描述符地址 + 偏移量
Linux中的分段

分页机制

分页机制
  1. 给每一个进程分配一块不同的物理地址空间,这确保了可以有效地防止寻址错误。
  2. 区别页(即一组数据)和页框(即主存中的物理地址)之不同。这就允许存放在某个页框中的一个页,然后保存到磁盘上,以后重新装入这同一页时又被装在不同的页框中。
页表
Linux四级分页
  1. 页全局目录(Page Global Directory):包含若干页上级目录的地址;
  2. 页上级目录(Page Upper Directory):包含若干页中间目录的地址;
  3. 页中间目录(Page Middle Directory):包含若干页表的地址
  4. 页表(Page Table):每一个页表项指向一个页框

线性地址因此被分成五个部分:

进程页表
  1. 从0×00000000到0xbfffffff的线性地址,无论进程运行在用户态还是内核态都可以寻址。
  2. 从0xc0000000到0xffffffff的线性地址,只有内核态的进程才能寻址。

即进程的第4个G保留给内核,前3个G可供内核和用户程序同时访问。

上一篇 下一篇

猜你喜欢

热点阅读