免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1917 | 回复: 0
打印 上一主题 下一主题

大家来讨论一下lmsw %eax开启保护模式之后处理器的寻址方式 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-25 20:14 |只看该作者 |倒序浏览
在CPU与编译器版有位网友提出了lmsw %eax之后一个长跳转重新装在CS及eip.  这貌似是看到的bootloader中的惯例. 我以前也只是这样想当然的按照这种方式来做。
  并没有想其中的细节。 提出的问题就是:  在置PE标志位之后.处理器处于保护模式. 之后一切所有的规则都得按照保护模式的那一套来做。这里涉及到的就是寻址方式。
   常跳转的指令以及操作数是如何获取的?   因为在处理器切换到保护模式之后,CS还没有重新加载,即使重新加载,那么重新加载CS的指令和操作数又是如何获取的呢? 这貌似是
  先有鸡还是先有蛋的问题...  有网友说是预取指。可是我实验了一下,验证这个是错误的解释。 代码很简单。

  1. #say goodbye to the real mode...
  2.                 movw                $0x0001, %ax
  3.                 lmsw                %ax
  4.                 jmp                flush_instr    /* 这样能够刷新预取指令队列吧? */
  5. flush_instr:
  6.                 pushl                %eax
  7.                 pushl                %ebx
  8.                 pushl                %ecx
  9.                 pushl                %edx
  10.                 popl                %edx
  11.                 popl                %ecx
  12.                 popl                %ebx
  13.                 popl                %eax
  14.                 jmp                flush_instr
复制代码
可以正常的执行... 最后肯定会异常的...呵呵...

我来说说我的观点。
  首先需要提到的就是段寄存器中的非可能编程的所谓的影子寄存器。在实模式下这个影子寄存器应该也是可用的.只是不能对它编程。
    因为实模式的寻址方式是seg << 4 + off。这个当然与影子寄存器的值是无关的。假设这个影子寄存器中的基址应该是seg << 4,至于段长无法推测.
     如果需要起作用的话,至少是64KB。有了这个假设,从实模式到保护模式切换的那一刻一切都有很好的解释了.
     切换到保护模式.将机器状态字的最低比特位置1即可。这个指令执行之后,CPU就处于保护模式了。寻址方式也变为保护模式。
    这个时候要寻址下一条指令以及数据。寻址时就需要参考影子寄存器中的基地址。而这时候的基地址就是此时的seg << 4。外加偏移。
    当然就可以寻址下一条指令以及数据了。在重新装载CS的时候才会根据CS指定的GDT项的内容来重新装载影子寄存器。
   
貌似intel文档上只说了保护模式下的影子寄存器的作用。 我想在实模式下肯定也用到了... 不然每次都需要seg << 4 + off. 这不是额外的开销么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP