NO.3
0. 回顾
上节的代码中主要写了引导、读盘部分,了解了计算机启动时的各种操作,计算机按下电源后,开始执行初始的地址段寄存器的地址,然后一路往后初始化,读取盘的mbr,然后跳转到7c00,执行读盘操作,从第二个盘开始往后读取,读完了后跳转到盘的内容处开始执行。
1. c语言导入
这个据别人介绍,是在第8天会介绍这段代码。
2. c语言文件编译说明
针对bootpack.c这个文件怎么变成可执行代码呢?书中的说法:
- 首先,bootpack.c生成bootpack.gas,gas是gun下的汇编文件,因为gcc是以gas汇编语言为基础
- 然后将bootpack.gas生成bootpack.nas文件,nas是nask汇编的格式文件。
- 然后将nask汇编文件编译成2进制文件,这是c语言源码生成的2进制文件,因为是我们c语言的目标就叫obj文件。
- 这时候的obj还仅仅是c语言翻译出来的2进制文件,他的依赖啥的还没有链接出来,所以还要生成bim,这是个半成品的bim,也就是一个可以连接的文件但是还没有和其他文件放在一起的文件。
- 这个bim还知识一个通用的2进制,接下来要换成操作系统对应的文件,所以还得有个hrb,然后把他们需要的依赖合在一起。
以上的步骤就全部写在这个makefile里面了。
TOOLPATH = ../z_tools/
INCPATH = ../z_tools/haribote/
MAKE = $(TOOLPATH)make.exe -r
NASK = $(TOOLPATH)nask.exe
CC1 = $(TOOLPATH)cc1.exe -I$(INCPATH) -Os -Wall -quiet
GAS2NASK = $(TOOLPATH)gas2nask.exe -a
OBJ2BIM = $(TOOLPATH)obj2bim.exe
BIM2HRB = $(TOOLPATH)bim2hrb.exe
RULEFILE = $(TOOLPATH)haribote/haribote.rul
EDIMG = $(TOOLPATH)edimg.exe
IMGTOL = $(TOOLPATH)imgtol.com
COPY = copy
DEL = del
default :
$(MAKE) img
ipl10.bin : ipl10.nas Makefile
$(NASK) ipl10.nas ipl10.bin ipl10.lst
asmhead.bin : asmhead.nas Makefile
$(NASK) asmhead.nas asmhead.bin asmhead.lst
bootpack.gas : bootpack.c Makefile
$(CC1) -o bootpack.gas bootpack.c
bootpack.nas : bootpack.gas Makefile
$(GAS2NASK) bootpack.gas bootpack.nas
bootpack.obj : bootpack.nas Makefile
$(NASK) bootpack.nas bootpack.obj bootpack.lst
naskfunc.obj : naskfunc.nas Makefile
$(NASK) naskfunc.nas naskfunc.obj naskfunc.lst
bootpack.bim : bootpack.obj naskfunc.obj Makefile
$(OBJ2BIM) @$(RULEFILE) out:bootpack.bim stack:3136k map:bootpack.map \
bootpack.obj naskfunc.obj
# 3MB+64KB=3136KB
bootpack.hrb : bootpack.bim Makefile
$(BIM2HRB) bootpack.bim bootpack.hrb 0
haribote.sys : asmhead.bin bootpack.hrb Makefile
copy /B asmhead.bin+bootpack.hrb haribote.sys
haribote.img : ipl10.bin haribote.sys Makefile
$(EDIMG) imgin:../z_tools/fdimg0at.tek \
wbinimg src:ipl10.bin len:512 from:0 to:0 \
copy from:haribote.sys to:@: \
imgout:haribote.img
img :
$(MAKE) haribote.img
run :
$(MAKE) img
$(COPY) haribote.img ..\z_tools\qemu\fdimage0.bin
$(MAKE) -C ../z_tools/qemu
install :
$(MAKE) img
$(IMGTOL) w a: haribote.img
clean :
-$(DEL) *.bin
-$(DEL) *.lst
-$(DEL) *.gas
-$(DEL) *.obj
-$(DEL) bootpack.nas
-$(DEL) bootpack.map
-$(DEL) bootpack.bim
-$(DEL) bootpack.hrb
-$(DEL) haribote.sys
src_only :
$(MAKE) clean
-$(DEL) haribote.img
搞了半天,到后面还有一步,就是加入引导,再整个文件里面。就是把这两个文件分别复制到img文件里面,然后把img复制过去,跑!!!
如果有错,欢迎指出。
邮箱:ningmonguo@foxmail.com