课堂练习4.2:页式内存管理
第1关:1 号进程的 mynext 变量的物理地址
本关任务:
1. 1 号进程第 1 次调用函数 output_char 时,它的 mynext 变量的物理地址是多少?
2. 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 变量的物理地址
本关任务:
1. 0号进程第 1 次调用函数 output_char 时,它的 mynext 变量的物理地址是多少?
2. 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)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
