Re: [問題] QEMU+GDB 開機, int 跳不過去的問題
※ 引述《ericwang1017 (Eric)》之銘言:
: 各位版大好
: 我使用 QEMU -fda os.img -s -S + GDB remote 去 debug 我自己很簡單的 asm
: 在使用 target remote localhost:1234 之後很順利的連線到了qemu
: 下斷點 b *0x7c00 也可以順利地停在 eip 0x7c00
: 我第一個指令是
: ljmp $0x7C00, $_start
: 但遇到個一個問題, ljmp 雖然可以把 CS:IP 設為 0x7c00:0, 但是之後的int 10使用 si 或是ni 就一去不回頭了
: 對int 10之後下斷點也沒用(例如對fin下斷點, 並不會在那邊中斷)
: 但是如果ld使用 -Ttext = 0x7c00 , 並且註解掉ljmp $0x7C00, $_start的話
: cs = 0 , eip = 0x7c00 時, 似乎GDB 就可以讓我使用int 10
: 而且這兩種寫法, qemu 都可以正常模擬, 只是CS:IP 設為 0x7c00:0這種情況的 gdb 不給debug
: 是我 gdb 的參數沒有設好嗎, 我也設過 set architecture i8086 似乎也沒用
: code 如下
: .code16
: ljmp $0x07C0, $_start
: _start:
: mov %cs,%ax
: mov %ax,%ds
: mov %ax,%es
: mov $0xFF00, %sp
: mov $12,%cx
: mov $MsgMove, %ax
: mov %ax, %bp
: mov $0x1301,%ax
: mov $0x00c,%bx
: int $0x10
: fin:
: hlt
: jmp fin
: MsgMove:.ascii "Hello World!"
: .org 510
: .word 0xaa55
小弟也只是x86新手
最近也在閱讀自己寫作業系統的書籍
所以不保證我所說的是100%正確的
純粹就我的理解來跟大家分享...
以下節錄自《Orange's 一個作業系統的實現》的書籍內容:
-------------------------------------
當電腦電源被打開時
它會先進行加電自檢(POST)
然後尋找開機磁片
如果是選擇從軟碟啟動
電腦就會檢查軟碟的0面0磁軌1扇區
如果發現它以0xAA55結束
則BIOS認為它是一個開機磁區
當然,一個正確的開機磁區除了以0xAA55結束之外
還應該包含一段少於512位元組的執行碼
一旦BIOS發現了開機磁區
就會將這512位元組的內容裝載到記憶體位址:0000:7c00處
然後跳轉到0000:7c00處將控制權徹底的交給這段開機程式碼
--------------------------------------
由以上的說明,我們可以知道為何最後需要:
.org510
.word 0xaa55
就是為了要在512位元組的開機磁區最後兩個bytes填上0xAA55
來讓BIOS可以知道這是一個開機磁區
而由於BIOS會自動將開機磁區512位元組的內容裝載(複製)到記憶體位址:0000:7c00處
因此你必須將你的這段程式連結到0000:7c00處
這樣程式在執行的時候才會執行在正確的位址
這也就是為何需要在連結的時候透過-Ttext = 0x7c00
(在不使用ljmp $0x07c0, $_start的情況)
來告訴Linker將我們的這段程式連結到0000:7c00處
--------------------------------------
順帶一提,算是我當初看《Orange's 一個作業系統的實現》這段開機程式碼的心得:
這邊用的int $0x10實際上是使用BIOS的Video Service
可以上Wikipedia搜尋相關說明:http://goo.gl/w8TJb
上面說明了當%ah = 0x13時,BIOS提供的Video Service為:Write string
需要設定:
%al (Write Mode)
%bh (Page Number)
%bl (Color)
%cx (String Length)
%dh (Row)
%dl (Column)
%es:bp (Offset of String)
這幾個暫存器的值...
一開始我看到這段codes的時候完全不知道為何要設定這些暫存器
在以往的印象int指令都是Software interrupt
根本不知道其實這是BIOS所提供的功能
之後才發現原來BIOS有這段玄機在
--------------------------------------
最後附上《Orange's 一個作業系統的實現》書中附的開機程式碼:
(P.S. 書中所使用的語法是NASM,而非GAS)
org 07c00h ; 告訴編譯器程序加載到7c00處
; 相當於在連結時使用-Ttext = 0x7c00
mov ax, cs
mov ds, ax
mov es, ax
call DispStr ; 使用顯示字元串例程
jmp $ ; 無限循環
DispStr:
mov ax, BootMessage
mov bp, ax ; ES:BP = 串位址
mov cx, 16 ; CX = 串長度
mov ax, 01301h ; AH = 13, AL = 01h
mov bx, 000ch ; 頁號為0(BH = 0)
; 黑底紅字(BL = 0Ch,高亮)
mov dl, 0
int 10h ; 10h 號中斷
ret
BootMessage: db "Hello, OS world!"
times 510-($-$$) db 0 ; 填充剩下的空間,使生成的二進制程式碼
; 恰好為512字節
dw 0xaa55 ; 結束標誌
--------------------------------------
如果你也有興趣自己學怎寫一個簡單的作業系統的話....
《Orange's 一個作業系統的實現》其實是一本非常不錯的書籍
我自己是已經看到第9章檔案系統的部份了
推薦給你參考一下
我也還在學習中,所以不保證我講的東西都是正確的
有問題的話歡迎提出來討論... :)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.36.234.151
※ 編輯: frank0125 來自: 114.36.234.151 (03/23 18:55)
推
03/23 19:18, , 1F
03/23 19:18, 1F
→
03/23 19:25, , 2F
03/23 19:25, 2F
→
03/23 19:26, , 3F
03/23 19:26, 3F
→
03/23 19:35, , 4F
03/23 19:35, 4F
→
03/23 19:36, , 5F
03/23 19:36, 5F
推
03/23 19:36, , 6F
03/23 19:36, 6F
→
03/23 19:37, , 7F
03/23 19:37, 7F
→
03/23 19:38, , 8F
03/23 19:38, 8F
※ 編輯: frank0125 來自: 114.36.234.151 (03/23 19:39)
→
03/23 19:41, , 9F
03/23 19:41, 9F
→
03/23 19:41, , 10F
03/23 19:41, 10F
→
03/23 19:43, , 11F
03/23 19:43, 11F
→
03/23 19:44, , 12F
03/23 19:44, 12F
→
03/23 19:44, , 13F
03/23 19:44, 13F
→
03/23 19:45, , 14F
03/23 19:45, 14F
推
03/23 19:46, , 15F
03/23 19:46, 15F
→
03/23 19:47, , 16F
03/23 19:47, 16F
→
03/23 19:49, , 17F
03/23 19:49, 17F
→
03/23 19:50, , 18F
03/23 19:50, 18F
→
03/23 19:50, , 19F
03/23 19:50, 19F
→
03/23 19:50, , 20F
03/23 19:50, 20F
→
03/23 19:51, , 21F
03/23 19:51, 21F
→
03/23 19:52, , 22F
03/23 19:52, 22F
→
03/23 20:34, , 23F
03/23 20:34, 23F
→
03/23 20:34, , 24F
03/23 20:34, 24F
※ 編輯: frank0125 來自: 114.36.234.151 (03/23 20:35)
推
03/23 20:48, , 25F
03/23 20:48, 25F
→
03/23 21:02, , 26F
03/23 21:02, 26F
→
03/23 21:03, , 27F
03/23 21:03, 27F
→
03/23 21:05, , 28F
03/23 21:05, 28F
→
03/23 21:05, , 29F
03/23 21:05, 29F
※ 編輯: frank0125 來自: 114.36.234.151 (03/23 21:16)
推
03/24 02:17, , 30F
03/24 02:17, 30F
→
03/24 02:18, , 31F
03/24 02:18, 31F
推
03/24 02:21, , 32F
03/24 02:21, 32F
→
03/24 08:57, , 33F
03/24 08:57, 33F
→
03/24 08:59, , 34F
03/24 08:59, 34F
→
03/24 08:59, , 35F
03/24 08:59, 35F
推
03/24 14:45, , 36F
03/24 14:45, 36F
→
03/24 16:44, , 37F
03/24 16:44, 37F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
LinuxDev 近期熱門文章
PTT數位生活區 即時熱門文章
54
117