IA_32地址转换
逻辑地址 –> 线性地址 –> 物理地址
|-虚拟地址的两种表示-|
分段:逻辑地址到线性地址
逻辑地址=段选择符+有效地址
有效地址=基址+比例变址+位移量
段选择符:由指令显示或隐式给出,存在段寄存器中(CS,SS,DS,ES等)
段选择符=13位段表索引+全局/局部段标志+访问级别(0最高,3最低)
由段表索引去段表查到相应的段基址
段表:段描述符8B,每一项描述段的段基址,长度,权限等
项分两类:
1. 普通段描述符(用户内核的代码段,数据段)
2. 系统控制段描述符(特殊系统控制段LDT,TSS,控制转移段)
表分三种类型:
1. GDT:全局段表,所有任务共有的段,包括用户内核数据段代码段TSS(任务状态段)等
2. LDT:某个任务专有的段
3. IDT:中断描述符表
不可见寄存器:
1. 段描述符cache:
段表是存在主存里的,为了加快速度,在第一次使用后把段表加入到cache
2. TSS/LDT寄存器:存放段选择符,其描述符在GDT中
3. GDT/IDT寄存器:给出段表的主存首地址,界限
线性地址=段基址+段偏移(有效地址)
根据逻辑地址的段选择符,去查(cache/主存)段表得到段基址,相加得到线性地址
linux对段表的简化:
所有的段基址都是0,也就是逻辑地址=线性地址
MMU:地址转换部件,实现地址转换的硬件
分页:线性地址到物理地址
页目录:整个4GB都要分页,一张页表太大,所以分成1K(页目录) * 1K(页表) * 4KB形式
页目录:1k项,每项对应一张页表
页表:1k项,每项对应一页4KB
线性地址通过查二级页表+页内偏移的方式访问主存