zoukankan      html  css  js  c++  java
  • 感受到LDT的好处

    感受到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是非常好的设计,使各个任务隔离,出了问题也更好定位。

  • 相关阅读:
    【设计模式】备忘录
    统计ip的发送频率和该ip发送的有效消息(去除相似消息)的数目
    Android之消息推送聊天实现
    Dictionary通过下标获取key和value
    SGU 271 水题。。。。
    二叉树递归和非递归遍历
    C#与SSL
    正则表达式总结
    SQL Server User Accounts
    嵌入式领域中各种文件系统的比较
  • 原文地址:https://www.cnblogs.com/happylong/p/4392554.html
Copyright © 2011-2022 走看看