《深入理解Linux内核》读书笔记-第二章-内存寻址(2) .

转载 2012年03月25日 20:49:10

硬件中的分页:

32位的线性地址被分成3个域:

10位:页目录表

中间10位:页表

12位:页表内偏移

使用二级页表模式的目的在于减少每个进程页表所需RAM数量。如果是一级页表,则需高达220个表项,而二级模式只为进程实际使用的那些虚拟内存区请求页表。


页目录项和页表项有同样的结构,均包含了一些属性字段。


评:段页属性字段的设置很有意义,分段、分页这种将内存结构化、组织化的方式,同时可以增加对某一段或页的属性描述信息,对于内存管理来说很有意义,这种组织内存的方法思路,正如行政区域的划分。



物理地址扩展(PAE)分页机制:

这一部分在我的另一篇博文中有提到:http://blog.csdn.net/crazyingbird/article/details/7175559

 
 

硬件高速缓存:

为了缩小CPURAM之间的速度不匹配,引入了硬件调整缓冲内存。


多处理器系统的每一个处理器都有一个单独的硬件高速缓存,它们需要额外的硬件电路,用于保持不同CPU之间的高速缓存内容的同步。只要一个CPU修改了它的硬件高速缓存,它就必须检查同样的数据是否包含在其它的硬件高速缓存中,如果是,它必须通知其它CPU用适当的值对其更新,这种活动叫做高速缓存侦听。这些活动由硬件处理,内核无需关心。


Linux对于所有的页框都启用高速缓存,对于写操作总是采用加回写策略。


转换后援缓冲器:

记录上一次线性地址转换得到的相应的物理地址,以便以后对同一线性地址的引用可以快速地得到转换。


在多处理器系统中,每个CPU都有自己的TLB,称为该CPU的本地TLB,与硬件高速缓存相反,TLB中的对应项不必同步,这是因为运行在现有CPU上的进程可以使同一线性地址与不同物理地址发生联系。



Linux中的分页:

2.6.10版本及之前,Linux采用三级分页模型,从2.6.11版本开始,采用四级分页模型:

