linux下32位虚拟地址空间是多少

linux下32位虚拟地址空间是多少,第1张

64位的linux采用4级页表,支持的最大物理内存为64T。 对于虚拟地址空间的划分,将0x0000,0000,0000,0000 – 0x0000,7fff,ffff,f000这128T地址用于用户空间;而0xffff,8000,0000,0000以上的128T为系统空间地址。 具体的不是一两句能说清楚了。

Linux虚拟内存的大小为2^32(在32位的x86机器上),内核将这4G字节的空间分为两部分。最高的1G字节(从虚地址

0xC0000000到0xFFFFFFFF)供内核使用,称为“内核空间”。而较低的3G字节(从虚地址0x00000000到

0xBFFFFFFF),供各个进程使用,称为“用户空间”。因为每个进程可以通过系统调用进入内核,因此,Linux内核空间由系统内的所有进程共享。

于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟地址空间(也叫虚拟内存).

每个进程有各自的私有用户空间(0~3G),这个空间对系统中的其他进程是不可见的。最高的1GB内核空间则为所有进程以及内核所共享。另外,进程的“用户空间”也叫“地址空间”,在后面的叙述中,我们对这两个术语不再区分。

用户空间不是进程共享的,而是进程隔离的。每个进程最大都可以有3GB的用户空间。一个进程对其中一个地址的访问,与其它进程对于同一地址的访问绝不冲

突。比如,一个进程从其用户空间的地址0x1234ABCD处可以读出整数8,而另外一个进程从其用户空间的地址0x1234ABCD处可以读出整数

20,这取决于进程自身的逻辑。

因此Linux对用户空间与内核空间的划分起到了一定程度上的冲突避免。

什么是虚拟地址?虚拟地址的工作原理是什么?

1231阅读

补给站Linux内核

关注

1.为什么要有虚拟内存

在早期的计算机中,是没有虚拟内存的概念的。我们要运行一个程序,会把程序全部装入内存,然后运行。

当运行多个程序时,经常会出现以下问题:

1)进程地址空间不隔离,没有权限保护。

由于程序都是直接访问物理内存,所以一个进程可以修改其他进程的内存数据,

甚至修改内核地址空间中的数据。

2)内存使用效率低

当内存空间不足时,要将其他程序暂时拷贝到硬盘,然后将新的程序装入内存运行。

由于大量的数据装入装出,内存使用效率会十分低下。

3)程序运行的地址不确定

因为内存地址是随机分配的,所以程序运行的地址也是不确定的。

2.虚拟地址和物理地址逻辑地址:

是程序编译后,生成的目标模块进行编址时都是从0号开始编址,称之为目标模块的相对地址,即逻辑地址。

虚拟地址:

计算机处理器的地址有32位和64位的两种,对应的虚拟地址的空间大小分别是2^32字节和2^64字节,字节用B表示。

页:

分页存储管理将进程的逻辑地址空间划分为若干页(面),并且对其编号,号数从0开始,每个页(面)的大小称为页面大小,且大小应为2的幂。

页和页框二者一一对应,一个页放入一个页框,(理论上)页的大小和页框的大小相等。

物理块:

将内存的物理地址空间划分为若干块,称为物理块,物理块与页(面)一一对应。

页表:

就是一个页和页框一一对应的关系表。【存放在内存中】 关系表只是起到一个索引的作用,说白了就是能根据关系表能查到某一个页面和哪一个页框所对应。

下面通过举例子梳理一下:

假设我们已经知道了逻辑地址是32位,页面大小是4KB=2^12B,页表项是4B(32位)。

1.因为逻辑地址我们假设为32位,可知虚拟地址的空间大小是2^32B。

逻辑地址:在分页地址中划为两部分,一个是页号P(页面数目),另一个是位移量W(物理块号)

2.由已知条件求得页面数目P=2^32B/2^12B=2^20页,同时得出页号地址是20位。

A表示逻辑地址空间中的地址,L表示页面大小。

3.页表项:

在页表中,一个页号与其对应的物理块号称之为一个页表项(由已知条件知道大小是32位)。故页表项的数目就等于页(面)数目即为2^20个,全部页表项(页表中从上往下数)所需的地址也就是20位。

红框即为一个页表项,以此类推。

4.物理块号的地址=逻辑地址-页号地址=32-20=12位

因为并不是进程的每一个页面都要调入内存,所以只有部分页面有对应内存的物理块号,所以物理块号的大小(2^12)会小于页号大小(2^20)。

二、用例子说话【例子出现在:《王道考研操作系统》的内存管理部分】

已知条件:逻辑地址32位、页面大小4KB、页表项大小4B,按字节编址

分析:

1.

首先32位的虚拟地址可表示的进程大小应该是2^32B = 4GB(暂时别去想页号P占多少位,W占多少位)

2.(根据页的定义和页面大小的定义)将进程进行分页:

3.我们已经知道了页面的数目为:2^20页。现在的迷茫点就在于页表项的问题上。

上图在页表上已经给出了几个数据:20位,12位,32位,2^20项。一一解释如下【请结合上图一个一个数据分析】:

2^20项:因为页表的作用是要将页面的页框一一对应起来,所以,每一个页面在页表中都应该有一个页表项:用来表示一个页号对应一页页框号(内存中的块号),故应

该有2^20项。【不应该有问题吧,就好像一个班有50个同学,每个人都应该有一个地址一样】

20位:已经很显然了,需要表示出2^20个页表项,就至少需要20位的地址。为什么只取20位而不是21位,22位呢,本人现在还没想这个问题,就暂时定为恰好取20位即可。

32位:已知条件里告诉了页表项大小为4B,那么自然就应该是32位了。

12位:32位-20位 = 12位。为什么页框号地址为12位,只能表示2^12个页框,要小于2^20个页面呢,因为并不是进程的每一个页面都要调入内存。其实32位、12位、20位这三个数据还是有一定依据的,在二级分页的时候就会发现“哦,原来刚刚好”。此处暂不讨论二级分页。

4.通过上面的分析我们得出了哪些数据:

逻辑地址32位,进程大小:4GB。

页面:大小4KB,数量:2^20页。

页表项:4B,数量:2^20项。所以页表就需要4B*2^20 = 4MB的空间存储(这就是书中说:页表项大小为4MB的由来)进一步,主存的页框大小和页面大小是相等的,也为4KB,所以将页表存在主存就需要占用4MB/4KB = 1024页(因为页表也是存在主存中的,而主存也是按页框划分的。这的确是一种资源浪费,所以就需要建立二级页面,将其大小控制在1页之内,将二级页面存入主存即可)


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/207735.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-04
下一篇2023-04-04

发表评论

登录后才能评论

评论列表(0条)

    保存