Hello OS world!
并放在同一个目录下,然后在此目录下编译:
$ make
自动编译、连接和直接生成可启动的软盘镜像文件boot.img。
加载执行boot.img,输出" Hello OS world ! "。
boot.S文件
.code16 #使用16位模式汇编
.text #代码段开始
mov %cs,%ax
mov %ax,%ds
mov %ax,%es
call DispStr #调用显示字符串例程
jmp . #无限循环
DispStr:
mov $BootMessage, %ax
mov %ax,%bp #ES:BP = 串地址
mov $16,%cx #CX = 串长度
mov $0x1301,%ax #AH = 13, AL = 01h
mov $0x00c,%bx #页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
mov $0,%dl
int $0x10 #10h 号中断
ret
BootMessage:.ascii "Hello, OS world!"
.org 510 #填充到~510~字节处
.word 0xaa55 #结束标志
x86.ld文件
SECTIONS
{
. = 0x7c00;
.text :
{
_ftext = .; /* Program will be loaded to 0x7c00. */
} = 0
}
Makefile文件
CC=gcc
LD=ld
LDFILE=x86.ld #使用上面提供的连接脚本x86.ld
OBJCOPY=objcopy
all: boot.img
# Step 1: gcc 调用as 将boot.S 编译成目标文件boot.o
boot.o: boot.S
$(CC) -c boot.S
# Step 2: ld 调用连接脚本x86.ld 将boot.o 连接成可执行文件boot.elf
boot.elf: boot.o
$(LD) boot.o -o boot.elf -e c -T$(LDFILE)
# Step 3: objcopy 移除boot.elf 中没有用的section(.pdr,.comment,.note),
# strip 掉所有符号信息,输出为二进制文件boot.bin 。
boot.bin : boot.elf
@$(OBJCOPY) -R .pdr -R .comment -R.note -S -O binary boot.elf boot.bin
# Step 4: 生成可启动软盘镜像。
boot.img: boot.bin
@dd if=boot.bin of=boot.img bs=512 count=1 #用boot.bin 生成镜像文件第一个扇区
# 在bin 生成的镜像文件后补上空白,最后成为合适大小的软盘镜像
@dd if=/dev/zero of=boot.img skip=1 seek=1 bs=512 count=2879
clean:
@rm -rf boot.o boot.elf boot.bin boot.img
参考:《使用开源软件自己动手写操作系统》