课堂练习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)

猜你喜欢

转载自blog.csdn.net/z671514087/article/details/128387386
今日推荐