段表和页表
一、概述处理器(CPU)
1.1 处理器位数
在intel处理器的X86系列中,包含8086和8088的16位处理器,以及从80386(即i386)开始的32位处理器,而如今又有X86-64架构的64位处理器。
那这些16位,32位和64位又有什么意义了?位数越高,处理器的寻址能力越强,则可以支持越大的物理内存。具体如下表(可见对于64位处理器的寻址范围已经是非常之大):
处理器位数 |
可支持的物理内存大小 |
寻址范围 |
16 |
2^16 = 64K |
0x0000 ~ 0xffff |
32 |
2^32 = 4G |
0x00000000 ~ 0xffffffff |
64 |
2^64 |
|
在平时安装操作系统时候,经常会问是要装32位系统还是64位系统?对于32位处理器,只能安装32位的系统,不能安装64位系统。对于64位处理,既能够安装32位的系统,也可以安装64位的系统。在Linux下可以通过下面的方面查询系统装的是几位的:
(1) 查看根目录下是否有有lib64目录。32位系统只有/lib一个目录,64位的系统会有/lib64和/lib两个目录。
(2) 执行getconf LONG_BIT命令查看返回结果。32位的系统中long类型是4字节(32位),64位的系统中long类型已变成了8字节(64位)。
(3) 执行uname -i命令。32位的系统返回i386,64位的系统放回x86_64。
(4) 执行file /bin/ls命令。
32位系统返回如下结果:
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5,dynamically linked (uses shared libs), stripped
64位系统返回如下结果:
/bin/ls: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9,dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped
1.2 处理器的寄存器
寄存器是处理器的组成部分,是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。寄存器的访问速度在所有存储阶层(见下图)是最快的。
那么,MMU是怎么将逻辑地址转换成物理地址?
MMU是一种硬件电路,它包含两个部件,一个是分段部件,一个是分页部件,通过分段机制(把一个逻辑地址转换为线性地址,线性地址也是32位,其地址取值范围为0x00000000~0xffffffff)和分页机制(把一个线性地址转换为物理地址),最终将逻辑地址映射为物理地址。如下图:
在Linux中,主要设置了:内核代码段,内核数据段,用户代码段,用户数据段。而且每个段的基地址对应线性地址都是为0,而且都可以使用4G的地址空间,相当与绕过了逻辑地址和线性地址的映射,从而完全利用了分页机制。另外,分段中怎样使用段寄存器可以参考:http://book.51cto.com/art/200812/103305.htm
2.3 分页机制
通过使用分页机制可以很好的提高内存利用率。分页机制把一个线性地址转换为物理地址。Linux下一个页大小为4K,把线性地址(32位)和物理地址(32位,2^32=4G物理内存)都按照4K(2^12)页大小来进行划分,那么,一共有4G/4K=1M的页面,如果只是简单的进行线性地址和物理地址一对一记录映射的话,这样在映射表建立的就会占用比较大的物理内存。这个时候就引入了页表和页目录表,地址转换过程见下图:
<img size-full="" wp-image-55693"="" title="page" src="http://files.blogcn.com/wp01/M00/00/70/wKgKZU12D7kAAAAAAAB1SQBldMI314.png" alt="" width="501" height="353" style="border: 0px; max-width: 900px;">
(1) 通过对32位线性地址划分:第31~22这10位(2^10=1024)定位页目录项,第21~12这10位定位页表项,第11~0这12位(2^12=4K)为页内偏移值。
(2) 对于页目录表,有1024个页目录项,每个页目录项(又含有1024个页表项)指向下一级页表的物理地址(32位=4个字节),那么一共需要1024*4(=4K)字节,即只要分配一页就可以完全存放。
(3) 对于页表,原理和页目录表一样,那么一共需要1024(1024个页目录项)*1024(每个页目录项含有1024个页表项)*4(=1M)字节。
(4) 对于页目录的物理地址,就存放在CR3寄存器中。
所以,这样可以寻址1024*1024*4K=4G的物理内存。另外,在Linux的X86架构引入了3级页表机制(包括了页全局目录、页中间目录和页表)。
【参考】
2、OReilly.Understanding.the.Linux.Kernel.3rd.Edition