第1关:可执行文件的执行
本关任务:
在 bochs 虚拟机中编译程序 01.c ,可以得到一个可执行文件。请分析该程序的运行,回答下列问题:
1.执行该文件的 execve 系统调用刚开始执行时,当前进程的用户虚空间是什么?该空间的第一个页表项和最后一个页表项分别是什么?
2.执行该文件的 execve 系统调用执行结束时,该进程的用户虚空间是什么?该空间占据几个页目录项?第一个页目录项的地址和值分别是什么?
3.该可执行文件的代码段和数据段的长度之和是多少?
首先需要将文件复制到指定目录下:
然后用版本 0 内核启动虚拟机,并在虚拟机中用
**mcopy**
命令将该文件拷入虚拟
机,并编译。
**可以在 **
**bochs**
**虚拟机中先将该文件放入 **
**b**
**盘,然后关闭 **
**bochs**
**虚拟机,并在弹出的对话框中选择 **
**yes**
:
然后启动gdb调试,在do_execve处设置断点,一直c,直到最后一个continuing:
然后在bochs虚拟机中运行之前编译好的可执行文件:
**回到调试中,输入指令(进程的用户虚空间的起始地址是 **
**current->start_code**
**,长度是 **
**current->brk**
),本题用户的虚空间为
0x10000000~0x10043fff
求页表项是什么实际上就是求页表项的值:
根据前面学的方法,先以线性地址的高 10 位为索引在页目录中找到对应的页目录项,然后以线性地址的中间 10 位为索引在页表中找到对应的页表项,
然后输入finish指令,结束该系统调用。
输入相应指令查看虚空间。
输入指令x/wx 0x+64*4,即可求得相应的地址和值。
**按quit退出调试,用 **
**objdump**
命令查看一个可执行文件的具体内容:
+
最终答案:
1.执行该文件的execve系统调用刚开始执行时,该进程的用户虚空间是什么?**(0x10000000~0x10043fff)该空间的第一个页表项和最后一个页表项分别是什么?(0x00ff9025)(0x00fea065)**
2.执行该文件的execve系统调用执行结束时,该进程的用户虚空间是什么?**(0x10000000~0x10004fff)该空间占据几个页目录项?(1)第一个页目录项的地址和值分别是什么?(0x100)(0x0)**
3.该可执行文件的代码段和数据段的长度之和是多少?**(0x5000)**
版权归原作者 z671514087 所有, 如有侵权,请联系我们删除。