全部博文(436)
分类: LINUX
2013-03-10 15:56:00
内存寻址读书报告
1 80x86处理器有哪三种不同内存地址
<1> 逻辑地址:根据汇编语言知识,逻辑地址应该由段基地址和偏移地址组成。段基地址为初始的地址,偏移地址为初始的地址到实际地址之间的距离。(由后面只是可以知道,逻辑地址由16位段选择符和32位偏移量组成)
<2> 线性地址:是一个32位无符号整数,通常用16进制数字表示,最高表示4GB的地址。
<3> 物理地址:我理解为与硬件相关的实际存在的地址。与从微处理器的地址引脚发送到内存总线上的电信号相对应。
2 三种地址之间如何进行转换
内存控制单元通过分段单元这种硬件电路把逻辑地址转换为线性地址,通过分页单元这种硬件电路把线性地址转化为物理地址。
3 在多处理器系统中,多个芯片如何并发访问内存
通过内存仲裁器来进行调节。
内存仲裁器(memory arbiter):作用是如果某个RAM芯片空闲,就准予一个CPU访问如果该芯片忙于为另一个CPU提出的请求服务,就延迟这个CPU的访问。
注意:在单处理器上也需要有内存仲裁器,单处理器系统中包含一个叫做DMA控制器的特殊处理器,而DMA控制器与CPU并发操作。因此也需要内存仲裁器来调整。
4 段寄存器有哪几个,其作用是
段寄存器的唯一目的是存放段选择符。汇编语言中曾经学过,段寄存器有六个:cs,ds, ss,es,fs,gs。其中cs ds ss三个寄存器有专门用途,而剩余三个用作一般用途,可以指向任意的数据段。
CS:代码段寄存器,指向包含程序指令的段。
DS:数据段寄存器,指向包含静态数据或者全局数据段。
SS:堆栈段寄存器,只想包含当前程序段的栈。
注:cs寄存器包含一个两位的字段,称为CPL(current privilege level)指明CPU的当前特权级。值为0代表最高优先级,值为3代表最低优先级。Linux只用0级和3级,称为内核态和用户态。
5 Linux 中广泛采用的段及他们的段描述符有哪些
注:首先明确的几个概念:
<1>段描述符:每个段由一个8个字节的段描述符表示,描述了段的特征。
<2>GDT与LDT:分别表示全局描述符表和局部描述符表,用来储存段描述符。
代码段描述符:表示这个段描述符代表一个代码段,可以放在一个GDT或LDT中。该描述符置S标志为一。(S为系统标志,清0表示这是一个系统段,否则表示为普通的代码段或数据段。)
数据段描述符:表示这个段描述符代表一个数据段,放在GDT或LDT中,置S标志为1。(栈段通过一般的数据段来实现)
任务状态段描述(TSSD):表示这个段描述符代表一个任务状态段,即这个段用来保存处理器寄存器的内容,只出现在GDT中,将S标志置为0。TYPE的值为11或9(TYPE字段描述了段的类型特征和存取权限)
局部描述符表描述符(LDTD):表示这个段描述符代表一个包含LDT的段,只出现在GDT中。S标志置为0。TYPE字段的值为2。
6 如何快速访问段描述符
通过80x86处理器提供的一种非编程寄存器,来加速逻辑地址转变为线性地址,来快速访问段描述符。
具体方式:每当一个段选择符被装入段寄存器时,相应的段描述符就由内存装入到对应的非编程CPU寄存器。从那时起,针对那个段逻辑地址转换就可以不访问主存中的GDT或LDT,处理器只需直接引用存放段描述符的CPU寄存器即可。仅当寄存器的内容改变时,才有必要访问GDT或LDT。
7 逻辑地址怎样转换为线性地址
由分段单元这种电路来完成。
<1> 先检查段选择符的TI字段(TI标志:指明段描述符是在GDT中(TI=0)还是在LDT中(TI=1)),以决定段描述符保存在哪个描述符表中,TI字段指明段描述符是在GDT中(这种情况下,分段单元从gdtr寄存器中得到GDT的线性基地址)还是在LDT中(这种情况下,分段单元从ldtr寄存器中得到LDT的线性基地址)。
<2> 从段选择符的index(index 指定了放在GDT或LDT中的相应段描述符的入口)字段计算段描述符的地址,index字段的值乘以8(一个段描述符的大小),这个结果与gdtr或ldtr寄存器中的内容相加。
<3> 把逻辑地址的偏移量与段描述符的Base字段的值相加就得到了线性地址。
8.对页寻址的标准:若User、Supervisor为0,只有当CPL小于3时才能对页寻址;若该标志为1,则总能对页寻址。
9.页的存取权限:不同于段的三种存取权限(读,写,执行),页的存取权限只有两种(读,写)若页表目录项或页表项的Read、Write标志等于0,则相应的页表或页是只读的,否则是可读写的。
10.假设进程需要读线性地址0x20021406中的字节。这个地址由分页单元按下面的方法处理:
1.Directory字节的0x80用于选择页目录的第0x80目录项,此目录项指向和该进程的页相关的页表。
2.Table字段0x21用于选择页表的第0x21表项,此表项指向包含所需页的页框。
3.最后,Offet字段0x406用于在目标页框中读偏移量为0x406中的字节。
11.64位系统中的分页
32位微处理器采用的两级分页不适用于64位系统的计算机,64位处理器的硬件分页系统使用了额外的分页级别
12.硬件高速缓存:
高速缓存再被细分为行的子集。在一种极端的情况下,高速缓存可以是直接映射的,这时主存中的一个行总是存放在高速缓存中完全相同的位置。在另一种极端情况下,高速缓存是充分相连的,这意味着主存中的任意一个行可以存放在高速缓存中的任意位置。但是大多数高速缓存在某种程度上是N-路组关联的,意味着主存中的任意一个行可以存放在高速缓存N行中的任意一行中。例如,内存中的一个行可以存放到一个2路组关联高速缓存两个不同的行中。
13.转换后援缓冲器:
除了通用硬件高速缓存之外,80x86处理器还包含了另一个成为TLB的高速缓存用于加快线性地址的转换。当一个线性地地址第一次使用时,通过慢速访问RAM中的页表计算出相应的物理地址。同时,物理地址被存放在一个TLB表项中,以便以后对同一个线性地址的引用可以快速的得到转换。在多处理器系统中,每个CPU都有自己的TLB,这叫做该CPU的本地TLB。与硬件高速缓存相反,TLB中的对应项不必同步,这是因为运行在现有CPU上的进程可以使同一线性地址与不同物理地址发生联系。
14Linux中的分页
四级分页模型:
页全局目录:页全局目录包含若干页上级目录的地址,页上级目录又依次包含若干页中间目录的地址,而页中间目录又包含若干页表的地址。每一个页表项指向一个页框。线性地址因此被分为五个部分。
15线性地址字段:
16 页表处理:
Pte_t、pmd_t、pud_t、pgd_t 分别描述页表项、页中间目录项、页上级目录和页全局目录的格式。当PAE被激活都是64位数据类型,否则都是32位的数据类型。内核同时提供许多宏函数用来修改页表表项,若相应的表项为0,那么pte、pmd、pud、pgd后缀_none产生值为1,否则为0。而宏上述后缀_clear 表示相应页表的一个表项。而前缀set_表示一个页表表项中写入指定的值。若a和b两个页表项指向同一页并且指定相同的访问优先级,那么pte_same(a,b)返回1,否则返回0。若页中间目录e指向一个大型页(2MB或4MB),那么ptm_large(e)返回1,否则为0。宏pmd_bad由函数使用并且通过输入函数参数传递来检查页中间目录项,若目录项指向存在页不在主存中或者页只允许读访问或Acessed或Dirty位被清除,都返回1。而pud_bad和pgd_bad宏总为0。
17 物理内存布局
在初始化阶段,内核必须建立一个物理地址映射来指定哪些物理地址范围对内核可用而哪些不可用。内核将在不可用的物理地址范围内的页框,含有内核代码和已初始化的数据结构的页框,保留页框中的页不能被动态分配或交换到磁盘上。一般来说,linux内核安装在RAM中从物理地址0x00100000 开始的地方,也就是从第二个MB 开始,为了避免把内核装入一组不连续的页框里,linux更愿意跳过RAM的第一个MB,明确的说,linux用PC体系结构来保留的页框来动态的放所分配的页。
18 进程页表
从0x00000000到0xbfffffff的线性地址,无论进程运行在用户态还是内核态都是可以寻址的。
从0xc0000000到0xfffffff的线性地址,只有内核态的进程才能寻找。当程序运行在内核态时,他执行内核代码,所产生的地址大于等于0xc0000000。但是在某些情况下,内核为了检索或存放数据必须访问用户态线性地址空间。
19 固定映射的线性地址
我们看到内核线性地址第四个GB的初始部分映射系统的物理内存。但是至少128MB的线性地址总是留作他用,因为内核使用这些线性地址实现非连续内存分配和固定映射线性地址。固定映射线性地址基本上是一种类似于0xffffc000这样的常量线性地址,其对应的物理地址不必等于线性地址减去0xc000000,而是可以一任意方式建立。因此每一个固定映射的线性地址都映射一个页框。内核使用固定映射的线性地址来代替指针变量,因为这些指针变量的值从不改变。固定映射线性地址概念上类似于对RAM前896MB映射的线性地址。不过,固定映射的线性地址可以映射任何物理地址,而由第4GB初始部分的线性地址所建立的映射是线性的。就指针变量而言,固定映射的线性地址更有效。