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