新闻  |   论坛  |   博客  |   在线研讨会
在linux下使用bochs+gcc+AT&T试验引导程序
0750long | 2009-04-07 16:24:44    阅读:2217   发布文章

在linux下使用bochs+gcc+AT&T试验引导程序

首先写一个简单的引导程序{这个程序是从赵炯《linux0.11内核完全剖析》上用AT&T语法改过来的}做实验代码如下:

BOOTSEG = 0x07c0
.code16
.text
.global start
start:
    # Normalize the start address
    jmpl    $BOOTSEG, $start2
start2:
    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    $0x10
loop:    jmp    loop                             #死循环
msg:    .ascii  "loading system..."
    .byte    13,10
.org    510
    .word     0xAA55

然后写一个Makefile,内容如下:

AS=as
LD=ld
.s.o:
    ${AS} -a $< -o $*.o >$*.map
final: bootsect
    dd if=bootsect of=diska.img count=1
bootsect: 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,就可以了。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客