1.内存地址分类: 逻辑地址、线性地址、物理地址
逻辑地址:段选择符+偏移量
线性地址:C语言中取地址符&打印出来的地址就是这个地址,也叫虚拟地址。
物理地址:内存总线寻址的具体地址,是真实存在的。
逻辑地址通过分段单元转换成线性地址,线性地址通过分页单元转换成具体的物理地址。
逻辑地址---->分段单元---->线性地址------>分页单元------>物理地址
2.硬件分段
6个段寄存器:存放段选择符,cs,ss,ds,es,fs,gs
cs:代码段寄存器
ds:数据段寄存器
ss:栈段寄存器
段描述符:GDT(全局描述符表). LDT(局部描述符表)
快速访问段描述符。
分段单元:先检查TI字段找到段描述符所在的描述符表寄存器(GDTR or LDTR),将段选择符中的index字段乘8再加上TI指向的寄存器的值得到段描述符的具体地址,
把逻辑地址的偏移量加上之前找到的段描述符中Base字段的值则得到了对应的线性地址。
Linux中的分段:Linux下逻辑地址和线性地址总是相同的。
3.硬件分页: 4KB的页 32位:页目录(最高10位) 页表(中间10位) 偏移量(最低12位)
物理地址扩展分页机制(PAE)
Linux分页:2.6内核版本采用4级分页模型:
页全局目录、页上级目录、页中间目录、页表