1/0 号进程 mynext 变量的逻辑地址与线性地址

第一关:分析1号进程。本关较为简单,跟着左边的教程走一遍即可通过

先设置版本1内核为分析对象,打开gdb调试,在155行设置断点并跳转(因为1号进程在155行调用了函数output_char)

(gdb)b 155
(gdb)c

第一问 函数output_char对应的第一条汇编指令的地址是多少?

反汇编即可查看

(gdb)x/6i $eip

1/0 号进程 mynext 变量的逻辑地址与线性地址_第1张图片

第二问 mynext变量所在的段地址和段内偏移是多少?该段地址对应几号描述符?存放在哪个断描述符表中(GDT/LDT)?

&mynext即为其段内偏移,段地址存储在ds寄存器中

段地址是16位,高13位化为十进制即为对应的描述符序号,倒数第3位为0表示存放在GDT中,为1表示存放在LDT中

(gdb)p &mynext
(gdb)p/x $ds

0x17高13为化为十进制为2,倒数第3位为1,因此对应2号描述符,存放在LDT中 

第三问 ldt数组的起始地址是多少?其中1号和2号描述符里存放的段起始地址分别是多少?

查找ldt的起始地址有两种方法:

法一:直接p ¤t->ldt即可查看

(gdb)p ¤t->ldt

法二 :查找gdt的第7项断描述符,计算出ldt起始地址(注意低32位在前,高32位在后)

(gdb)x/16wx gdt

1/0 号进程 mynext 变量的逻辑地址与线性地址_第2张图片

查看ldt的内容即可计算1号和2号描述符存放的段起始地址

(gdb)p/x current->ldt

对于2号描述符存放的段起始地址,可以直接查看当前进程控制块的start_code成员(前述可知对应2号描述符)

(gdb)p/x current->start_code

第四问 mynext变量所在的的线性地址是多少? 

 用段起始地址0x4000000和段内偏移0x2282c相加即得:0x402282c

第二关分析0号进程,过完全类似,唯一不同的在于断点应设置在172行,在此就不再赘述了

你可能感兴趣的:(操作系统educoder实训,c++,linux)