作者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