段表和页表

一、概述处理器(CPU

1.1 处理器位数

intel处理器的X86系列中,包含8086808816位处理器,以及从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位的系统返回i38664位的系统放回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物理内存)都按照4K2^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~2210位(2^10=1024)定位页目录项,第21~1210位定位页表项,第11~012位(2^12=4K)为页内偏移值。

(2) 对于页目录表,有1024个页目录项,每个页目录项(又含有1024个页表项)指向下一级页表的物理地址(32=4个字节),那么一共需要1024*4=4K)字节,即只要分配一页就可以完全存放。

(3) 对于页表,原理和页目录表一样,那么一共需要10241024个页目录项)*1024(每个页目录项含有1024个页表项)*4=1M)字节。

(4) 对于页目录的物理地址,就存放在CR3寄存器中。

所以,这样可以寻址1024*1024*4K=4G的物理内存。另外,在LinuxX86架构引入了3级页表机制(包括了页全局目录、页中间目录和页表)。

【参考】

1深入分析Linux内核源码

2OReilly.Understanding.the.Linux.Kernel.3rd.Edition

3PPT: http://www.docin.com/p-54896290.html

4http://www.ibm.com/developerworks/cn/linux/l-memmod/

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值