课堂练习4.1:段式内存管理

第1关:1 号进程 mynext 变量的逻辑地址与线性地址

本关任务:

  1. 1 号进程的函数调用 output_char() 所对应的第一条汇编指令的地址是多少?
  2. 1 号进程的 mynext 变量所在的段地址和段内偏移是多少?该段地址对应到几号描述符?存放在哪个段描述符表中(GDT/LDT)?
  3. 1 号进程的进程控制块中的 ldt 数组的起始地址是多少?其中 1 号和 2 号描述符里存放的段起始地址分别是多少?
  4. 1 号进程的 mynext 变量所在的线性地址是多少?

1 号进程在第 155 行调用了函数 output_char,所以跟踪到第155行

通过反汇编查看指令地址

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

在 x86 CPU 中,段寄存器(如 ds )内存放的是一个 16 位的段选择子(Selector),其格式如下:

扫描二维码关注公众号,回复: 15248920 查看本文章

因此对应2号描述符,存放在LDT中 

通过p &current->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)

猜你喜欢

转载自blog.csdn.net/z671514087/article/details/128386810