Linux 内存管理浅析

来源:互联网 发布:怪物猎人XX数据库安卓 编辑:程序博客网 时间:2024/05/18 18:54

(2). 分页机制介绍

对于物理内存,我们通过地址将其分解成一个个连续的小片段。这样就给我们提供了很大的灵活性。我们可以将其中一小段(甚至是不连续的)分配给一个进程,再把另外的一部分分配给其他进程。重要的是,我们可以将不连续的内存分配给同一个进程的连续虚拟地址,这样对于用户进程来说,这段地址空间还是连续的。分页机制就是通过将物理内存地址分成连续的片段,这样一个片段,我们称之为一页。页面大小就是所分的片段连续地址大小。

这里我所说的分页,是对于物理地址空间的分页,它包含了物理内存和其他统一编址在物理地址空间的设备。而用户进程地址空间,我们看到,其实是没有相应的分页机制的。它所关心的就是地址的起始地址及大小。

对于页面大小,我们可以配置。但这和具体的CPU有关,如e6500,我们将会看到,为了设计简单化,页面大小其实是固定为4KB的。有人可能会说,不是有huge page吗,这个我后面会说是怎么实现的。现在就引出了一个问题,页面是怎么表示的,它又是保存在什么地方的?由谁来操作它?

页面是一个抽象的概念。当我们说去访问一个页面时,指的是访问这个页面所代表的一段地址。那么我们怎么在内核中表示这个页面呢?当某个模块需要对某段地址(某页)进行操作时,需要能够记录下这个操作,否则这个模块不知道自己进行过什么操作。页面这个实体就记录了这样一个操作。它反映了代码对某一页(某一段)的行为结果。那么自然的,这个记录的实体,我们通过定义一个数据结构来表示它(struct page )。在后面物理内存管理部分,我们会看到这样一个结构体。

页面是如此的重要,在内核进程中,无时无刻都有可能去访问它,以至于我们要对它的设计加倍小心。后面物理内存管理部分我们会看到这方面的详细介绍。

由于虚拟地址需要映射到物理地址,当物理地址划分为连续的页面时,映射到单独页面的虚拟地址,自然的就会和页面地址大小相同。所以当我们看到一段连续的虚拟地址映射到物理地址时,这段地址好像也是具有分页效果的。下面我们看下他们的映射关系。


这里写图片描述


从上面我们可以看到,不同用户进程地址可能会映射到相同的物理页面。这是有可能的,这意味着不同进程间共享了这段物理内存。我用地址段来描述进程虚拟地址,每个地址段代表了一段连续的虚拟地址。我们可以看到,因为需要映射到物理内存页面,虚拟地址段也必须要页面对齐。

原创粉丝点击