1 在 linux 0.11 内核中,为了有效地使用系统的物理内存,内存被划分成几个功能区域,见下图2.6
linux内核程序占据物理内存的开始部分;其后是供硬盘等块设备使用的高速缓冲区部分(读或者写的块I/O请求数据一般都先放在高速缓冲区)。最后是所有程序都可以随时申请使用的主内存区部分。内核程序要使用主内存区,也要向内核的内存管理模块提出申请。对于含有RAM虚拟盘的系统,主内存区头部还要划出一部分给虚拟盘存放数据。
关于地址映射:
2. 为什么要有地址映射?因为实际物理内存的容量是有限制的。为了能有效地使用这些物理内存,Linux 采用了Intel CPU 的内存分页管理机制,使用虚拟线性地址与实际物理内存地址映射的方法让所有同时执行的程序共同使用有限的内存。内存分页管理的基本原理是将整个主内存区域划分成4096 字节为一页的内存页面。程序申请使用内存时,就以内存页为单位进行分配。
3. 有哪些地址映射?linux 0.11 中,在进行地址映射时,我们需要分清3 种地址之间的变换:
a. 进程虚拟地址,是从虚拟地址0 开始计,最大64M(linus大牛当时自己规定的,后来变了)。
b. CPU 的线性地址空间(0--4G,地址线32根,232 = 4G)。
c. 实际物理内存地址。
4. 这些地址之间怎么转换?
a) 进程虚拟地址--->cpu线性地址 : 通过“局部描述符”变换。
b) cpu--->物理内存地址: 通过页表变换。
通过这两步,我们进程的虚拟地址就变换为实际的物理内存地址。
5. 对于linux 0.11 内核,系统设置全局描述符表GDT 中的段描述符项数最大为256,其中2 项空闲、2 项系统使用,每个进程使用两项。因此,此时系统可以最多容纳(256-4)/2 + 1=127 个任务,并且虚拟地址范围是 ((256-4)/2)* 64MB 约等于8G。但0.11 内核中人工定义最大任务数NR_TASKS = 64 个,每个进程虚拟地址(或线性地址)范围是64M,并且各个进程的虚拟地址起始位置是(任务号-1)*64MB。因此64个进程共使用的虚拟地址空间范围是64MB*64 =4G,4G 正好与CPU 的线性地址空间范围或物理地址空间范围相同。示意如下图: