我是靠谱客的博主 辛勤衬衫,最近开发中收集的这篇文章主要介绍实验检查点1第一关 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的值才被修改

最后

以上就是辛勤衬衫为你收集整理的实验检查点1第一关 1号进程的函数参数的物理地址第二关  两次进程调度之间页目录和页表的变化第三关 父子进程间的共享内存通信  的全部内容,希望文章能够帮你解决实验检查点1第一关 1号进程的函数参数的物理地址第二关  两次进程调度之间页目录和页表的变化第三关 父子进程间的共享内存通信  所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部