概述
第一关 1号进程的函数参数的物理地址
设置版本1.3内核为分析对象
第一步
打开gdb调试,找到1号进程的函数调用 output_char() 所对应的汇编指令地址(0x6969),并跳到1号进程第2次调用函数 output_char时,查找gdt和ldt(因为不确定会查哪个,所以两个都记录),记下其内容(从逻辑地址翻译到线性地址要用到,但dbg中无法查看)
(gdb)b 155
(gdb)c
(gdb)x/6i $eip
(gdb)c
(gdb)p/x current->ldt
(gdb)p/x gdt
但是查找gdt出现了以下情况,不知道是什么原因,但后面查找的是ldt,不影响过关
第二步
关闭gdb,启用dbg,跳到1号进程第2次调用函数output_char时,注意此时应该执行完push指令后再查看ss和esp寄存器,才是output_char函数参数的地址
<bochs:1> b 0x6969
<bochs:2> c
<bochs:3> c
<bochs:4> b 0x6977
<bochs:5> c
<bochs:6> n
<bochs:7> sreg
<bochs:8> reg
故该参数的逻辑地址为0x17:0x000257b0
转换成线性地址应该查ldt第2项,线性地址为0x40257b0
再查页目录和页表转换成物理地址:
物理地址为0x00ffd7b0,同时可以看到线性地址对应的页表项值为0x00ffd067
最后查看物理地址对应的值,也即该参数的值:
第二关 两次进程调度之间页目录和页表的变化
第一步
打开gdb,找到schedule函数的地址,跳到task0找到其地址,查找gdt和ldt并记下其内容(结果就不展示了)
(gdb)b schedule
(gdb)c
(gdb)x/6i $eip
(gdb)disable 2
(gdb)b task0
(gdb)c
(gdb)p/x current->ldt
(gdb)p/x gdt
第二步
关闭gdb,打开dbg,在0x6d93(schedule函数)处设置断点并跳转,查看地址空间映射关系,continue一下(到第二次进程调度),再查看地址空间映射关系
然后creg查看引发页故障的线性地址(储存在CR2寄存器中),将其右移12位即为发生改变的页号
然后查看对应的页表项的地址和值
关闭schedule的断点,在task0处设置断点并跳转,creg和reg查看ss和esp寄存器值
再翻译成线性地址和物理地址,并查看其值
第三关 父子进程间的共享内存通信
第一步
用gdb查找1号进程修改 mynext 变量的指令地址和mynext的逻辑地址
再跳到第二次修改mynext前,查看ldt(图中未显示)
第二步
用dbg设置断点到1号进程修改mynext变量的指令地址,查找页目录和页表找物理地址
continue一下,到第二次修改之前,再查找
结果如下:
注意第一问答案不能写0x6969,因为执行完地址为0x6971的指令后,mynext的值才被修改
最后
以上就是辛勤衬衫为你收集整理的实验检查点1第一关 1号进程的函数参数的物理地址第二关 两次进程调度之间页目录和页表的变化第三关 父子进程间的共享内存通信 的全部内容,希望文章能够帮你解决实验检查点1第一关 1号进程的函数参数的物理地址第二关 两次进程调度之间页目录和页表的变化第三关 父子进程间的共享内存通信 所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复