作者SILee (打卡上班的日子)
看板ASM
标题Re: [问题] 用C连结 ASM进入保护模式的副程式会当机
时间Sun Apr 27 04:22:56 2008
※ 引述《SILee (打卡上班的日子)》之铭言:
: ※ 引述《typeotoco (打字男)》之铭言:
: : 我单独使用 masm compile 一个进入保护模式的asm程式 能正常做动
: : 後来我想写成副程式让 C 去 call,但是只要一设定保护模式的 bit
: : 就会当机。一直不知道怎麽办,不知道有没有人可以给我建议。
: : 或是有人有空可以帮我看一下?
: : 我直接把 start 的部分改成 MemSetting 这个函数了。
: : http://rafb.net/p/aS7Oy058.html
: : 当在最下面的地方
: : 先谢谢了
: 这几天在写开机档时我也碰到了这个问题
: 我的程式在VirtualBox和QEMU下做模拟都没有问题,可以正常地执行
: 可是只要拿到实体PC上做测试
: 开机後跑到写入cr0这条指令,switch到protect mode後电脑就会自动重新开机
: movl %cr0, %eax
: orl $1, %eax
: movl %eax, %cr0
: 到现在我还搞不清楚原因,不知道ASUS在BIOS里动了什麽手脚
搞了快两个礼拜,今天终於被我找到原因了 = ="
我在程式一开始的时候有下cli把interrupt关掉
可是在执行一些software interrupt後interrupt又被打开了
而在刚switch到protect mode时,我还没有把IDT建好
所以这时候只要一收到timmer来的interrupt系统就当掉了
在QEMU的模拟环境中并不会发生这种现象,所以在QEMU上测试的时候都不会有问题
但只要把程式一放到实体PC上跑就出问题了
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.59.105.115
1F:推 softcloud:这类程式都很麻烦, table设错, 分页设错都会发生例外 04/27 11:34
2F:→ softcloud:系统大部分都会挂掉 或重开 04/27 11:34
3F:推 ggg12345:qemu通常不会设定实体中断,实体中断讯号也到不了模拟介面 04/27 11:50
4F:→ final01:没中断怎麽context switch 04/28 01:10
5F:推 ggg12345:trap指令会被解译,实际硬体中断是由host os处理,qemu执行 04/28 04:43
6F:→ ggg12345:序改变,需於解译时由qemu的flag指示,trap是被解译的指令. 04/28 04:50