wrmsr指令设置EFER.LME导致system hang,请高手帮忙

ancient 2011-05-02 04:38:13
我尝试用以下代码实到从32bit non-paged模式向64bit的切换,结果系统hang在wrmsr指令上,请高手帮忙分析下原因,感激
mov edx, esi
add edx, INIT64_STRUCT_GDTR_OFFSET
lgdt [edx]

// update cr3 for x64 mode
mov eax, dword ptr INIT64_STRUCT_CR3_OFFSET[esi]
mov cr3, eax

// update CR4 for x64
_emit 0x0F
_emit 0x20
_emit 0xE0 // mov eax, cr4
// enable PAE, PSE??
or eax, 0x30
_emit 0x0F
_emit 0x22
_emit 0xE0 // mov cr4, eax

// write msr (EFER) to enable x64
mov ecx, 0C0000080h
mov edx, 0
mov eax, 0
bts eax, 8

wrmsr // write from EDX:EAX into MSR[ECX]



查看文档,有以下原因可导致设置失败
1. An attempt is made to enable or disable IA-32e mode while paging is enabled.
2. IA-32e mode is enabled and an attempt is made to enable paging prior to
enabling physical-address extensions (PAE).
3. IA-32e mode is active and an attempt is made to disable physical-address
extensions (PAE).
4. If the current CS has the L-bit set on an attempt to activate IA-32e mode.
5. If the TR contains a 16-bit TSS.

其中1,4可以排除,2,3跟这段code无关。5不知如何验证。
另外,consistency check失败一般来说应该是bsod,系统hang住的情况还是第一次见到,不知道大家有没有遇到过。
...全文
106 点赞 收藏 17
写回复
17 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
ancient 2011-05-02
再问一个问题,compat mode能不能使用32bit mode的cs段?两者在gdt里的结构相同吗?
回复
ancient 2011-05-02
[Quote=引用 14 楼 mydo 的回复:]

引用 10 楼 ancient 的回复:

这话怎么象蛋哥说的。
我被逼的。。。你骂谁想写这种fucking的东西。。。



讨论归讨论,请不要带脏字。
[/Quote]
er...蛋哥是wow里的伊利丹。那句话是他的名言。
没不好的意思,别误会:)
回复
ancient 2011-05-02
换了台机器,上面的问题莫名其妙的过了。
暂时不去管它,现在是从64位切回的步骤了。因为编译器不支持32跟64bit的代码混编,只能用_emit了。
现在挂在64bit到compatibility mode切换时的那个retf上。头大的是不知道这里怎么调试。
回复
大熊猫侯佩 2011-05-02
[Quote=引用 10 楼 ancient 的回复:]

这话怎么象蛋哥说的。
我被逼的。。。你骂谁想写这种fucking的东西。。。

[/Quote]

讨论归讨论,请不要带脏字。
回复
Areslee 2011-05-02
必须自己切64位?你有苦头吃了,单CPU的话可以关了硬中断,多CPU,你自求多福吧
回复
ancient 2011-05-02
基本上没有变通的方法,因为在win7下切换到64位本身就是目的。
我也没办法,被逼的。。。
而且现在最大的问题其实不是汇编本身,是对intel cpu构架没什么经验。
回复
Areslee 2011-05-02
[Quote=引用 10 楼 ancient 的回复:]
这话怎么象蛋哥说的。
我被逼的。。。你骂谁想写这种fucking的东西。。。

引用 8 楼 areslee 的回复:

引用 6 楼 ancient 的回复:
我并不是写一个boot loader.
是在win7下切换到64bit模式,运行一段代码,然后在切换回来。

果然,你这是自寻死路啊。。。。。。
[/Quote]那么你这么写是为了什么目的呢?难道没有变通的办法?
得一次玩汇编的人写这种代码是非常不合适的
回复
ancient 2011-05-02
这话怎么象蛋哥说的。
我被逼的。。。你骂谁想写这种fucking的东西。。。
[Quote=引用 8 楼 areslee 的回复:]

引用 6 楼 ancient 的回复:
我并不是写一个boot loader.
是在win7下切换到64bit模式,运行一段代码,然后在切换回来。

果然,你这是自寻死路啊。。。。。。
[/Quote]
回复
ancient 2011-05-02
手头暂时没有64位的xp,现在只好先跳过这一步把其它的code调通了。
anyway, thanks a lot.
回复
Areslee 2011-05-02
[Quote=引用 6 楼 ancient 的回复:]
我并不是写一个boot loader.
是在win7下切换到64bit模式,运行一段代码,然后在切换回来。
[/Quote]
果然,你这是自寻死路啊。。。。。。
回复
大熊猫侯佩 2011-05-02
[Quote=引用 6 楼 ancient 的回复:]

我并不是写一个boot loader.
是在win7下切换到64bit模式,运行一段代码,然后在切换回来。
[/Quote]
如果实在windows7运行过程中切模式的话,比写一个pure loader要更难,因为有OS的存在,你不可能

忽视OS,windows7对内核的稳定性和安全性要求都很高,你可以试一下在64位的xp下会不会hang。以前

我写的windows中某些内存操作在2k,xp,2k3,vista都无问题,但在win7下必死。
回复
ancient 2011-05-02
我并不是写一个boot loader.
是在win7下切换到64bit模式,运行一段代码,然后在切换回来。
回复
Areslee 2011-05-02
BOSD是WINDOWS产生的,你这个代码相当于自己写OS,谁来为你生成BOSD?
回复
ancient 2011-05-02
不太明白,为什么自己写的代码不会bsod?

有史以来第一次写汇编,啥都不懂,两眼一抹黑,大家多指教。
回复
Areslee 2011-05-02
你自己写的代码怎么可能出现BOSD?
第5条无法验证的话你就自己建个TSS不就可以避开了
回复
大熊猫侯佩 2011-05-02
没遇到过,如果你从32位转换到64位,转换后的指令地址是否正确。

在我blog中关中断实现取物理地址有类似的问题。
回复
ancient 2011-05-02
自己顶一下,郁闷呀。。。
回复
相关推荐
发帖
汇编语言
创建于2007-08-27

2.1w+

社区成员

汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
申请成为版主
帖子事件
创建了帖子
2011-05-02 04:38
社区公告
暂无公告