快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

和记怡情娱:Linux 内存管理高端内存的映射方式



高端内存是指物理地址大年夜于 896M 的内存。

对付这样的内存,无法在“内核直接映射空间”进行映射和记怡情娱。

为什么?

由于“内核直接映射空间”最多只能从 3G 到 4G,只能直接映射 1G 物理内存,对付大年夜于 1G 的物理内存,力所不及。

实际上,“内核直接映射空间”也达不到 1G, 还得留点线性空间给“内核动态映射空间” 呢。

是以,Linux 规定“内核直接映射空间” 最多映射 896M 物理内存。

对付高端内存,可以经由过程 alloc_page() 或者其它函数得到对应的 page,然则要想造访现什物理内存,还得把 page 转为线性地址才行(为什么?想想 MMU 是若何造访物理内存的),也便是说,我们必要为高端内存对应的 page 找一个线性空间,这个历程称为高端内存映射。

高端内存映射有三种要领:

1、映射到“内核动态映射空间”

这种要领很简单,由于经由过程 vmalloc() ,在“内核动态映射空间”申请内存的时刻,就可能从高端内存得到页面(参看 vmalloc 的实现),是以说高端内存有可能映射到“内核动态映射空和记怡情娱间” 中。

2、永远内核映射

假如是经由过程 al和记怡情娱loc_page() 得到了高端内存对应的 page,若何给它找个线性空间?

内核专门为此留出一块线性空间,从 PKMAP_BASE 到 FIXADDR_START ,用于映射高端内存。在 2.4 内核上,这个地址范围是 4G-8M 到 4G-4M 之间。这个空间起叫“内核永远映射空间”或者“永远内核映射空间”

这个空间和其它空间应用同样的页目录表,对付内核来说,便是 swapper_pg_dir,对通俗和记怡情娱进程来说,经由过程 CR3 寄存器指向。

平日环境下,这个空间是 4M 大年夜小,是以仅仅必要一个页表即可和记怡情娱,内核经由过程来 pkmap_page_table 探求这个页表。

经由过程 kmap(), 可以把一个 page 映射到这个空间来

因为这个空间是 4M 大年夜小,最多能同时映射 1024 个 page。是以,对付不应用的的 page,及应该时从这个空间开释掉落(也便是解除映射关系),经由过程 kunmap() ,可以把一个 page 对应的线性地址从这个空间开释出来。

3、临时映射

内核在 FIXADDR_START 到 FIXADDR_TOP 之间保留了一些线性空间用于特殊需求。这个空间称为“固定映射空间”

在这个空间中,有一部分用于高端内存的临时映射。

这块空间具有如下特征:

1、每个 CPU 占用一块空间

2、在每个 CPU 占用的那块空间中,又分为多个小空间,每个小空间大年夜小是 1 个 page,每个小空间用于一个目的,这些目的定义在 kmap_types.h 中的 km_type 中。

当要进行一次临时映射的时刻,必要指定映射的目的,根据映射目的,可以找到对应的小空间,然后把这个空间的地址作为映射地址。这意味着一次临时映射会导致曩昔的映射被覆盖。

经由过程 kmap_atomic() 可实现临时映射。

下图简单简单表达若何对高端内存进行映射

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: