【程序员必备小知识-内存知识17】虚拟内存管理

引言

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

现代操作系统普遍采用虚拟内存管理Virtual Memory Management)机制,这需要MMU(Memory Management Unit)的支持,本文简要介绍Linux操作系统的虚拟内存管理。

内存空间

对于32位的cpu来说。可寻址空间可达到4个G,Linux把这4个G的空间又分成两部分,一部分提供给用户,供用户访问,另一部分给内核,用来切换到内核态进行访问的空间,如下图所示:

image.png

虚拟地址

但是cpu是不可能把这么多条地址线接到引脚上的,因此,只是让内核和实际的物理内存空间关联,那用户要是想访问物理内存空间怎么办呢?那就不能直接访问,通过转换,用户访问的实际地址被MMU拦截,并不直接到达cpu的引脚,而是通过转换,访问另一个内存地址,也叫内存映射

内存映射

内存映射,其实就是将虚拟内存地址映射到物理内存地址。这样就不用给每个进程都提供独立的物理内存地址了,进程之间可以用相同的虚拟地址,只要映射到的物理地址不同就行了,当然映射不是随便进行的,而是通过页表

页表

页表记录了虚拟地址与物理地址的映射关系,有点像路由器,就是起一个路由的作用,这个页表是在MMU的内部的。

image.png

MMU

MMU将虚拟地址映射到物理地址是以页(Page)为单位的,对于32位CPU通常一页为4KB,每一次映射都需要关联4KB大小或者整数倍的内存空间,但这会带来一个问题就是:填满页表需要的项数太多,Linux 提供了多级页表和大页(HugePage)来解决页表项过多的问题。

猜你喜欢

转载自juejin.im/post/7017081000995848200