【日拱一卒行而不辍20221008】自制操作系统

原文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一致,原图如下所示

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值