第1关:1 号进程的 mynext 变量的物理地址
本关任务:
1 号进程第 1 次调用函数 output_char 时,它的 mynext 变量的物理地址是多少?
1 号进程第 2 次调用函数 output_char 时,它的 mynext 变量的物理地址是多少?
首先,在gdb模式下找出它的线性地址(由于第1次和第2次操作大致相同,所以只详解第一次)
求线性地址的方法在4.1已经解决,本次得到的线性地址为0x402282c
如何计算一个线性地址对应的物理地址
在 x86 CPU 中,如果启用了分页地址转换机制,线性地址会通过页目录和页表被转换为物理地址,整体过程如下:
具体过程是,首先以线性地址的高 10 位为索引在页目录中找到对应的页目录项,然后以线性地址的中间 10 位为索引在页表中找到对应的页表项,最后将页表项中的页帧起始地址与线性地址的低 12 位(页内偏移)相加,得到最后的物理地址。
接下来换到dbg模式下操作,先将断点打到函数地址
页目录的起始地址存放在CR3寄存器里,通过creg命令查看CR3的值
然后根据线性地址提供的索引,查看它的物理地址
按10、10、12位划分,0000010000 0000100010 100000101100可得
Director = 16 Table = 34 Offset = 0x82c
第一步得找到对应的页目录项,0xffe027,取0xffe000为帧的起始地址
第二步找到对应的页表项,0x22065,取0x22000为帧的起始地址
最后将页表项中的页帧起始地址与线性地址的低 12 位(页内偏移)相加,得到最后的物理地址。即0x22000+0x82c=0x2282c
最终答案:
1.1 号进程第 1 次调用函数 output_char 时,它的 mynext 变量的物理地址是多少?**(0x2282c)**
2.1 号进程第 2 次调用函数 output_char 时,它的 mynext 变量的物理地址是多少?**(0xffc82c)**
第2关:0 号进程的 mynext 变量的物理地址
本关任务:
0号进程第 1 次调用函数 output_char 时,它的 mynext 变量的物理地址是多少?
0号进程第 2 次调用函数 output_char 时,它的 mynext 变量的物理地址是多少?
这一关基本上和上一关相同,唯一有变化的两个点,一个是gdb模式下的断点要打到172行,dbg模式下的断点打到相应的0x69d9
还有一个区别是,这一次我求线性地址的时候并没有在gdb模式下进行,而是在dbg模式下完成(已知ds的值)
以上根据根据:
在 bochsdbg 中,如何查看一个逻辑地址处的值
可以使用 x 命令直接查看,类似如下:
其余操作和第一关类似,在此不再赘述。
最终答案:
1.0 号进程第 1 次调用函数 output_char 时,它的 mynext 变量的物理地址是多少?**(0x2282c)**
2.0 号进程第 2 次调用函数 output_char 时,它的 mynext 变量的物理地址是多少?**(0x2282c)**
版权归原作者 z671514087 所有, 如有侵权,请联系我们删除。