第1关:1 号进程 mynext 变量的逻辑地址与线性地址
- 1 号进程的函数调用 output_char() 所对应的第一条汇编指令的地址是多少?
- 1 号进程的 mynext 变量所在的段地址和段内偏移是多少?该段地址对应到几号描述符?存放在哪个段描述符表中(GDT/LDT)?
- 1 号进程的进程控制块中的 ldt 数组的起始地址是多少?其中 1 号和 2 号描述符里存放的段起始地址分别是多少?
- 1 号进程的 mynext 变量所在的线性地址是多少?
1 号进程在第 155 行调用了函数 output_char,所以跟踪到第155行
通过反汇编查看指令地址
&mynext即为其段内偏移,段地址存储在ds寄存器中
在 x86 CPU 中,段寄存器(如 ds )内存放的是一个 16 位的段选择子(Selector),其格式如下:
![](/qrcode.jpg)
因此对应2号描述符,存放在LDT中
通过p ¤t->ldt查看ldt的起始地址,然后通过p/x current->ldt查看ldt表
可以看到1号进程ldt的起始地址是0xfff2d0和ldt表内的值
那么如何从段描述符的值计算出段的起始地址
一个段描述符占 64 位,其中段的起始地址由 3 部分拼接而成,如下图中的红色部分所示:
可见前面的 4 号描述符 0x00008901ed080068 里记录的段起始地址是 0x0001ed08
由此算出1号描述符和2号描述符的起始地址分别是0x4000000、0x4000000
1号进程mynext变量的线性地址:
用段起始地址0x4000000和段内偏移0x2282c相加即得:0x402282c
1.1号进程的函数调用 output_char() 所对应的第一条汇编指令的地址是多少?(0x6969)
2.1号进程的 mynext 变量所在的段地址和段内偏移是多少?(0x17:0x2282c)该段地址对应到几号描述符?(2)存放在哪个段描述符表中(GDT/LDT)?(LDT)
3.1号进程的进程控制块中的 ldt 数组的起始地址是多少?()其中1号和2号描述符里存放的段起始地址分别是多少?(0x4000000)( 0x4000000)
4.1号进程的 mynext 变量所在的线性地址是多少?(0x402282c)
第2关:0号进程 mynext 变量的逻辑地址与线性地址
本关任务:
1.0 号进程的函数调用 output_char() 所对应的第一条汇编指令的地址是多少?
2.0 号进程的 mynext 变量所在的段地址和段内偏移是多少?该段地址对应到几号描述符?存放在哪个段描述符表中(GDT/LDT)?
3.0 号进程的进程控制块中的ldt数组的起始地址是多少?其中 1 号和 2 号描述符里存放的段起始地址分别是多少?
4.0 号进程的 mynext 变量所在的线性地址是多少?
由于本关和上一关过于相似,只有进程号和断点位置发生了变化,所以这里不再赘述,直接给出最后结果
1.0号进程的函数调用 output_char() 所对应的第一条汇编指令的地址是多少?(0x69d9)
2.0号进程的 mynext 变量所在的段地址和段内偏移是多少?(0x17:0x2282c)该段地址对应到几号描述符?(2)存放在哪个段描述符表中(GDT/LDT)?(LDT)
3.0号进程的进程控制块中的 ldt 数组的起始地址是多少?()其中1号和2号描述符里存放的段起始地址分别是多少?(0x0)( 0x0)
4.0号进程的 mynext 变量所在的线性地址是多少?(0x2282c)