Linux内存管理(二)——地址映射

x86系列CPU寻址

基本概念

CPU位数:ALU位数;
总线:可作为地址总线或数据总线或控制总线使用,具体视发送指令而定;
地址总线:CPU通过地址总线来指定存储单元;
数据总线:CPU与内存或其他器件之间的数据传送的通道,位数与CPU位数一样;
CPU寻址:CPU发出相应指令到地址总线上,寻找主存相应地址;
MMU:内存管理单元,转换成物理地址,之后发送到地址总线上;

寻址方式的变化

远古:
8位CPU,8位数据总线、16位地址总线;寻址能力2^16=64KB
设计16位指令运算
8086:
16位CPU,16位数据总线、20位地址总线;寻址能力2^20=1MB
因为16位数据总线与20位地址总线的不匹配,故设计段寄存器(如CS)+段偏移寄存器(如IP)来完成20位的地址的合成。具体:段寄存器>>4+段偏移寄存器=20位地址
但易出现问题:1、段寄存器+段偏移寄存器得到的实际地址,没有保护的话,用户很容易修改相应内容,造成计算机的破坏;2、寻址能力的不够,只有1MB
80386用户空间:
32位CPU,32位数据总线,32位地址总线;寻址能力2^32=4GB
明显,直接发送32位地址到地址总线上是最清晰的
但为了兼容之前的CPU,以及防止直接篡改寄存器内容而任意访问内存
设计保护模式:(之前直接得到物理地址-实模式)
设计GDT, LDT两个地址表,表项中内容如下:
Linux内存管理(二)——地址映射
B0-B31即所指段基地址;
新添GDTR, LDTR两个寄存器指向地址表所在地址
段寄存器仍为16位,但含义发生改变:
Linux内存管理(二)——地址映射
总结一下:
指令性质->段寄存器->GDTR/LDTR->GDT/LDT+段寄存器中index
->具体描述符->基地址+段偏移寄存器32位(如EIP)->线性地址
但是,由于段的长度可变,盘区交换操作很容易不便,同时进程划分为多段,需要频繁改变段寄存器内容

页式管理

如果将之前基地址都设置为0,那么逻辑地址即偏移地址=线性地址=虚拟地址,这样再经过一步页式转换得到物理地址,送到地址总线中。
具体,增设CR3寄存器,PGD、PMD、PT三个表
Linux内存管理(二)——地址映射
设置PGD、PMD、PT三个表主要是为了64位CPU等的扩展。
在32位CPU中PMD表格中只有1项,所以3层映射实际即2层映射。

总结:

地址映射分为用户空间—物理内存,内核空间—物理内存两部分,以page_offset为界。
Linux内存管理(二)——地址映射
Linux内存管理(二)——地址映射

用户空间:

Intel为了兼容之前系列产品,设计段寄存器->+GDTR\LDTR->GTD/LDT->+段寄存器index->基地址(都设为0)->+EIP/程序计数器->线性地址->+CR3->三层页面映射->物理地址

内核空间

内核的虚拟地址和物理地址,大部分只差一个线性偏移量。
由于内核的虚拟和物理地址只差一个偏移量:物理地址 = 逻辑地址 – 0xC0000000。所以如果1G内核空间完全用来线性映射,显然物理内存也只能访问到1G区间,这显然是不合理的。HIGHMEM就是为了解决这个问题,专门开辟的一块不必线性映射,可以灵活定制映射,以便访问1G以上物理内存的区域。
在x86结构中,Linux内核虚拟地址空间划分0~3G为用户空间,3~4G为内核空间(注意,内核可以使用的线性地址只有1G)。内核虚拟空间(3G~4G)又划分为三种类型的区:
1. ZONE_DMA 3G之后起始的16MB
2. ZONE_NORMAL 16MB~896MB
3. ZONE_HIGHMEM 896MB ~1G 高端内存
Linux内存管理(二)——地址映射
高端内存的基本思想:借一段地址空间,建立临时地址映射,用完后释放,达到这段地址空间可以循环使用,访问所有物理内存。
内核直接映射空间 PAGE_OFFSET~VMALLOC_START:
kmalloc和__get_free_page()分配的是这里的页面。二者是借助slab分配器,直接分配物理页再转换为逻辑地址(物理地址连续)。适合分配小段内存。此区域 包含了内核镜像、物理页框表mem_map等资源。
内核动态映射空间 VMALLOC_START~VMALLOC_END:
被vmalloc用到,可表示的空间大。
内核永久映射空间 PKMAP_BASE ~ FIXADDR_START:
kmap
内核临时映射空间 FIXADDR_START~FIXADDR_TOP:
kmap_atomic

地址映射的共性与特性

虚拟内存管理是共性,x86的GDT和LDT是特性,但其实也只是走个过场。

参考文章

http://www.cnblogs.com/onlyforcloud/articles/4473981.html