Re: [問題] QEMU+GDB 開機, int 跳不過去的問題

作者: frank0125 (送喔)   2013-03-23 18:33:14
※ 引述《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 一個作業系統的實現》的書籍內容:
作者: ericwang1017 (Eric)   2013-03-23 19:18:00
謝謝你的回覆, 不過ljmp 是CS:ip , 所以是0x07c0 :)我發現我位置有打錯, 以更正不過code 那邊是沒打錯的
作者: frank0125 (送喔)   2013-03-23 19:35:00
喔喔!! 忘記要乘0x10了~ 拍謝!! 8086真的是有點討厭...我也修改一下我的回文好了... 不過大致上觀念是相同的~
作者: ericwang1017 (Eric)   2013-03-23 19:36:00
您可以試看看把這些code 用qemu + gdb 跑看看並且分別用"沒有ljmp"與 "有ljmp"的方式做看看就會發現GDB很笨,只認 EIP的數值
作者: frank0125 (送喔)   2013-03-23 19:41:00
其實甚至Linux都很少用分段機制...Linux都直接把%cs, %es, %ds... 分段暫存器直接設成0x0這種模式還有個專有名詞叫做叫做Flat memory model...http://goo.gl/PAfb9至於GDB怎做的我就不太清楚了... 不過連Linux都不想用它我想一定是有它的麻煩之處... XD
作者: ericwang1017 (Eric)   2013-03-23 19:46:00
ㄜ, linux011 的 bootsec.s的第一行就是 LJMP事實上, 我的code 上半部就是抄那邊的..抱歉更正, linux011的code 我是拿GCC改過的
作者: frank0125 (送喔)   2013-03-23 19:50:00
Linux 0.01的codes我是沒有trace過... 或許它有用分段機制... 不過我看Wiki上是說現在的Linux都已經捨棄分段機制不用,只使用分頁機制了...當然詳細的情況還是要trace codes才知道~ 不過我想分段機制的觀念大概就是那樣... 有機會再多交流~ :)不過講了這麼多... 好像改成:ljmp $0x0000, $_start配上-Text = 0x7C00應該就可以正確執行了吧?! XDDD
作者: ericwang1017 (Eric)   2013-03-23 20:48:00
兩種方式都可以在qemu正常執行, 只是GDB有差異
作者: frank0125 (送喔)   2013-03-23 21:02:00
了解... ljmp $0x07C0, $_start應該也是OK的~是我想錯了... 回文我再修改一下~看來應該是GDB在處理分段機制的時候有問題...所以才會載錯位址... 至於程式碼兩者應該都是對的寫法~
作者: ericwang1017 (Eric)   2013-03-24 02:17:00
我也是這樣想, 不過我在猜是否是gdb有參數沒設好..還是感謝你回文嚕 :)對了, facebook上有個juluOSDev社團, 我想你會有興趣
作者: frank0125 (送喔)   2013-03-24 08:57:00
我已經加入了, Jsev和Descent兩位都是久仰其名的大大們一開始因為記憶體位址的問題而想錯方向了...拍謝沒有回答到你真正的問題... QQ
作者: ericwang1017 (Eric)   2013-03-24 14:45:00
我的問題已經找到解法了, 回在社團上面, 你可以看看
作者: frank0125 (送喔)   2013-03-24 16:44:00
OK... Thanks a lot :)

Links booklink

Contact Us: admin [ a t ] ucptt.com