感受到LDT的好处
1)首先从一个异常开始的:
2)从trace里可以看到 "Init_main" 被调用了, 而该函数是kernel的函数,也就是说问题不是出现boot和load的阶段。
3)接下来看产生 #PF的代码,EIP 是 0x7B7B,这个地址看起来很诡异。首先kernel开始的指令的地址是0x30400,而这个 0x7B7B 看起来非常迷惑, 不像是kernel中初始化函数的地址,也不像是中断服务程序的地址,更不像task的地址。-- 没有头绪
4)重启,在0x7B7B打断点,看看这个是什么。
08: 0003 0729,这个是kernel的函数。因为这里的8表示的是kernel代码段对应的选择子。
05: 0000 7B7B,这里的 05 是段选择子,这个是任务的CS,任务的CS指向LDT的第0项,因为:
所以这里的5表示的是任务代码段对应的选择子。(而且代码中LDT[0] = 5)
05:00007B7B出的问题,说明是该任务导致了异常。
5)因为每个任务对应一个LDT段,所以看看哪个任务出了问题:
看看LDTR寄存器,值是 0x28 确定是第一个任务。
6)看一下第一个任务
该任务退出,但是退出的时候没有好的退出机制(比如跟windows一样,进行任务切换),而是直接eip++++,一直运行下去,这就导致了问题。
7)至此,发现每个任务使用单独的局部描述符表LDT是非常好的设计,使各个任务隔离,出了问题也更好定位。