idt.S 從
真實模式切換到
保護模式再切回
真實模式。 本篇主要討論切換模式時, jmp 的長相。 這是透過自己寫的 loader, 將 idt.com (idt.S) 載入到 0x7000:0x100, 再用 bochs 的 debug 反組譯 jmp 的程式碼。
在 bochs 設定檔加入
debugger_log: debugger.out就可將 bochs 操作過程存到 debugger.out
173 (0) [0x00000000000701fd] 7000:000001fd (unk. ctxt): ljmp 0010:0000 ; ea00001000
136 ljmp $SelectorCode32, $0 /* Thanks to earthengine@gmail, I got */
這裡從真實模式轉到保護模式, 0x0010 已經是 selector, 指到 LABEL_SEG_CODE32:, 所以接下來的程式碼從這裡開始
對應的就是 idt.S
175 mov $(SelectorData), %ax
而 SelectorData 32 = 0x20, 符合 bochs 反組譯 l:176 的結果。
176 (0) [0x0000000000070228] 0010:00000000 (unk. ctxt): movw $0x0020, %ax ; 66b82000
215 (0) [0x0000000000070252] 0010:0000002a (unk. ctxt): ljmp 0018:00000000 ; ea000000001800
197 ljmpl $SelectorCode16,$0
這裡切到 .code16 的 LABEL_SEG_CODE16:, 雖然還在保護模式, 不過這裡已經是 16 bit 程式碼
245 (0) [0x0000000000070523] 0018:0015 (unk. ctxt): ljmp 7000:0202 ; ea02020070
366 jmp $0, $LABEL_REAL_ENTRY # 段位址會在程序開始處被設置成正確的值
這是從保護模式切回真實模式, 0x7000 是真實模式的 segment, 不再是 selector
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。