l 页全局目录(Page Global Directory

l 页上级目录(Page Upper Directory

l 页中间目录(Page Middle Directory

l 页表(Page Table


对于没有启用物理地址扩展的32位系统,Linux取消了页上级目录和页中间目录,仅使用了两级页表。


启用了物理地址扩展的32位系统,Linux取消了上级目录,使用三级页表。


对于64位系统,Linux根据硬件对线性地址位的划分来决定采用三级或者四级页表。


物理内存布局:

Linux内核安装在RAM中从物理地址0x00100000开始的地方,也就是从第二个MB开始。

页框0BIOS使用,存放加电自检期间检查到的系统硬件。

物理地址从0x000a00000x000fffff的范围通常留给BIOS全程,并且映射ISA图形卡上的内部内在。

第一个MB内的其它页框可能由特定计算机模型保留。

在启动过程的早期阶段,内核询问BIOS并了解物理内存的大小,随后,内核建立物理地址映射。

内核可能不会见到BIOS报告的所有物理内存:如果未启用PAE支持来编译,即使有更大的物理内存可供使用,内核也只能寻址4GB大小的RAM


进程页表:

进程的线性地址空间分成两部分:

0x000000000xbfffffff的线性地址,无论进程运行在用户态还是内核态都可以寻址;

0xc00000000xffffffff的线性地址,只有内核态的进程才能寻址;

当进程运行在用户态时,它产生的线性地址小于0xc0000000;当进程运行在内核态时,它执行内核代码,所产生的地址大于等于0xc0000000。但某些情况下,内核为了检索或存放数据必须访问用户态线性地址空间。


内核页表:

内核维持着一组自己使用的页表,驻留在所谓的主内核页全局目录中,系统初始化后,这组页表还从未被任何进程或者任何内核线程直接使用;确切的说,主内核页全局目录的最高目录项部分作为参考模型,为系统中每个普通进程对应的页全局目录提供参考模型。

那么,内核如何初始化自己的页表呢?内核映像刚刚被装入内存后,CPU仍然运行于实模式,所以分页功能没有被启用。

第一阶段,内核创建一个有限的地址空间,包括内核的代码段和数据段、初始页表和用于存放动态数据结构的共128KB大小的空间。这个最小限度的地址空间仅够将内核装入RAM和对其它初始化的核心数据结构。

第二阶段,内核充分利用剩余的RAM并适当建立分页表。

由内核页表所提供的最终映射必须把从0xc0000000,即第四个GB开始的线性地址转化为从0开始的物理地址。


固定映射的线性地址:

固定映射的线性地址基本上是一种类似于0xffffc000这样的常量线性地址,其对应的物理地址不必等于线性地址减去0xc000000,而是可以以任意方式建立。因此,每个固定映射的线性地址都映射一个物理内存的页框。内核使用固定映射的线性地址来代替指针变量。

每个固定映射的线性地址都存在线性地址第四个GB的末端。


处理硬件高速缓存:

为了使高速缓存的命中率达到最优化,内核在下列决策中考虑体系结构:

一个数据结构中最常使用的字段放在该数据结构内的低偏移部分,以便它们能够处于高速缓存的同一行中。

注:聚集存储的数据结构大小可能大于行的大小。

当为一大组数据结构分配空间时,内核试图把它们都存放在内存中,以便所有高速缓存行按同一方式使用。

原文地址:http://blog.csdn.net/crazyingbird/article/details/7181211

相关文章推荐

《深入理解Linux内核》读书笔记-第二章-内存寻址(2)

硬件中的分页: 32位的线性地址被分成3个域: 高10位:页目录表 中间10位:页表 低12位:页表内偏移 使用二级页表模式的目的在于减少每个进程页表所需RAM数量。如果...

《深入理解Linux内核》读书笔记-第二章-内存寻址(1)

内存地址: 逻辑地址:包含在机器语言指令中用来指定一个操作数或一条指令的地址。 线性地址:一个32位无符号整数,也称虚拟地址。 物理地址:用于内存芯片级内存单元寻址,与从...

<<深入理解linux内核>>读书笔记 (一): 内存寻址

最近开始找工作了,看着一个封封简历石沉大海,人也变得浮躁起来,很久都没有看书了,这样还是不好的,我相信明天依然是明亮、绚丽的,哈哈,不能散失信心。。。 今天我将说下关于内存寻址方面的东西,因为我是学...

深入理解Linux内核个人小结2---内存寻址

一. 内存地址---80X86微处理器中使用的三种不同的地址:       物理地址:用于内存芯片级内存单元寻址。它们与从微处理器的地址引脚发送到内存总线上的电信号相对应。       线性地址:...

深入理解Linux内核学习笔记之内存寻址

一 内存地址 使用80x86微处理器需区分三种地址: 逻辑地址(段+偏移 - 机器指令中用的地址) 线性地址(即虚拟地址 32bit无符号整形, 0x00000000 - 0xFFFFF...

深入理解Linux内核笔记—第02章:内存寻址.md

2.1 内存地址 80x86微处理器的三种不同地址: 逻辑地址:包含在机器语言指令中用来指定一个操作数或一条指令的地址 每一个逻辑地址都有一个段和偏移量组成,偏移量指明了段开始的地方到实际地址之间...

Linux内核代码笔记2----内存寻址

硬件中的分段     逻辑地址由一个16位的段选择符(segment selector)和32位的偏移量(offset)组成。偏移量就是段内相对地址。段寄存器就是存放段选择符的,包括cs、ss、ds...
  • up2wing
  • up2wing
  • 2014年04月17日 21:35
  • 671

深入理解linux内核——内存寻址

内存寻址一章主要介绍了硬件的常规分段分页机制和linux的分页机制。

读深入理解计算机系统-内存寻址-读书笔记

名词解释: 物理地址 虚拟地址 PT:页表 PTE:页表目录 PA:物理地址 VA:虚拟地址 VPN:虚拟页号 VPO:虚拟页偏移 MMU:存储器管理单元 TLB:MMU中的关于...

深入理解Linux内核day01--内存寻址

内存寻址 内存地址:     逻辑地址: 段+偏移量 组成     线性地址: 可用来表达4GB的地址 (也称虚拟地址)     物理地址: 用于内存芯片级内存单元寻址。他们与微处理器地址引脚发送到...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《深入理解Linux内核》读书笔记-第二章-内存寻址(2) .
举报原因:
原因补充:

(最多只允许输入30个字)