原创
在linux下使用bochs+gcc+AT&T试验引导程序
首先写一个简单的引导程序{这个程序是从赵炯《linux0.11内核完全剖析》上用AT&T语法改过来的}做实验代码如下:
BOOTSEG = 0x07c0.code16.text.global startstart: # Normalize the start address jmpl $BOOTSEG, $start2start2: movw %cs, %ax movw %ax, %ds movw %ax, %es movb %ah,(msg+17) #替换字符串中最后一个.符号为系统蜂鸣声 movw $20,%cx #共显示20个字符,包括回车换行符 movw $0x1004,%dx #字符串将显示的位置0x10行0x0x04列 movw $0x00c,%bx #字符显示属性(红色) movw $msg,%bp #指向要显示的字符串的首址 movw $0x1301,%ax #BIOS中断调用0x10,功能0x13,子功能0x01 int $0x10loop: jmp loop #死循环 msg: .ascii "loading system..." .byte 13,10.org 510 .word 0xAA55然后写一个Makefile,内容如下:
AS=asLD=ld .s.o: ${AS} -a $< -o $*.o >$*.mapfinal: bootsect dd if=bootsect of=diska.img count=1bootsect: bootsect.o ${LD} --oformat binary -N -e start -Ttext 0x0 -o bootsect $<至于Makefile最后一行上的参数是从这个网站
http://en.skelix.org/skelixos/上看到的,少了它还不行
它上面的解释是:
--oformat 指出要产生的目标的格式;binary的意思是不加任何头结构和其它信息的纯二进制文件,就像DOS下的.com文件。如果没有这个选项ld通常将会把ELF格式做为默认选项(事实上这决定于你的系统和GCC的设置)而这不是我们想要的,这是因为当BIOS加载引导扇区时,并没有任何环境使之能够执行ELF文件.
-N 选项在这里不是必须的,它的作用是使文本段(.text)可读可写 .
-e start 指出代码的入口点.
-Ttext 0x0 指出程序的基址.
make之后,进行bochs,就可以了。
用户377235 2012-3-1 19:12
找了6个小时,终于找到这里来了,谢谢楼主拉!!!!!