Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2208013
  • 博文数量: 436
  • 博客积分: 9833
  • 博客等级: 中将
  • 技术积分: 5558
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-29 10:27
文章存档

2013年(47)

2012年(79)

2011年(192)

2010年(118)

分类: 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个可编程段寄存器的指定的段描述符的话,为什么还要有GDTLDT的存在呢?直接在用的时候将描述符从内存移入非编程寄存器中不行吗?

 

linux中的分段:

由于linux中所有与段相关的线性地址都是从0开始,即所有段都是从0X00000000开始的,所以在linux下,逻辑地址与线性地址是一致的。

但是对于linuxGDTLDT之间的关系有点混乱。

 

3.       分页单元

线性地址 = Directory(10) + table(10 ) + offset(12)

页框: 主存的一部分,是真实存在的。

页:连续的地址空间,抽象存在的。

 

分页单元工作过程:

由于正在使用的页目录的物理地址存在cr3寄存器中,再结合线性地址中的directory找到对应的目录项以找到页表,再根据线性地址的table项找到对应的页表项以找到对应的页,在根据offset找到对应的页框中的相对位置。由此物理地址得到了。

常规分页举例能帮助跟好的理解分页工作过程,建议组员好好看看。

扩展分页:

省去了页表这个中间项,因为每个页框的大小从12位变成了22位,即由4KB变成了4MB,所以每个页框的地址都是4MB的倍数,因此偏移地址的高十位才是真正有效的。

linux中的机制有部分理解起来有点费劲。

 

《深入理解计算机系统》

    又多了解了CPE一点,还不是完全懂,但是大概了解了怎么回事,每元素周期数,也可以说是每元素时钟周期消耗数,比如,每个被计算的元素都要从存储器中读值,而加载单元每个时钟周期只能启动一次,则CPE=1,这也是为什么CPE最小为1,不能再小了的原因。

     对于加载和存储操作之间相互的影响没看懂,虽然前一部分说明看的微懂,但是在画图以及汇编代码那一部分完全没懂,之前的头绪也混乱了,write_read内循环操作没搞懂是怎么回事。

        

阅读(643) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~