原文4.1节-基于Loader的系统引导
基础源代码参考《Orange S一个操作系统的实现\chapter4\c》
原Makefile为:
##################################################
# Makefile
##################################################
BOOT:=boot.asm
LDR:=loader.asm
BOOT_BIN:=$(subst .asm,.bin,$(BOOT))
LDR_BIN:=$(subst .asm,.bin,$(LDR))
IMG:=a.img
FLOPPY:=/mnt/floppy/
.PHONY : everything
everything : $(BOOT_BIN) $(LDR_BIN)
dd if=$(BOOT_BIN) of=$(IMG) bs=512 count=1 conv=notrunc
sudo mount -o loop $(IMG) $(FLOPPY)
sudo cp $(LDR_BIN) $(FLOPPY) -v
sudo umount $(FLOPPY)
clean :
rm -f $(BOOT_BIN) $(LDR_BIN)
$(BOOT_BIN) : $(BOOT)
nasm $< -o $@
$(LDR_BIN) : $(LDR)
nasm $< -o $@
修改为如下
##################################################
# Makefile
##################################################
BOOT:=boot.asm
LDR:=loader.asm
BOOT_BIN:=$(subst .asm,.bin,$(BOOT))
LDR_BIN:=$(subst .asm,.bin,$(LDR))
IMG:=data.img
FLOPPY:=/mnt/floppy/
.PHONY : everything
everything : $(BOOT_BIN) $(LDR_BIN)
dd if=$(BOOT_BIN) of=$(IMG) bs=512 count=1 conv=notrunc
sudo mount -o loop $(IMG) $(FLOPPY)
sudo cp $(LDR_BIN) $(FLOPPY) -v
sudo umount $(FLOPPY)
clean :
rm -f $(BOOT_BIN) $(LDR_BIN)
rm -f $(IMG)
createFp :
bximage -mode=create -fd=1.44M -q $(IMG)
qemu :
qemu-system-i386 -fda $(IMG)
$(BOOT_BIN) : $(BOOT)
nasm $< -o $@
$(LDR_BIN) : $(LDR)
nasm $< -o $@
新增生成软盘的命令,如下:
createFp :
bximage -mode=create -fd=1.44M -q $(IMG)
新增执行qemu的命令,如下:
qemu :
qemu-system-i386 -fda $(IMG)
在clean中新增删除内容,如下:
rm -f $(IMG)
在这样的架构下,整个运行流程可以按照如下步骤进行:
(1)清除原有过程文件
as@as-virtual-machine:~/osdir/chapter4C$ make clean
(2)生成空软盘
as@as-virtual-machine:~/osdir/chapter4C$ make createFp
(3)生成完整软盘(包括填充的第一扇区boot.bin和复制进去的文件loader.bin)
as@as-virtual-machine:~/osdir/chapter4C$ make everything
(4)运行qemu
as@as-virtual-machine:~/osdir/chapter4C$ make qemu
运行效果如下所示:
与原书P117图4.5内容一致。
原文4.2节-修改后的保护模式下的引导
把书中第三章的代码pmtest9.asm编译,覆盖掉原来的loader.bin,运行效果如下:
与书中图4.6一致,图4.6如下所示
原文5.4.1节-从Loader到内核
写入Elf格式文件后,运行结果如下所示
与书中图5.5一致
修改后的Makefile如下:
##################################################
# Makefile
##################################################
BOOT:=boot.asm
LDR:=loader.asm
KERNEL:=kernel.asm
BOOT_BIN:=$(subst .asm,.bin,$(BOOT))
LDR_BIN:=$(subst .asm,.bin,$(LDR))
KERNEL_BIN:=$(subst .asm,.bin,$(KERNEL))
IMG:=a.img
FLOPPY:=/mnt/floppy/
.PHONY : everything
everything : $(BOOT_BIN) $(LDR_BIN) $(KERNEL_BIN)
dd if=$(BOOT_BIN) of=$(IMG) bs=512 count=1 conv=notrunc
sudo mount -o loop $(IMG) $(FLOPPY)
sudo cp $(LDR_BIN) $(FLOPPY) -v
sudo cp $(KERNEL_BIN) $(FLOPPY) -v
sudo umount $(FLOPPY)
clean :
rm -f $(BOOT_BIN) $(LDR_BIN) $(KERNEL_BIN) *.o
rm -f $(IMG)
createFp :
bximage -mode=create -fd=1.44M -q $(IMG)
qemu :
qemu-system-i386 -fda $(IMG)
$(BOOT_BIN) : $(BOOT)
nasm $< -o $@
$(LDR_BIN) : $(LDR)
nasm $< -o $@
$(KERNEL_BIN) : $(KERNEL)
nasm -f elf -o $(subst .asm,.o,$(KERNEL)) $<
ld -m elf_i386 -s -o $@ $(subst .asm,.o,$(KERNEL))
主要的修改在最后一行代码,原来的代码中如下所示
ld -s -o $@ $(subst .asm,.o,$(KERNEL))
运行过程中报错如下:
经查原因为:
我用的ubuntu是64位的,在x86_64上编译/链接32位应用程序时,设置模拟以elf_i386提供正确的elf格式。
修改后的Makefile可以正常运行。
原文5.4.4节
修改后的Makefile如下所示
##################################################
# Makefile
##################################################
BOOT:=boot.asm
LDR:=loader.asm
KERNEL:=kernel.asm
BOOT_BIN:=$(subst .asm,.bin,$(BOOT))
LDR_BIN:=$(subst .asm,.bin,$(LDR))
KERNEL_BIN:=$(subst .asm,.bin,$(KERNEL))
IMG:=a.img
FLOPPY:=/mnt/floppy/
.PHONY : everything
everything : $(BOOT_BIN) $(LDR_BIN) $(KERNEL_BIN)
dd if=$(BOOT_BIN) of=$(IMG) bs=512 count=1 conv=notrunc
sudo mount -o loop $(IMG) $(FLOPPY)
sudo cp $(LDR_BIN) $(FLOPPY) -v
sudo cp $(KERNEL_BIN) $(FLOPPY) -v
sudo umount $(FLOPPY)
clean :
rm -f $(BOOT_BIN) $(LDR_BIN) $(KERNEL_BIN) *.o
rm -f $(IMG)
createFp :
bximage -mode=create -fd=1.44M -q $(IMG)
qemu :
qemu-system-i386 -fda $(IMG)
$(BOOT_BIN) : $(BOOT)
nasm $< -o $@
$(LDR_BIN) : $(LDR)
nasm $< -o $@
$(KERNEL_BIN) : $(KERNEL)
nasm -f elf -o $(subst .asm,.o,$(KERNEL)) $<
ld -m elf_i386 -s -Ttext 0x30400 -o $@ $(subst .asm,.o,$(KERNEL))
运行结果如下所示
和书中图5.9一致,原图如下所示