第二章:内存寻址
使用80X86时必须区分三种地址:
逻辑地址:包含在机器语言指令中,用来指定一个操作数或一条指令的地址。每个逻辑地址都有一个段segment和偏移量offset(displacement)组成,偏移量指明了从段开始的地方到实际地址之间的距离
线性地址(虚拟地址):一个32位无符号整数,可用来表示高达4GB的地址,常用16进制数字表示,范围从0x00000000到0xfffffff
物理地址:用于内存芯片级内存单元寻址。它们与从微处理器的地址引脚发送到内存总线上的电信号相对应。由32位或36位无符号整数表示
内存控制单元(MMU):逻辑地址通过分段单元(硬件电路)转化到线性地址通过分页单元(硬件地址)转换到物理地址
一个逻辑地址:段标识符(段选择符)+偏移量
段寄存器存放段选择符,段寄存器有6个,有三个专用:
cs 代码段寄存器(含有一个2位字段,用于指明CPU当前特权级CPL)
ss 栈段寄存器
ds 数据段寄存器
在linux下逻辑地址与线性地址是一致的,即逻辑地址的偏移量字段的值与相应的线性地址的值总是一致的
区分页和页框:页只是一个数据块,可以存放在任何页框或磁盘中
当访问一个RAM存储单元时,CPU从物理地址中提取出子集的索引号并把子集中所有行的标签与这个物理地址的高位相同,则CPU命中一个高速缓存
对于写操作,控制器有两个策略:回写,通写
回写:只更新高速缓存,不改变RAM内容
通写:既写RAM也写高速缓存
LINUX把PC体系结构保留的页框来动态存放所分配的页
内核使用固定映射的线性地址表来代替指针变量
任何进程切换都会暗示这更换活动页表集,相对于过期页表,本地TLB表项必须被刷新;这个过程在内核把新的页全局目录的地址写入cr3控制寄存器时会自动完成
内核线程使用的是普通进程的页表集