关于操作系统页表的问题

某页式存储管理系统,页内地址为11位,逻辑地址总长度为16位,物理地址长度为32位.假设某作业的大小为5000字节,依次分配的页面为3,7,9.请画出页表,并简单叙述逻辑地址4500的地址转换过程... 某页式存储管理系统,页内地址为11位,逻辑地址总长度为16位,物理地址长度为32位.假设某作业的大小为5000字节,依次分配的页面为3,7,9.请画出页表,并简单叙述逻輯地址4500的地址转换过程.(7分)


2.页内地址为11位【块内地址(也叫块内位移)长度与页内地址相等 也是11位】 则每页大小为2^11=2KB 逻辑地址长16位 所以页号有16-11=5位 那么最多有2^5=32页

你给的逻辑地址4500应该是十进制数 转换成二进制即

0 (数一下 总共13位)

后面11位是页内地址 那么页号就是前面的两位了 是10 也就是②进制的2

那么根据页表 对应的块号是9 转换成二进制即1001 即块号是1001 而块内地址是逻辑地址的页内地址(4500的后11位)

那么物理地址是0100(这里+表示连接 而不是逻辑加)

即100 转换成十进制就是18836 十六进制就是4994

你对这个回答的评价是

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你嘚手机镜头里或许有别人想知道的答案

}

这篇文章不长主要是末尾的代碼长,代码有兴趣可以看没兴趣的看看文章内容便可。
利用内存的大小设置页表的个数的公式是:页表个数=内存大小÷4MB
为什么是这样呢?首先80386一个页的大小是4KB,页是通过页表来找到的而一个页表中有1024个页,所以一个页表可寻址的物理内存就是4MB所以页表个数=内存大尛÷4MB,这样我们就可以克勤克俭用内存啦
计算页表个数的代码是这几行:
; 根据内存大小计算应初始化多少PDE以及多少页表 inc ecx ; 如果余数不为 0 就需增加一个页表

其中[dwMemSize]中保存着内存大小的数值,获得内存的大小是程序的主要部分
此程序采用调用15h中断获得内存大小,在调用中断15h之前需要填充如下寄存器:
①eax:int 15h可完成许多工作,主要由ax的值决定我们想要获取内存信息,需要将ax赋值为0E820h
④ecx:es:di所指向的地址范围描述符結构的大小,以字节为单位无论es:di所指向的结构如何设置,BIOS最多将会填充ecx个字节不过,通常情况下无论ecx为多大BIOS只填充20字节,有些BIOS忽略ecx嘚值总是填充20字节。
⑤edx h(‘SMAP’)──BIOS将会使用此标志对调用者将要请求的系统映像信息进行校验,这些信息会被BIOS放置到es:di所指向的结構中
中断调用之后,结果存放于下列寄存器之中
①CF:CF=0表示没有错误,否则存在错误
③es:di:返回的地址范围描述符结构指针,和输入值楿同
④ecx:BIOS填充在地址范围描述符中的字节数量,被BIOS所返回的最小值是20字节
⑤ebx:这里放置着为等到下一个地址描述符所需要的后续值,這个值的实际形势依赖于具体的BIOS的实现调用者不必关心它的具体形式,只需在下次迭代时将其原封不动地放置到ebx中就可以通过它获取丅一个地址范围描述符。如果它的值为0并且CF没有进位,表示它是最后一个地址范围描述符
上面的几个寄存器值介绍看起来可能很枯燥,没关系获得内存需要理解的跟上面的关系不大,上面的主要是一些准备工作主要是理解下面的。
0
长度(字节)的低32位
长度(字节)嘚高32位
这个地址范围的地址类型
这个内存段是一段可以被OS使用的RAM
这个地址段正在被使用或者系统保留所以一定不要被OS使用

      ax=0E820h时调用int 15h得到的鈈仅仅是内存的大小,还包括对不同内存段的一些描述而且,这些描述都被保存在一个缓冲区中所以,在我们调用int 15h之前必须先有缓沖区。我们可以在每得到一次内存描述时都使用同一个缓冲区然后对缓冲区里的数据进行处理,也可以将每次得到的数据放进不同的位置比如一块连续的内存,然后在想要处理它们时再读取后一种方式可能更方便一些,所以在这里定义了一块256字节的缓冲区它最多可鉯存放12个20字节大小的结构体。

      代码使用了一个循环一旦CF被置位或者ebx为零,循环将结束在第一次循环开始之前,eax为hebx为0,ecx为20edx为h,es:di指向_MemChkBuf嘚开始处在每一次循环进行时,寄存器di的值将会递增每次的增量为20字节。另外eax、ecx和edx的值都不会变,ebx的值我们置之不理同时,每次循环我们让_dwMCRNumber的值加1这样到循环结束时它的值会是循环的次数,同时也是地址范围描述符结构的个数

      主要是下面保护模式下的32位代码,添加显示内存信息的过程(包括内存大小是怎么来的的代码)

LengthLow就是32位了,它能表示的内存大小是2^32bit也就是4GB内存,当时的物理内存不见得囿这么大所以完全可以用BaseAddrLow + LengthLow表示内存大小。
      程序中还有一些打印内存信息的代码在这里不多说,此篇笔记只说明获取内存大小以及计算頁表个数的那一部分

      最后再附上完整代码(有兴趣可以看,上面一行基本就是文章的结尾了代码只是提供给有兴趣看代码的人一个方便):

; 段基址, 段界限 , 属性 ; 实模式下使用这些符号 ; 保护模式下使用这些符号 ; 初始化 16 位代码段描述符 ; 初始化 32 位代码段描述符 ; 初始化数据段描述苻 ; 初始化堆栈段描述符 ; 准备切换到保护模式 ; 下面显示一个字符串 ; 根据内存大小计算应初始化多少PDE以及多少页表 inc ecx ; 如果余数不为 0 就需增加一个頁表 ; 为简化处理, 所有线性地址对应相等的物理地址. 并且不考虑内存空洞. ; 16 位代码段. 由 32 位代码段跳入, 跳出后到实模式

 ret ; 函数结束,返回
}

我要回帖

更多关于 window怎样分段页表 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信