免费注册 查看新帖 |

Chinaunix

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

为什么从实模式切换到保护模式后预先取得指令失效呢 [复制链接]

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-30 16:35 |只看该作者 |倒序浏览
一般也就是 jmp 到本指令下一条指令处, 也就是在实模式下的下一条指令物理地址和在保护模式下下一条指令的物理地址是相同的, 那么在保护模式下取到的指令和在实模式下取到的指令本身应该一样, 只是因启用分段后导致可能对涉及的内存地址解释方式变了, 指令本身和操作数本身应该没变化, 我的意思是说, 如果已经缓存的指令不涉及内存访问, 则理论上已经缓存的这些指令是可以正常执行的, 再后面的就不行了, 因为取代码本身也是内存访问。

[ 本帖最后由 zylthinking 于 2009-7-30 17:12 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-07-30 18:07 |只看该作者
原帖由 zylthinking 于 2009-7-30 16:35 发表
一般也就是 jmp 到本指令下一条指令处, 也就是在实模式下的下一条指令物理地址和在保护模式下下一条指令的物理地址是相同的, 那么在保护模式下取到的指令和在实模式下取到的指令本身应该一样, 只是因启用分段 ...

   因为实模式下存储指令和操作数的方式和保护模式不一样吧??

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
3 [报告]
发表于 2009-07-31 09:30 |只看该作者
不明白什么意思, 要说存储方式, 我就知道一种存储方式, 就是指令一条挨着一条, 依次存放

论坛徽章:
0
4 [报告]
发表于 2009-08-01 00:56 |只看该作者
原帖由 zylthinking 于 2009-7-30 16:35 发表
一般也就是 jmp 到本指令下一条指令处, 也就是在实模式下的下一条指令物理地址和在保护模式下下一条指令的物理地址是相同的, 那么在保护模式下取到的指令和在实模式下取到的指令本身应该一样, 只是因启用分段 ...

不知道是否开启了分页,如果开启了分页的话,我想它会首先去查找TLB,此时TLB里面肯定没有对应的项,那么又会查找对应的物理地址,在查找的过程中,如果任何一次数据不再缓存中的话,都会导致从内存重新读入,这样就很有可能在得到物理地址前,刷新过CACHE了。
另外,不知道开启保护模式本身会不会flush cache?

论坛徽章:
0
5 [报告]
发表于 2009-08-01 22:25 |只看该作者
不会有问题的。

在置 CR0.PE = 1 后,far jmp 之前,processor 还是运行在 16 位代码
-------------------------------------------------------------------------

mov eax, cr0
bts eax, 0
mov cr0, eax

; 此处还是 16 位代码,还未进入真正的保护模式
; CS 还没未装入保护模式的 32 位 code segment selector & descriptor
; 所有 registers 没有更新

; 这和实模式下没什么区别,包括下面这条 far jmp 还是运行在伪实模式

jmp selector32: entery32


entry32:
 ; 此处才真正进入保护模式。
 ; 也仅仅是更新了 CS   
 ; CR3 不会被刷新

------------------------------------------------------------------------------------------------

除非:

mov cr3, XXXXXXXX              ; 更新 CR3

mov eax, cr0
or eax, 0x80000001             ; 同时开启 CR0.PE = 1 和 CR0.PG = 1
mov eax, cr0


; 开启保护模式的同时开启了 paging 模式
; 那么下面这条 far jmp 指令就要注意有没有相应的 physical address 被映射到
; 没有的话会发生 #PF 异常的


jmp selector32:entry32


entry32:
  
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP