先讲一下操作系统的引导过程:
PC加电自检后,会把引导设备的0磁头,0磁道,1扇区的内容加载到内存 0x7c00 处,然后就跳转到该处执行引导代码。我只是简单地说了下,详情请自行Google。
boot.S
1 .code16
2 .text
3 .globl _start:
4 _start:
5 cli
6 ljmp $0x7c00, $0
7 go:
8 movw %cs, %ax
9 movw %ax, %ds
10 movw %ax, %ss
11 movw $0xff00, %sp
12 sti
13
14 movw $0x0007, %bx
15 movw $16, %cx
16 movw $0, %dx
17 movw $msg, %bp
18 movw $0x1301, %ax
19 int $0x10
20
21 jmp .
22 msg: .ascii "Hello, OS World!"
23 .org 510
24 .word 0xaa55
boot.S采用的是AT&T格式的汇编语法,执行的工作就是先设置好相关段寄存器的值,再调用10h中断显示字符串
1 .code16
2 .text
3 .globl _start:
4 _start:
5 cli
6 ljmp $0x7c00, $0
7 go:
8 movw %cs, %ax
9 movw %ax, %ds
10 movw %ax, %ss
11 movw $0xff00, %sp
12 sti
13
14 movw $0x0007, %bx
15 movw $16, %cx
16 movw $0, %dx
17 movw $msg, %bp
18 movw $0x1301, %ax
19 int $0x10
20
21 jmp .
22 msg: .ascii "Hello, OS World!"
23 .org 510
24 .word 0xaa55
为了把它加载到bochs,我们还要用make将其编译为纯二进制代码,并且写好相应的配置文件
Makefile
1 AS=as
2 LD=ld
3 OBJCOPY=objcopy
4
5 all: floppy.img
6
7 floppy.img: boot
8 dd if=/dev/zero/ of=floppy.img bs=1024 count=1440
9 dd if=boot of=floppy.img bs=512 count=1 conv=notrunc
10
11 boot: boot.o
12 $(LD) -N -e _start -Ttext 0 -o $@.elf $^
13 $(OBJCOPY) -S -O binary $@.elf $@
14
15 boot.o: boot.S
16 $(AS) -o $@ $^
17
18 clean:
19 rm -rf *.o *.img *.elf bochs.log boot
bochs配置文件的解释请Google
1 AS=as
2 LD=ld
3 OBJCOPY=objcopy
4
5 all: floppy.img
6
7 floppy.img: boot
8 dd if=/dev/zero/ of=floppy.img bs=1024 count=1440
9 dd if=boot of=floppy.img bs=512 count=1 conv=notrunc
10
11 boot: boot.o
12 $(LD) -N -e _start -Ttext 0 -o $@.elf $^
13 $(OBJCOPY) -S -O binary $@.elf $@
14
15 boot.o: boot.S
16 $(AS) -o $@ $^
17
18 clean:
19 rm -rf *.o *.img *.elf bochs.log boot
1
megs:
32
2 romimage: file = $BXSHARE / BIOS - bochs - latest #, address = 0xf0000
3 vgaromimage: file = $BXSHARE / VGABIOS - lgpl - latest
4 floppya: 1_44 = floppy.img, status = inserted
5 boot: a
2 romimage: file = $BXSHARE / BIOS - bochs - latest #, address = 0xf0000
3 vgaromimage: file = $BXSHARE / VGABIOS - lgpl - latest
4 floppya: 1_44 = floppy.img, status = inserted
5 boot: a