分段 一开始限于技术和成本所以寄存器的位数不够,因此为了扩大寻址范围使用了分段技术。 一文读懂Linux内核之内存管理分段机制原理与实现 - 知乎 (zhihu.com) 什么事内存分段? 关键字: 虚拟地址,段选择子,段表 分段机制下,虚拟地址由两部分组成,段选择因子和段内偏移量。 段选择子是保存在段寄存器中的,段选择子里最重要的是段号,用作段表的索引。段表里保存的是这个段的基地址,段的界限和特权等级。

1 min

0 min

地址空间 地址空间的概念 要保证多个应用程序同时处于内存中且互不影响,则需要解决两个问题:保护和重定位。一个原始的方法就是IBM360上:给内存块标记上一个保护键,但是这是一个缓慢且复杂的解决方法。 一个更好的办法是创建一个新的内存抽象:地址空间。就像进程的概念创造了一雷抽象的CPU以运行程序一样。地址空间是一个进程可用于寻址内存的一套地址集合。每个进程都有一个自己的地址空间,并且这个地址空间独立于其他进程的地址空间(除了在一些特殊情况下进程需要共享他们的地址空间外)。 基址存储器与界限存储器 这个方法曾经很常见,但是有能力把更复杂(而且更好)的机制运用在现代CPU芯片上之后,这个方法就不再使用了。 这个简单的解决办法使用一种简单的动态重定位。它所做的是简单的把每个进程的地址空间映射到物理内存的不同部分。所使用的经典办法是给每个CPU配置两个特殊硬件寄存器,通常叫基址寄存器和界限寄存器。当一个程序运行时,程序的其实物理地址装载到基址寄存器中,程序的长度装载到界限寄存器中。 使用基址寄存器和界限寄存器重定位的缺点是,每次访问内存都需要进行加法和比较运算。比较运算可以很快执行,但是加法运算由于进位传递时间的问题,在没有使用特殊电路的情况下会显得很慢。

1 min

0 min

存储器抽象 无存储器抽象 最简单的存储器抽象是无存储器抽象,早期计算机没有存储器抽象,每个程序都直接访问物理内存。 无存储器抽象需要解决多道程序的问题 在这种情况下同时运行两个程序是不可能的。如果第一个程序在20000的位置写入一个新的值,将会擦掉第二个程序存放在相同位置上的所有内容,所以同时运行两个程序是行不通的两个程序会立刻崩溃掉。 在不使用内存抽象的情况下运行多道程序 1. 通过内存交换实现多道程序的运行: 即使没有内存抽象,同时运行多个程序也是有可能的。操作系统只需要把当前内存中所有内容保存到磁盘文件中,然后把下一个程序读入到内存中再运行即可。只要在某一个时间内存中只有一个程序,那么就不会发生冲突。 2. 特殊硬件:IBM360的早期模型这样解决的,内存被划分为2kb的块,每个块被分配一个4位的保护键,保护键存储在cpu特殊的寄存器中。 不使用存储器抽象的问题 1. 如果用户程序可以寻址内存的每个字节,它们就可以很容易的(故意或偶然的)破坏操作系统,从而使系统慢慢地停止运行。 2. 使用这种模型,想要同时(如果只有一个cpu就轮流执行)运行多个程序是很困难的。 需要解决上述问题,就引入了地址空间地址空间的概念。

1 min

如何在运行时查看内存状态 32位操作系统的取地范围是多大,64位呢? 操作系统的内存是如何组织的? 关键字: 虚拟内存,内存分页 操作系统的内存是通过分页的形式组织的。对于运行中的程序,访问的地址都是虚拟地址,这个虚拟地址范围是可以比真实物理地址还要大的。所以这些虚拟地址并不是一开始就和物理地址一一对应的,直到访问到这些虚拟地址了之后,操作系统才会对虚拟地址与物理地址做映射关系,这个映射关系的最小单位就是页。 操作系统是如何处理虚拟内存和物理内存的映射关系的?

1 min

虚拟内存 解决问题 超负载的使用内存,软件体积远远大于内存总量。 多道程序运行。 基本思想 每个程序拥有自己的地址空间,这个空间被分割成多个块,每一块称作一页或页面(page)。每一页有连续的地址范围。这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。当程序 引用到一部分在物理内存中的地址空间时,由硬件立刻执行必要的映射。当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的指令。从某个角度来讲,虚拟内存是对基址寄存器和界限寄存器的一种综合。 实现 分页 大部分虚拟内存系统中都使用一种称为分页(paging)的技术。 MMU 在没有虚拟内存的计算机上,系统直接将虚拟地址送到内存总线上,读写操作使用具有同样地址的物理内存字;而在使用虚拟内存的情况下,虚拟地址不是被直接送到内存总线上。而是被送到内存管理单元(Memory Management Unit,MMU),MMU把虚拟地址映射为物理内存地址, 页帧 虚拟地址空间按照固定大小划分成称为页面(page)的若干单元。在物理内存中对应的单元称为页框(page frame)。RAM和磁盘之间的交换总是以整个页面为单元进行的。 虚拟地址使用过程 当程序试图访问地址0时,例如执行下面这条指令 MOV REG,0 将虚拟地址0送到MMU。MMU看到虚拟地址落在页面0(04095),根据其映射结果,这一页面对应的是页框2(819212 287),因此MMU把地址变换为8192,并把地址8192送到总线上。内存对MMU一无所知,它只看到一个读或写地址8192的请求并执行它。MMU从而有效地把所有从04095的虚拟地址映射到了819212287的物理地址。 ![[791659266160_.pic.jpg]] 通过恰当地设置MMU,可以把16个虚拟页面映射到8个页框中的任何一个。但是这并没有解决虚拟地址空间比物理内存大的问题。在图3-9中只有8个物理页框,于是只有8个虚拟页面被映射到了物理内 存中,在图3-9中用叉号表示的其他页并没有被映射。在实际的硬件中,用一个"在/不在"位(present/absent bit)记录页面在内存中的实际存在情况。当程序访向了一个未映射的页面,例如执行指令 MOV REG,32780 将会发生什么情况呢?

1 min

0 min

0 min

0 min