全部博文(436)
分类: LINUX
2012-12-03 23:26:30
通过对《深入理解LINUX》第二章有关内存寻址方面的内容的阅读以及相关资料的查阅,对内存寻址及管理方面有了初步的认识。
1. 内存寻址主要任务:将逻辑地址转换为物理地址。
逻辑地址:包含在机器语言指令中用来指定一个操作数或一条指令的地址。
线性地址:一个32位无符号整数,也称虚拟地址。
物理地址:用于内存芯片级内存单元寻址,与从微处理器的地址引脚发送到内存总线上的电信号相对应。
逻辑地址---通过分段单元-线性地址----通过分页单元---》物理地址
2. 在多处理器系统中,所有CPU都共享同一内存,这意味着,RAM芯片可以由独立的CPU并发地访问。由于RAM芯片上的读或写操作必须串行地执行,因此一种所谓内存仲裁器的硬件电路插在总线和每个RAM芯片之间,其作用是如果某一个RAM芯片空闲,就准予一个CPU访问,如果该芯片忙于为另一个处理器提出的请求服务,就延迟这个CPU的访问。
3. 内存寻址的工作是由Linux内核和MMU共同完成的,其中Linux内核负责cr3,gdtr等寄存器的设置,页表的维护,页面的管理,MMU则进行具体的映射工作。
4. 硬件MMU,通过分段单元的硬件电路把一个逻辑地址转换成线性地址,再通过分页单元把线性地址转换成物理地址。
5. 分段
有6个段寄存器:cs,ss,ds,es,fs,gs。
其中cs 代码段寄存器,指向包含程序指令的段(一个进程中)
重要:两位字段CPL(Current Privilege Level),为0表示最高优先级,为3表示最低优先级。Linux只用0级 和 3级,分别称为 内核态、用户态。
ss 栈段寄存器,指向包含当前程序栈的段(一个进程中)
ds 数据段寄存器,指向包含静态数据或任意的数据段(一个进程中)
其他三个寄存器做一般用途,可以指向任意的数据段。
分页
1) 常规分页:
32位被分为3个域,Directory(高10位),Table(中间10位),Offset(最低12位)。
2)扩展分页
允许页框大小是 4MB,(之前是4Kb)
Directory:高10位
Offset:低22位
PAE(physical Address Extend)。
3)Linux中的分页
页全局目录(Page Global Directory)
页上级目录(Page Upper Directory)
页中间目录(Page Middle Directory)
页表(Page Table)
偏移(Offset)
进程页表:从0x0000 0000 到 0xbfff ffff,用户态、内核态都可以寻址
0xc000 0000 到 0xffff ffff,(3G~ 4G-1),只有内核态进程才能寻址。
0xc000 0000 (3G)这个值PAGE_OFFSET的值。进程在线性地址空间的偏移量。也是内核生存空间的开始之处。
Linux在初始化阶段一般是将896MB的RAM窗口 映射到 内核线性地址空间。(所以程序对RAM分<896MB, 896MB<= x <=4096Mb,x>4096Mb)
问题:
分段和分页的主要区别,因为感觉它们好像差不多。
虚拟地址为什么可以保护操作系统?
LINUX内核安装在RAM中从物理地址0x0010000开始的地方,也就是从第二个MB开始,那为什么不从第一个MB开始呢?