计算机内存寻址

计算机管理内存的基本方式有两种:段式管理和页式管理。而在使用80x86微处理器时,内存地址分为三个不同的地址:逻辑地址,线性地址,物理地址。他们之间有什么关系,内存是如何寻址,本文主要介绍的就是内存寻址。

1、基本概念:

cpu段式管理:段式管理的基本原理是指把一个程序分成若干个段(segment)进行存储,每个段都是一个逻辑实体(logical entity)。一个用户作业或进程所包含的段对应一个二维线形虚拟空间,程序通过分段(segmentation)划分为多个模块,故可以对程序的各个模块分别编写和编译。段式管理程序以段为单位分配内存,然后通过地址影射机构把段式虚拟地址转换为虚拟地址。

cpu页式管理: 页式管理的基本原理将各进程的虚拟空间划分成若干个长度相等的页(一般为4K),页式管理把内存空间按页的大小划分成片或者页面(page frame),然后把页式虚拟地址与内存地址建立一一对应页表,并用相应的硬件地址变换机构,来解决离散地址变换问题。

逻辑地址:包含在机器语言指令中用来指定一个操作数或一条指令的地址,每个逻辑地址都由一个段和偏移量组成,表示为[段标识符:段内偏移量]。例如,在C/C++程序中我们使用指针对变量地址操作,该地址就是逻辑地址(准确的应该说是逻辑地址的段内偏移量)。对应上述段式管理,逻辑地址是段式管理转换前的程序地址。

线性地址:也称为虚拟地址,它是一个32位无符号整数,故可以用来表达高达4GB的地址。线性地址同逻辑地址一样也是不真实的地址。对应上述页式管理,线性地址是页式管理转换前的地址。

物理地址:用于内存芯片级内存单元寻址,与处理器和CPU连接的地址总线相对应。一般情况下,我们说的计算机内存条中的内存就是它(虽然不准确)。

有了上述的基本概念后,很显然,CPU将一个虚拟内存空间中的地址转换为物理地址,需要进行两步:首先将给定一个逻辑地址,CPU要利用其段式内存管理单元,先将每个逻辑地址转换成一个线程地址,再利用其页式内存管理单元,转换为最终物理地址。这就是我们所知道的段页式管理,这样两次转换的好处可以克服段式管理和页式管理的缺点。

2、CPU段式内存管理:逻辑地址转换为线性地址

逻辑地址由两部分组成:一个段标识符和一个指定段内相对地址的偏移量(简称偏移量),[段标识符: 段内偏移量]。

段标识符是由一个16位长的字段组成,称为段选择符,由处理器提供段寄存器来存放段标识符,段寄存器有6种:

   (1)cs 代码段寄存器,指向包含程序指令的段;

   (2)ss 栈寄存器,指向包含当前程序的段;

   (3)ds 数据段寄存器,指向包含静态数据或者全局数据段;

   (4)其他三个寄存器es, fs, gs称为附加段寄存器,作一般用途,可以指向任意的数据段。

偏移量指明了从段开始的地方到实际地址之间的距离,偏移量为32位。

 

如上图为段标识符(段选择符)格式,其中最关键的部分为索引号。

段标识符,按照其字面意思便可理解它的作用是用来标识一个段的,而段是如何表示的呢?

这就引申到了另外一个概念:段描述符,每个段由一个8字节的段描述符表示,它描述了段的特征(段描述符就是段)。段标识符通过索引号(13位)就可以找到其对应的段(段描述符),段的格式如下图所示:

段描述符中我们需要关注的字段为:Base,它描述了一个段的开始位置的线性地址。

段描述符放在全局描述符表(GDT,存放于gdtr寄存器中)或局部描述符表(LDT,存放于ldtr寄存器中)中,通常只定义一个GDT,而每个进程除了存放在GDT中的段之外如果还学要创建附加的段,就可以有自己的LDT。。

好了,通过上述的讲解,我们就可以关注一个逻辑地址是怎样转化成相应的线性地址的,具体步骤如下:

(1)先检查逻辑地址的段选择符的TI字段,以决定段描述符保存在哪一个描述符表中。(TI=0表明在GDT中,TI=1表明存在LDT中)

(2)根据段选择符的索引号,计算查找段描述符的地址,方法:索引号*8 + gdtr或者ldtr寄存器中的内容 = Base。

(3)把逻辑地址的偏移量与步骤(2)中得到的Base字段值相加就可以得到其对应的线性地址。

逻辑地址的转换图如下图所示:

3、CPU页式内存管理:线性地址转换为物理地址

首先,我们得知道一些线性地址相关的东西。

(1)线性地址被分成固定长度为单位的组,称为页。页内部连续的线性地址被映射到连续的物理地址中。

(2)分页段元把所有的物理地址分成固定长度的页框,称为物理页。

(3)线性地址映射到物理地址的数据结构称为页表。

(4)32位的线性地址,被分成3个域:目录(Directory)高10位,页表(Table)中间10位,偏移量(Offset)低12位,由偏移量的12bit可知,每页含有4096字节的数据。

线性地址的转换分两步完成,每一步都基于一种都基于一种转换表,第一种转换表称为页目录表转换,第二种转换称为页表转换。使用这种二级模式的目的在于减少每个进程页表所需的RAM的数量。就像我们看书有个书目录一样,方便快捷。具体转换如下图所示:

转换步骤:

(1)从cr3中取出进程的页目录地址(操作系统负责在调度进程的时候,把这个地址装入对应寄存器);
(2)根据线性地址前十位,在数组中,找到对应的索引项,因为引入了二级管理模式,页目录中的项,不再是页的地址,而是一个页表的地址。(又引入了一个数组),页的地址被放到页表中去了。
(3)根据线性地址的中间十位,在页表(也是数组)中找到页的起始地址;
(4)将页的起始地址与线性地址中最后12位相加,得到最终我们想要的其对应的物理地址。

 

参考:

(1)深入理解linux内核

(2)独孤九贱 http://bbs.chinaunix.net/thread-2083672-1-1.html

时间: 2024-08-04 06:22:47

计算机内存寻址的相关文章

详解Linux系统内存寻址的分页机制

  分页机制在段机制之后进行,以完成线性-物理地址的转换过程.段机制把逻辑地址转换为线性地址,分页机制进一步把该线性地址再转换为物理地址. 硬件中的分页 分页机制由CR0中的PG位启用.如PG=1,启用分页机制,并使用本节要描述的机制,把线性地址转换为物理地址.如PG=0,禁用分页机制,直接把段机制产生的线性地址当作物理地址使用.分页机制管理的对象是固定大小的存储块,称之为页 (page).分页机制把整个线性地址空间及整个物理地址空间都看成由页组成,在线性地址空间中的任何一页,可以映射为物理地址

深入理解计算机系统-之-内存寻址(二)--存储保护机制(CPU实模式与保护模式)

cpu的保护模式由来 分段机制 8086的诞生,标志着Intel 正式进入了x86时代,这是个多么具有纪念意义的日子:1978-6-8.同时,8086的诞生也是处理器内存寻址技术的第一次飞跃. 对于一根实际的.实实在在的.物理的.可看得见.摸得着的内存条而言,处理器把它当做8位一个字节的序列来管理和存取,每一个内存字节都有一个对应的地址,我们叫它物理地址,用地址可以表示的长度叫做寻址空间.而CPU是如何去访问内存单元里的数据的方式就叫做寻址. 8086得CPU在内存寻址方面第一次引入了一个非常重

深入理解计算机系统-之-内存寻址(六)--linux中的分页机制

linux的分页机制 四级分页机制 前面我们提到Linux内核仅使用了较少的分段机制,但是却对分页机制的依赖性很强,其使用一种适合32位和64位结构的通用分页模型,该模型使用四级分页机制,即 页全局目录(Page Global Directory) 页上级目录(Page Upper Directory) 页中间目录(Page Middle Directory) 页表(Page Table) 页全局目录包含若干页上级目录的地址: 页上级目录又依次包含若干页中间目录的地址: 而页中间目录又包含若干页

