- 论坛徽章:
- 1
|
由于计算机系统中所含的实际物理内存容量是有限的。为了能有效地使用这些物理内存,Linux采用了Intel CPU的内存分页管理机制,使用虚拟线性地址与实际物理内存地址映射的方法让所有同时执行的程序共同使用有限的内存。内存分页管理的基本原理是将整个主内存区域划分成4096字节为一页的内存页面。程序申请使用内存时,就以内存页为单位进行分配。
在使用这种内存分页管理方法时,每个执行中的进程(任务)可以使用比实际内存容量大得多的线性地址空间。对于Intel 80386系统,其CPU可以提供多达4G的线性地址空间。而linux 0.11内核则为每个进程分配了64MB的线性地址空间,见图所示。
为了使用实际物理内存,每个进程的线性地址通过二级内存页表动态地映射到主内存区域的不同内存页上。因此每个进程最大可用的虚拟内存空间是64MB。
每个进程的逻辑地址通过加上任务号*64M即可转换为线性地址。不过在注释中,我们通常将进程中的地址简单地称为线性地址。
对于Intel 80386系统,其CPU可以提供多达4G的线性地址空间。对于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。因此所使用的虚拟地址空间范围是 64MB*64 =4G,见图2.7所示。4G正好与CPU的线性地址空间范围或物理地址空间范围相同,因此在0.11内核中比较容易混淆三种地址概念。 |
|