实验检查点1

第一关 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的值才被修改

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值