如果是预取指令... 你如何解释我回帖中写的实验的代码?
不知道你有没有看过linux的源代码... 在切换到保护模式之后. 会执行跳转指令... 刷新预取指队列。 回复 11# PCliangtao
不明白你的意思,你7楼的例子里面为什么正常执行就表明和预取无关了.你的第一个jmp的操作数即那个相对地质仍然是实模式下面计算得到的啊,执行时本来就可以跳转到下一条指令啊. 回复 12# snail_314
晕... 一个跳转指令不等价于分支么? 分支会刷新预取指队列... (貌似是这样)
即使不刷新预取指队列... 在lmsw之后的那么多条指令都能够执行? 这些都是在实模式下预取的么? 再退一步... 那些push pop指令执行之后jmp到最开始重新执行push pop.
实模式下的预取指队列无限长么? 再退一步说. 预取指无限常... 那么push pop是针对堆栈的操作. SS仍然是实模式下的值. 它在保护模式下指向哪里? 怎样对数据寻址的? 本帖最后由 snail_314 于 2010-10-25 19:28 编辑
回复 13# PCliangtao
我的意思是:
第一个jmp的指令和操作数都是在实模式下取的,这条指令的译码过程其实还是实模式下,所以即使在执行时已经到保护模式了,但是仍然能跳到正确的位置.所以说执行下去没问题啊
只有第一次执行的jmp指令的操作数(地址)是在实模式下取的,后面的所有指令都是在保护模式下取指,取操作数,译码,执行的啊,有什么问题? 回复 14# snail_314
你还是没明白楼主的疑问是什么...
好好看看楼主的帖子以及回帖... 建议你注意一下保护模式下的取指,和取操作数的模式. 本帖最后由 snail_314 于 2010-10-25 23:08 编辑
回复 15# PCliangtao
首先,我从一开始就理解了楼主的问题。其实是你误解了我的意思,我并非强调那条jmp是为了清空流水线,我只是一直在解释为什么那条jmp能正确执行,不过判断错了,不应该是流水线的原因。其次,我的解释确实有问题。想了想,在实模式下应该还没有流水线,就算有流水线了,保护模式下也没法从实模式下拿到的地址中取得有效的数据。当我没说
我觉得正确的答案是2楼的,就是说,那句绝对地址的jmp指令应该是保护模式下的寻址方式,而非楼主理解的实模式下。之所以要用宏的形式(或者任何形式下的hard-coded方式),则是因为有些c编译器的16bit模式没法编译出这条指令来。这条指令,就是保护模式下的寻址方式。
还有,你举的例子,其实编译出来是个相对跳转,并不是绝对跳转,我到认为和楼主的问题不怎么相关才是。 回复 10# snail_314
我想你是我的知音...我当时就是这么想的.但是我在intel manual里没有找到相关的依据..
所以我发帖时想有某个大牛跳出来引经据典告诉我具体在手册的什么地方有某句话.... 回复 16# snail_314
第5条指令的寻址绝对是实模式,我也想过是保护模式,如果是保护模式得预先定于相应的描述符表,使其在实模式和保护模式下寻址到的是一样的东西..
可惜我没有看到描述符表的定义..
所以第5条肯定是实模式寻址,最有可能的解释就是指令缓存预取.你可以参考一下intel manual 3(我看的是1999年的版本第八章PROCESSOR MANAGEMENT AND INITIALIZATION)和INTEL 80386 PROGRAMMER'S REFERENCE MANUAL 1986 第10章10.3小节. 在系统初起的在实模式下执行的时候就是有指令预取的... 回复 16# snail_314
已经可以确定是预取指令流的问题了,在Googlel里搜到了一篇相应的讨论帖..
错过了你们的讨论,抱歉了...
我昼伏夜出而已.. 回复 15# PCliangtao
已经可以确定是预取指令流的问题了,在Googlel里搜到了一篇相应的讨论帖..
错过了你们的讨论,抱歉了...
我昼伏夜出而已..
页:
1
[2]