全部博文(436)
分类: LINUX
2012-12-03 18:02:16
《深入理解Linux内核》
1. 内存地址大致分为以下三类(包括转换方式):
逻辑地址 à (通过分段单元) à 线性地址 à (通过分页单元) à 物理地址
在多处理器计算机中,所有CPU 共享同一内存,因此存在仲裁器.
双pentium下,不懂什么叫在试图使用公共总线前请求两个CPU交换同步信息?
2. 分段单元
首先介绍几个概念:
逻辑地址 = 段选择符(16位) + 偏移地址(32位)
段选择符 = 索引号(13位) + TI(1位) + RPL(1位)
段描述符 = BASE(0~15) + LIMIT(0~15)
LDT: local descriptor table
GDT: global descriptor table
分段单元工作过程:
首先通过段选择符的TI位辨别对应的段描述符是在LDT中还是 GDT中,然后通过把段选择符中的索引号*8 加上根据TI所确定的段描述符表地址相加(由于段描述符为8个字节,所以地址为8的倍数),得到表中对应段描述符的地址,再从段描述符中取出BASE中的基址与逻辑地址中的偏移地址相加,就得到了对应的线性地址。
文中还提到了快速访问段描述符:
通过提供一种非编程的寄存器,来存放段寄存器中段选择符指定的段描述符,这样就可以不通过GDT 或LDT来获取段选择符了,能直接得到线性地址。
但是有个问题,既然这样更快,而且非编程寄存器有足够的地方来存放6个可编程段寄存器的指定的段描述符的话,为什么还要有GDT和LDT的存在呢?直接在用的时候将描述符从内存移入非编程寄存器中不行吗?
linux中的分段:
由于linux中所有与段相关的线性地址都是从0开始,即所有段都是从0X00000000开始的,所以在linux下,逻辑地址与线性地址是一致的。
但是对于linux中GDT和LDT之间的关系有点混乱。
3. 分页单元
线性地址 = Directory(10位) + table(10位 ) + offset(12位)
页框: 主存的一部分,是真实存在的。
页:连续的地址空间,抽象存在的。
分页单元工作过程:
由于正在使用的页目录的物理地址存在cr3寄存器中,再结合线性地址中的directory找到对应的目录项以找到页表,再根据线性地址的table项找到对应的页表项以找到对应的页,在根据offset找到对应的页框中的相对位置。由此物理地址得到了。
常规分页举例能帮助跟好的理解分页工作过程,建议组员好好看看。
扩展分页:
省去了页表这个中间项,因为每个页框的大小从12位变成了22位,即由4KB变成了4MB,所以每个页框的地址都是4MB的倍数,因此偏移地址的高十位才是真正有效的。
在linux中的机制有部分理解起来有点费劲。
《深入理解计算机系统》
又多了解了CPE一点,还不是完全懂,但是大概了解了怎么回事,每元素周期数,也可以说是每元素时钟周期消耗数,比如,每个被计算的元素都要从存储器中读值,而加载单元每个时钟周期只能启动一次,则CPE=1,这也是为什么CPE最小为1,不能再小了的原因。
对于加载和存储操作之间相互的影响没看懂,虽然前一部分说明看的微懂,但是在画图以及汇编代码那一部分完全没懂,之前的头绪也混乱了,write_read内循环操作没搞懂是怎么回事。