Chinaunix首页 | 论坛 | 博客
  • 博客访问: 106147
  • 博文数量: 11
  • 博客积分: 176
  • 博客等级: 入伍新兵
  • 技术积分: 125
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-06 10:02
文章分类

全部博文(11)

文章存档

2012年(11)

我的朋友

分类: LINUX

2012-04-18 10:45:16

1.内存地址
 逻辑地址(logical address)也叫虚拟地址(virtual address)指的是机器语言指令中,用来指定一个操作数或者是一条指令的地址。在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干。只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换)
 
 线性地址(linear address)是逻辑地址到物理地址变换之间的中间层。程序代码会产生逻辑地址,或者说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址。如果启用了分页机制,那么线性地址可以再经变换以产生一个物理地址。若没有启用分页机制,那么线性地址直接就是物理地址。Intel 80386的线性地址空间容量为4G(2的32次方即32根地址总线寻址)。
 物理地址(physical address)用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。
三者关系:
    逻辑地址---分段单元-->线性地址---分页单元-->物理地址

 
2.分段
 分段单元把逻辑地址转换成线性地址。
 逻辑地址由16位的段标识符(段选择符)和32位的段内相对地址的偏移量组成。段寄存器的唯一目的是存放段选择符。
 每一个段都由一个8字节的段描述符表示。段描述符放在全局描述发表(GDT)或局部描述符表(LDT)中。GDT在主存中的地址和大小存放在gdtr控制寄存器中,LDT在主存中的地址和大小存放在ldtr控制寄存器中。
 linux中所有段都从0x00000000开始,所以linux下逻辑地址与线性地址是一致的。2.6版的Linux只有在80x86结构下才需要使用分段。
 linux中每个CPU对应一个GDT,所有的GDT都存放在cpu_gdt_table数组中;而所有GDT的地址和它们的大小存放在cpu_gdt_descr数组中。
 
3.硬件中的分页
 分页单元把线性地址转换成物理地址。
 Intel处理器的分页单元处理4KB的页。二级分页模式将32位线性地址分成3个域:
Directory(页目录) 最高的10位; Table(页表):中间10位; Offset(偏移量):最低12位。
 每个活动的进程必须有一个分配给它的页目录,但没必要立刻为该进程的所有页表都分配RAM,只有在进程实际需要一个页表时,才分配RAM。
 扩展分页允许页框大小为4MB,即使用一级分页模式:
Directory(页目录) 高的10位;Offset(偏移量):低22位。
 
 物理地址扩展(PAE)分页机制可将32位线性地址转换为36位的物理地址。引入了页目录指针表(PDPT),即增加了页表级别。页表项的物理字段从20位扩展到24位,而PAE页表项也必须包含12个标志位,页表项需占36位,所以使页表项大小由32位变为64位。此时4KB的页表包含512个页表项,只需线性地址中的9位就能识别。在这种模式下,cr3寄存器包含PDPT基地址字段。
当线性地址映射到4KB的页时,线性地址按以下方式解析:
cr3      :     指向PDPT
位31-30  :     指向PDPT中4个项中的一个
位29-21  :     指向页目录中512个项中的一个
位20-12  :     指向页表中512个项中的一个
位11-0   :     4KB页中的偏移量
当线性地址映射到2MB的页时,线性地址按以下方式解析:
cr3      :     指向PDPT
位31-30  :     指向PDPT中4个项中的一个
位29-21  :     指向页目录中512个项中的一个
位20-0   :     2MB页中的偏移量
阅读(1450) | 评论(0) | 转发(0) |
0

上一篇:80X86寄存器介绍

下一篇:80x86 CPU工作模式

给主人留下些什么吧!~~