一、系统寻址空间是多大

1.32位地址空间

在一台32位系统上,虚拟地址空间为4GB,这个大小由系统上指针的可用数量决定。 对于一块32位的处理器,一个32位值可以表达2^32个不同的数值,如果你将每一个数值都指向不同的内存地址,则你就得到了一个2^32个字节的地址空间,也就是4GB。

32位=2^32B = 4 * 2^30B = 4GB,这是 32 位下单进程内存上限

2.64位地址空间

64位架构下,地址线是46个,所以最大的物理地址是2^46B,折合64TB,可用地址空间也是这么大(目前为止):

虚拟内存:

实际上用户在使用计算机时,进程访问到的地址都是逻辑地址,并不是真实的物理地址,逻辑地址是由操作系统提供的,并维护了逻辑地址和物理地址的映射。

  在进程里平时所说的指针变量,保存的就是虚拟地址。当应用程序使用虚拟地址访问内存时,处理器(CPU)会将其转化成物理地址 (MMU)  MMU: 将虚拟的地址转化为物理地址。  这样做的好处在于:         进程隔离,更好的保护系统安全运行。

        屏蔽物理差异带来的麻烦,方便操作系统和编译器安排进程地址

二、虚拟地址与物理地址是什么?

物理内存也称为主存,动态随机访问内存(DRAM)。只有内核才可以直接访问物理内存。

1、定义不同

虚拟地址:CPU 在程序运行时生成虚拟地址。

物理地址:物理地址是内存中的一个位置。

2、位置不同

虚拟地址:虚拟地址在内存中不存在物理存在。

物理地址:物理地址是内存单元中的一个位置。

3、访问不同

虚拟地址:虚拟地址用作访问物理地址的引用。

物理地址:无法直接访问物理地址。

4、地址空间不同

虚拟地址:CPU 生成的有关程序的所有虚拟地址的集合称为虚拟地址空间。

物理地址:映射到虚拟地址的所有物理地址称为物理地址空间。

Linux 内核给每个进程都提供了一个独立的虚拟地址空间,并且这个地址空间是连续的。这样,进程就可以很方便地访问内存,更确切地说是访问虚拟内存。虚拟地址空间的内部又被分为内核空间和用户空间两部分。关于用户态和内核态之前文章有介绍。

 进程在用户态时,只能访问用户空间内存;只有进入内核态后,才可以访问内核空间内存。虽然每个进程的地址空间都包含了内核空间,但这些内核空间,其实关联的都是相同的物理内存,也就是共享动态链接库、共享内存等。当进程切换到内核态后,就可以很方便地访问内核空间内存。

三、虚拟地址到物理地址的过程

首先,计算机系统的内存被组成一个由M个连续的字节大小组成的数组。每字节都会有一个唯一的物理地址。CPU访问内存最简单的方式就是使用物理地址。如下图

而现在都是采用的都是虚拟寻址的方法。CPU生成一个虚拟地址(VA),然后MMU(Memory Management Unit 内存管理单元) 将虚拟地址翻译成实际的物理地址,然后再进行物理寻址。

那么虚拟地址是怎么转化成物理地址的呢?这就涉及到虚拟内存,页表等等新东西

四、虚拟内存及其优缺点

虚拟内存,是一种内存管理技术,他会是程序自己认为自己拥有一块很大且连续的内存,然而,这个程序在内存中是不连续的,并且有些还会再磁盘上,在需要时进行数据交换;

优点:1.可以弥补物理内存大小的不足;2.在一定程度上提高反应速度3.减少对物理内存的读取,从而保护内存延长内存使用寿命

缺点:1.占用一定的物理磁盘空间;2.加大了对硬盘的读写3.设置不当会影响整机稳定性和速度

虚拟地址空间是对于一个单一进程的概念,这个进程看到的是地址从0000开始的整个 内存空间。虚拟存储器是一个抽象概念,他为每一个进程提供了一个假象,好像每一个进程都在独占的使用主存。每个进程看到的存储器都是一致的,称为虚拟地址空间。

从最低位看起:程序 、代码、 数据堆 、共享库 、栈 、内核 、虚拟存储器。虚拟地址空间位4GB。

五、内存映射是什么?

1.内存映射

物理内存也称为主存,动态随机访问内存(DRAM)。只有内核才可以直接访问物理内存。

Linux 内核给每个进程都提供了一个独立的虚拟地址空间,并且这个地址空间是连续的。这样,进程就可以很方便地访问内存,更确切地说是访问虚拟内存。虚拟地址空间的内部又被分为内核空间和用户空间两部分。

首先,“映射”这个词,就和数学课上说的“一一映射”是一个意思,就是建立一种一一对应关系,在这里主要是指 硬盘上文件 的位置与 进程 逻辑地址空间 中一块大小相同的区域之间的一一对应,如图1中过程1所示。这种对应关系纯属是逻辑上的概念,物理上是不存在的,原因是进程的逻辑地址空间本身就是不存在的。在内存映射的过程中,并没有实际的数据拷贝,文件没有被载入内存,只是逻辑上被放入了内存,具体到代码,就是建立并初始化了相关的数据结构(struct address_space),这个过程有系统调用mmap()实现,所以建立内存映射的效率很高。

2.mmap

mmap是一种内存映射的方法,这一功能可以用在文件的处理上,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。在编程时可以使某个磁盘文件的内容看起来像是内存中的一个数组。如果文件由记录组成,而这些记录又能够用结构体来描述的话,可以通过访问结构数组来更新文件的内容。

实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。如图所示:

mmap内存映射原理

mmap内存映射的实现过程,总的来说可以分为三个阶段:

(一)进程启动映射过程,并在虚拟地址空间中为映射创建虚拟映射区域

(二)调用内核空间的系统调用函数mmap(不同于用户空间函数),实现文件物理地址和进程虚拟地址的一一映射关系

(三)进程发起对这片映射空间的访问,引发缺页异常,实现文件内容到物理内存(主存)的拷贝

学习以下内容所做记录

虚拟地址与物理地址的区别与联系是什么 • Worktile社区mmap 学习

一个虚拟地址到物理地址的过程 - 知乎 (zhihu.com)

好文阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: