正在阅读:《编程高手箴言》读后感(2)《编程高手箴言》读后感(2)

2004-04-05 14:41 出处:CSDN 作者:seacloud 责任编辑:sdq

  下面我试图用尽量通俗的文字描述这个过程,尽量少设计386保护模式的一些术语。至于官方的说法请参考Intel 386程序员手册,这个手册可以从Intel免费下到。给个链接吧,免得有的同志再去搜了,http://www.intel.com/design/Pentium4/manuals/245470.htm。OK, let's go! 这里要描述的是一些主流操作系统使用的flat,paging模式。何谓flat,其实386CPU还是保留了早期CPU的分段功能,而flat模式就是将段的基地址设为0,而将这个段的范围设为4G,这样,其实是没有用分段功能。何谓paging呢,就是把虚拟内存分成许多小块,然后将这些块再映射到物理内存或者辅助存贮器,比如硬盘。这就解释了为什么可以提供给普通程序员大的多的(比如3G)内存空间,因为我们可以把一些虚拟内存映射到磁盘上,在需要的时候在将他们调到物理内存中去。

  如果我们反汇编一些程序,就可以看到,从表面上看,好像访问内存的方法和过去没什么差别嘛。实际的情况是这种差别是藏在幕后的。我们在汇编程序里使用的其实是“虚拟地址”,虚拟地址的形成还是和过去的段式管理一样,即段的开始地址加上偏移量。由于在flat模式下,所有的段开始地址都是0,所以我们在汇编程序里指定的偏移就是最终的虚拟地址了。

  比如下面这个语句,movl $0x4321,0x8049430,其含义是将整数0x4321送到地址是0x8049430的地方去。(抱歉,由于我手头的机器上没有Win32平台的开发工具,只好从用gdb反汇编的程序中摘了一行)在flat模式下,0x8049430就是最终的虚拟地址了。得到虚拟地址后,革命成功了第一步,下面就是要利用分页管理来得到最终的物理地址了。过程如下,首先把虚拟地址,也就是0x8049430的高10bits取出来作为一个index去索引“第一个”表格,这个表格的起始地址放在系统CR3寄存器里。从“第一个”表格里取到一个32位整数,而这个整数就对应了“第二个”表格的起始地址。然后将虚拟地址0x8049430的中间10个bits拿出来索引这第二个表格,又可以得到一个32位的值,这个值其实就是一个物理地址了,用这个物理地址加上刚才0x8049430剩下的12个bits的值就可以形成最终0x8049430对应的物理地址了。写完了上面这个过程,我自己也回头看了一下,确实写的不怎么清楚,是吧?那好,我们就举个实际生活中一个不存在的例子来说明(废话,既然不存在还说了干吗:-)。

  假如你经营一个很大的酒店,现在让你接待很多来自全国各地的旅客,聪明的你想到了一个安排他们的方法,每来一个人,你就拿过他的身份证,(假设身份证的格式是 “省名-城市名-出生序号”)根据他所属的省份去查找“第一个”表格,让他到这个省份对应的办公室去。这个旅客到了省份对应的办公室后,就有一个接待人员拿过他的身份证根据接下来的城市信息查“第二个”表格又把他安排到这个城市的旅客所属的楼层去。这个旅客到达相应的楼层后,根据自己的出生序号再找到自己的房间。也许你要问,干吗还要按照省份先进行一次安排操作啊,干吗不直接安排到相应的城市对应的办公室去啊?原因是为了节约几个办公室,有的省份因为没有计划,所以聪明的你根本就没有安排这个省份下面城市对应的办公室,来了一个人,你根据他的省份立即就可以知道这个人应不应该接待,否则如果每个城市一个办公室,那多浪费啊,特别如果你的客人只集中在几个特定的省份的时候。

  而我们的程序在运行的时候恰恰就是“客人只集中在几个特定的省份”这种情况,所以采取了两级索引的方式,这样可以节约用来维护分页机制所需要表格的尺寸。如果不这样,我们假设一个小块单元是4K bytes,那么映射4G空间我们就需要4M+4K bytes来存放分页所需要的表格。(这个值是这样计算的,“第一个”表格是4K大小,有1024个表项,每个表项对应一个“第二个”表,这样就有1024个第二个表,而每个第二个表尺寸也是4K,于是就需要4M的空间放“第二个”表)

  呵呵,费了半天劲,也不知道说清楚了没有。对这个部分感兴趣的同志可以进一步参考Intel手册和Linux启动代码。另外,保护模式的一个很重要的概念就是“保护”,系统里面的段啊,页啊都有很多属性和权限,低权限的代码不可以调需要更高权限的指令。你想想,如果不是这样的话,用户程序只要随便改改那两个表格,岂不是什么地址都可以访问了,呵呵。一些病毒代码挖空心思也就是想让病毒体在CPU的最高特权级下运行,CIH病毒就是一个很好的证明。

  噢,对了,这个链接http://jiurl.nease.net/document/JiurlPlayWin2k/MmPaging1.htm给出了关于分页机制的比我讲的好的多得文章,感兴趣的同志可以去看看。如果有同志想写自己的小测试程序,推荐到sourceforge上下载bochs,一个x86模拟器,这样至少可以免去你reboot computer的烦恼。

察看评论详细内容 我要发表评论
作者笔名简短内容 发表时间
:

键盘也能翻页,试试“← →”键

相关文章

关注我们

最新资讯离线随时看 聊天吐槽赢奖品