32位-IA-32内存寻址问题求解

问题描述 IA-32内存寻址问题求解 大家都说32位系统能够寻址4GB内存但是如下这个段话怎么解释??? 下面的那句话表明物理内存能够达到64GB! 解决方案 在x86时代,为了解决服务器计算机内存不足的情况,Intel在Pentium Pro/Pentium Xeon上增加了一个36bit地址扩展,也就是另外增加了4位地址,因此可以寻址到64GB. 我就有一台很老的dell服务器,用的是pentium iii xeon,用的是windows server 2003,给它插满了16条内存,达到8

计算机内存使用率过高怎么办

什么是内存使用率 内存使用率就是系统和应用程序占用物理内存的百分比.当电脑在待机状态的时候内存就不会增加,但是如果程序开启的越多,内存使用率就会相应的上升,这就是造成内存使用率过高. 计算机内存使用率过高怎么办-"> 当然如果电脑内存使用率过高的话会造成电脑运行速度慢,操作系统变慢的现象,如果出现了这种情形然后我们在去任务管理器上看看内存使用率是否过高了吧. 如果发现内存使用率过高,不要盲目的去操作电脑,先查看到底是什么程序占用了内存使用率.如果发现是一些正常的程序占用的话可以将其进程暂时

模式-80386内存寻址问题,汇编语言学习疑惑

问题描述 80386内存寻址问题,汇编语言学习疑惑 8086内存寻址是通过段地址加偏移的方式,因为地址总线长度是20位,而寄存器是16位的, 但是80386的地址总线长度是32位,而寄存器也是32位,通过一个寄存器不就可以寻址吗? 为什么要搞得这么麻烦?为了兼容吗,但保护模式下有不需要考虑兼容问题,为什么不用一个32位寄存器寻址呢? 解决方案 方便实现段或页式内存管理. 解决方案二: 你学习的是过时的dos下的汇编,无论你的处理器是32位的还是64位的,dos都是16位的,你实际上都是在给一个8

配置-eclipse lula启动报计算机内存不足问题,急!!!!

问题描述 eclipse lula启动报计算机内存不足问题,急!!!! 我从同事那考个eclipse过来,结果他Eclipse分配的内存是2G多,2G多可能超过我内存了.难后我报计算机内存不足错误,eclipse.ini配置过了也没用, 装过了一个eclipse还不行. 解决方案 计算机内存不足,添加内存条,我们都至少是4G内存,2G内存不够用的!我工作电脑都是8G! 解决方案二: 我也是4G的.我现在给C盘配置了内存,暂时没在出现问题. 以前是无分页的 解决方案三: 我也是4G的.我现在给C盘

处理器-NUMA架构计算机内存高效操作问题

问题描述 NUMA架构计算机内存高效操作问题 配置是:超微X9DRL-IF,2颗Intel XEON处理器,128GB内存,运行2008 R2. 目前从PCIE采集卡通过DMA收数据,DMA完成中断周期100ms,DMA大小64MB,需要将该数据拷贝到内存里的更大缓冲区缓存后处理,用VirtualAlloc()申请了20GB内存,结果测试显示数据拷贝的时间达50-60ms最坏的时候回达到秒级以上,这和通过Everest测试的结果相差太大,而且,如果再提高采集速度基本就不可能了:后来通过Virtu

eclipse lula启动报计算机内存不足问题,急!!!!

问题描述 我从同事那考个eclipse过来,结果他Eclipse分配的内存是2G多,2G多可能超过我内存了.难后我报计算机内存不足错误,eclipse.ini配置过了也没用,装过了一个eclipse还不行. 解决方案 解决方案二:你的机器多少内存,把eclipse.ini贴一下.解决方案三:1.减小ini里的参数值2.增加虚拟内存的设置3.如果上面两个都不管用,只能加物理内存了