课堂练习4.4:页式虚存

第1关:版本 0 内核的第一次缺页页故障

本关任务:

分析版本 0 内核的第一次缺页页故障,回答下列问题:

1.该页故障由几号进程引发?

2.在该故障发生前,该进程执行的最后一个可执行文件是什么?该可执行文件的第 2 块(每块 1KB )的头 16 字节的内容是什么?

3.引发该页故障的线性地址是什么?该进程的代码段起始地址是多少?

4.该页故障处理前,该线性地址对应的页目录项的地址和值分别是什么?

5.该页故障处理时,申请到的空闲页帧的起始地址是什么?该页帧的头 16 字节的内容是什么?

6.该页故障处理过程中、读入硬盘数据后,上述页帧的头 16 字节的内容是什么?

7.该页故障处理过程中、修改对应的页表项后,上述线性地址对应的页表项的值是什么?

启动gdb调试在do_execve函数设置断点,并跳到断点处

可以看到是页故障是2号进程引发,最后一个执行文件是/bin/sh

在bochsdbg模式下,使用hexdump /bin/sh | less命令,查看/bin/sh文件的第二块的头16字节的内容

启动gdb,将断点打到do_no_page函数并跟踪

查看引发该页故障的线性地址和该进程的代码段起始地址

查看该线性地址对应的页目录项的地址和值,可以看到地址为0x80,对应的值是0x0

然后在do_no_page函数内部的分配空闲页帧(381行),读入数据(387行),修改页表项(394行)三处分别设置断点,以跟踪页故障的处理过程

先执行分配空闲页帧的语句(381行),即可查看分配到的空闲页帧的起始地址,再查看该页帧的头16字节内容。可以看到此时页帧的头16字节全为00

执行读入数据的语句(387行),再查看页帧的头16字节内容

再执行修改页表项的语句(394行),重新查看上述线性地址对应的页表项的值

最终答案:

1.该页故障由几号进程引发?(2)

2.在该故障发生前,该进程执行的最后一个可执行文件是什么?(/bin/sh)该可执行文件的第2块(每块1KB)的头16字节的内容是什么?(8b 44 24 08 a3 00 f0 02 00 e8 26 01 00 00 6a 00)

头16字节的内容按照(00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00)这种格式填写。

3.引发该页故障的线性地址是什么?(0x8000000)该进程的代码段起始地址是多少?(0x8000000)

4.该页故障处理前,该线性地址对应的页目录项的地址和值分别是什么?(0x80)(0x0)

5.该页故障处理时,申请到的空闲页帧的起始地址是什么?(0xffa000)该页帧的头16字节的内容是什么?(00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00)

6.该页故障处理过程中、读入硬盘数据后,上述页帧的头16字节的内容是什么?(8b 44 24 08 a3 00 f0 02 00 e8 26 01 00 00 6a 00)

7.该页故障处理过程中、修改对应的页表项后,上述线性地址对应的页表项的值是什么?(0xffa007)

第2关:第一次使用零页的缺页页故障

本关任务

回答问题:在版本 0 内核中处理第一次使用零页的缺页页故障时:

1.该页故障由几号进程引发?

2.在该故障发生前,该进程执行的最后一个可执行文件是什么?该可执行文件的未初始化数据段( BSS )的起始虚拟地址( VMA )是什么?

3.引发该页故障的线性地址是什么?

4.该页故障处理前,该线性地址对应的页表项的地址和值分别是什么?

5.该页故障处理后,上述线性地址对应的页表项的值是什么?该线性地址被映射到的零页(新页帧)的起始地址是什么?

6.该新页帧的头 16 个字节是什么?

启动gdb,查看该故障发生前进程执行的最后一个可执行文件

文件名为/bin/sh

退出gdb调试,用./run启动bochs虚拟机,把文件/bin/sh拷入Ubuntu容器

关闭虚拟机(记得点击Yes)

切换到~/os/linux-0.11-lab目录后在命令行用objdump命令查看sh的未初始数据段(BSS)的起始虚拟地址(VMA)  objdump -dlx b/sh | less

再次启动gdb调试,在函数do_no_page处设置断点并跳转,再在其内部分配零页的语句(376行)处设置断点并跳转

然后一直continue,直到第一次跳到376行的断点处,说明即将处理第一次使用零页的缺页页故障

同时可以看到是2号进程

再查看引发该页故障的线性地址

要查看该线性地址对应的页表项的地址和值,可以使用下面这种方法

可以看到地址是0xff70c8,值为0x0

但如果你是这样做的,那恭喜你又要浪费半小时时间!因为这样做会通过不了…

必须使用下面这种方式

先访问第32号页目录项获取对应页表的首地址(注意去掉低12位的偏移量),再查找页表的第50项获取对应页表项的地址和值

然后执行分配零页的语句,即跳到页故障刚处理后,重新查看对应页表项的值

可以看到,对应页表项的值变成了0x00ff2007

将其去掉低12位的偏移量,即为该线性地址被映射到的零页(新页帧)的起始地址0x00ff2000

查看其头16个字节:

最终答案:

1.该页故障由几号进程引发?(2)

2.在该故障发生前,该进程执行的最后一个可执行文件是什么?(/bin/sh)该可执行文件的未初始化数据段(BSS)的起始虚拟地址(VMA)是什么?(0x32000)

3.引发该页故障的线性地址是什么?(0x8032000)

4.该页故障处理前,该线性地址对应的页表项的地址和值分别是什么?(0xff70c8)(0x0)

5.该页故障处理后,上述线性地址对应的页表项的值是什么?(0xff2007)该线性地址被映射到的零页(新页帧)的起始地址是什么?(0xff2000)

6.该新页帧的头 16 个字节是什么?(00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00)

头 16 个字节按照(00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00)

猜你喜欢

转载自blog.csdn.net/z671514087/article/details/128387814