CPU竟然才是管理内存的大BOSS ?

商务办公
谁来负责构造页表呢?答案是操作系统,操作系统负责创建页表,页表本质上就是一个数组,处理器规定页表的格式,操作系统按照这种格式构建好页表,创建好后即可告诉CPU。

家好,我是小风哥

对于C/C++程序员来说,内存分配再正常不过,C语言中的malloc:

int* a = (int*)malloc(sizeof(int));

C++中的new:

int* a = new int(10);

接下来的问题是变量a占用的内存是谁给我们分配的呢?

答案是运行在用户态的内存分配器,如果你愿意,也可以绕过内存分配器自己来管理内存。

接下来的问题是a占用的内存在哪里呢?

答案是进程地址空间中的堆区,堆区在这里:

图片

内存中真的有像图中这样的布局吗?

答案是:没有。这就是所谓的虚拟内存。

既然是虚拟内存那么这里的堆区又是从哪里来的呢?

答案是操作系统。当我们在C/C++中分配内存时,内存分配器从堆区中找到可用内存,但如果没有找到则向操作系统申请。那么操作系统又是从哪里找到的内存呢?

答案是:操作系统从物理内存中找到一块可用内存分配出去。

问题来了,既然操作系统管理的是物理内存,而操作系统分配给进程的又是虚拟内存,精神分裂啊有没有,这是怎么一回事呢?

原来这并不冲突,操作系统会为每个进程分配一张表,记录了从虚拟内存到物理内存的映射,这张表就叫页表。

图片

因此,尽管操作系统管理的是物理内存,但进程或者说程序员是看不到物理内存的,我们只能看到虚拟内存,程序运行时在发送内存读写指令时MMU会将虚拟内存转换为物理内存。

接下来的问题是页表在哪里?

答案是:在内存中。

你可以将页表放在内存中的任何位置上,只要能告诉CPU在哪里即可。

谁来负责构造页表呢?答案是操作系统,操作系统负责创建页表,页表本质上就是一个数组,处理器规定页表的格式,操作系统按照这种格式构建好页表,创建好后即可告诉CPU。

该怎样告诉CPU呢?

答案是:通过写特定的寄存器。

CPU中有特定的寄存器,以x86处理器为例,其中的控制寄存器cr3就用来保存页表的地址,假设指针pagetable指向页表,那么可以这样设置:

mov   $(pagetable), %eax
mov %eax, %cr3

pagetable必须是物理地址,页表本身就用来将虚拟地址转为物理地址,因此向cr3中写入虚拟地址是没有道理的。

接下来的问题是什么时候将页表写入cr3寄存器呢?

答案是:很多时候,操作系统初始化阶段、进程切换时等。

现在你应该知道了吧,其实内存管理(段式管理、页式管理)是处理器提供的一种机制,操作系统只是这种机制的使用者,我们常说的虚拟内存是处理器本身的一种能力,如果处理器本身不提供这种能力,那么操作系统自己是很难高效实现虚拟内存的。

CPU才是管理内存真正的大boss。

实际上如果你去看类似x86这样的处理器编程手册时就会发现,我们在操作系统课中熟悉的很多概念其实是处理器这种硬件提供的,操作系统仅仅是利用这些硬件的一层软件。

因此,从这个角度看,操作系统仅仅是CPU的一个“驱动程序”而已。

责任编辑:武晓燕 来源: 码农的荒岛求生
相关推荐

2022-07-20 10:33:50

RustGo内存管理

2011-05-23 09:24:09

程序员BOSS

2023-05-22 06:53:43

CPU显卡电脑

2020-12-28 09:50:50

Python内存管理语言

2020-08-03 09:57:52

网络安全数据技术

2019-01-02 10:49:54

Tomcat内存HotSpot VM

2021-06-11 07:26:16

操作系统内存管理Cpu

2018-12-06 12:58:50

CPU内存模块

2019-07-10 05:08:05

CPU内存分页管理

2021-10-17 23:53:17

内存管理方式

2019-03-05 14:37:55

程序员加薪老板

2019-12-10 14:51:00

CPU缓存内存

2011-03-25 11:28:35

Cacti数据

2017-06-02 10:57:29

Android内存泄漏Dialog

2017-11-02 15:44:11

内存降价价格

2021-03-22 11:51:22

Java内存栈上

2015-07-02 14:07:19

Boss直聘

2009-08-14 17:49:07

最好的企业Wi-Fi

2017-07-19 15:54:30

内存硬盘DDR3

2014-04-15 13:46:41

亚马逊云游戏
点赞
收藏

51CTO技术栈公众号