Linux内核高端内存

时间:2019-03-06         浏览次数

假设按照上述简单的地址映射关系,那么内核逻辑地址空间访问为0xc0000000 ~ 0xffffffff,那么对应的物理内存范围就为0x0 ~ 0x40000000,即只能访问1G物理内存。若机器中安装8G物理内存,那么内核就只能访问前1G物理内存,后面7G物理内存将会无奈访问,因为内核的地址空间已经全部映射到物理内存地址范围0x0 ~ 0x40000000。即使装置了8G物理内存,那么物理地址为0x40000001的内存,内核该怎么去访问呢?代码中必须要有内存逻辑地址的,0xc0000000 ~ 0xffffffff的地址空间已经被用完了,所以无奈访问物理地址0x40000000当前的内存。

Linux内核地址映射模型

x86 CPU采用了段页式地址映射模型。进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正拜访物理内存。

Linux内核地址空间划分

段页式机制如下图。

当内核模块代码或线程访问内存时,代码中的内存地址都为逻辑地址,而对应到真正的物理内存地址,需要地址一对一的映射,如逻辑地址0xc0000003对应的物理地址为0x3,0xc0000004对应的物理地址为0x4,… …,逻辑地址与物理地址对应的关联为

Linux内核高端内存的由来

通常32位Linux内核地址空间划分03G为用户空间,34G为内核空间。留心这里是32位内核地址空间划分,64位内核地址空间划分是不同的。

物理地址 = 逻辑地址 ? 0xC0000000