我想做一个操作系统(为了好玩??)。当我对同学提出这一计划时,他觉得是异想天开。于是我们打赌,我要在2年内写出一个这样的操作系统。
看到没,2020.5.28-2022.5.28是我们打赌的时间
嘿嘿,有了《30天自制操作系统》这种"神书",我还怕什么?
书里有现成的代码,但是抄了就不是自己的系统了。
你看看TianrunOS
TianrunOS是国产第一款免费独立内核操作系统,世界第五款独核系统.核心由一名高中生独立开发,独立内核,超小体积,极速运行,超强功能,软件完全正版免费.
(什么鬼啊)
(我才不想做成这样)
废话少说,下面要步入正题:
写操作系统,肯定要用C和汇编,于是我决定使用NASM(原书中用的是nask,可是nask不主流,没有nasm强大)
编译器是个很头疼的问题,我想用Mingw,结果编译以后再链接就成了这个鬼东西
什么东西??“This program cannot be run in dos mode”,这些完全不是我想要的东西,mingw怎么自己加了这么多乱七八糟的玩意??
不出所料,运行就发生了错误,真是让人头疼
但是用原书中的编译器编译相同的代码,却可以正常运行。
开工5天了,我还在为编译器发愁
我又不想用《30天自制操作系统》里面的编译器,因为书里的编译器是nask汇编,而且c编译器主函数还要写成HariMain,我又不是要做Haribote系统,我才不想那样呢。再说了我想用更加大众化的编译器。
我觉得Mingw自己加的那些东西应该就是类似于文件头之类的东西,所以我只需要想办法把链接以后的文件中含有我编译出的程序的那一部分截出来就行了。翻了一下博客,有一段可能验证了我的猜想:
十分感谢ivan240十年前的博客!
博文链接:GCC的连接脚本学习笔记
查了一下objcopy,似乎objcopy -O binary xxx xxx.bin 就可以把可执行段复制出来?
试了一下,似乎可以把可执行段复制出来,但是跟原书中的编译器编译出来的bootpack存在令人疑惑的差异
肯定还是编译器的问题,我又看了这个网站Gcc Cross-Compiler
今天(2020.7.31)又试了一下,发现程序好像卡在某个地方了,C语言写的部分实际上并没有被运行。然而代码看了n遍也没有看个究竟出来。没办法,又安了带调试功能的Bochs,这下不用看编译器和虚拟机的脸色了。
思来想去,应该是链接器的问题,我也不想费那个脑子了,直接把书中的链接器搬来用,终于成功了。
虽然只是一个显示的测试,但是这次的成功也是有里程碑意义的。
折腾了老半天都是在为了编译,所以Makefile是肯定要贴出来的
TOOLPATH = tools
OUTPATH = out
IPLPATH = IPL
KERNELPATH = kernel
MAKE = $(TOOLPATH)/make.exe -r
NASK = $(TOOLPATH)/nask.exe
GAS2NASK = $(TOOLPATH)/gas2nask.exe -a
OBJ2BIM = $(TOOLPATH)/obj2bim.exe
BIM2HRB = $(TOOLPATH)/bim2hrb.exe
RULEFILE = $(TOOLPATH)/haribote.rul
EDIMG = $(TOOLPATH)/edimg.exe
IMGTOL = $(TOOLPATH)/imgtol.com
default :
make.exe img
$(OUTPATH)/ipl.bin : $(IPLPATH)/ipl.asm Makefile
$(TOOLPATH)/nasm.exe -o $(OUTPATH)/ipl.bin $(IPLPATH)/IPL.asm
$(OUTPATH)/asmhead.bin: $(KERNELPATH)/asmhead.asm Makefile
$(TOOLPATH)/nasm -f bin $(KERNELPATH)/asmhead.asm -o $(OUTPATH)/asmhead.bin
$(OUTPATH)/nasmfunc.obj: $(KERNELPATH)/nasmfunc.asm Makefile
$(TOOLPATH)/nasm -f win32 -o $(OUTPATH)/nasmfunc.obj $(KERNELPATH)/nasmfunc.asm
$(OUTPATH)/bootpack.obj: $(KERNELPATH)/bootpack.c Makefile
gcc -c -o $(OUTPATH)/bootpack.obj $(KERNELPATH)/bootpack.c
$(OUTPATH)/bootpack.hrb: $(OUTPATH)/bootpack.bim Makefile
$(BIM2HRB) $(OUTPATH)/bootpack.bim $(OUTPATH)/bootpack.hrb 0
$(OUTPATH)/bootpack.bim : $(OUTPATH)/bootpack.obj $(OUTPATH)/nasmfunc.obj Makefile
$(TOOLPATH)/obj2bim.exe @$(RULEFILE) out:$(OUTPATH)/bootpack.bim stack:3136k map:$(OUTPATH)/bootpack.map \
$(OUTPATH)/bootpack.obj $(OUTPATH)/nasmfunc.obj
# 3MB+64KB=3136KB
$(OUTPATH)/kernel.bin: $(OUTPATH)/asmhead.bin $(OUTPATH)/bootpack.hrb Makefile
copy /B $(OUTPATH)\asmhead.bin+$(OUTPATH)\bootpack.hrb $(OUTPATH)\kernel.bin
COS.img : $(OUTPATH)/ipl.bin $(OUTPATH)/kernel.bin Makefile
$(TOOLPATH)/editimg $(OUTPATH)/ipl.bin $(OUTPATH)/kernel.bin 0x4200 COS.img
img :
make.exe -r COS.img
clean :
-del $(OUTPATH)/ipl.bin
-del $(OUTPATH)/asmhead.bin
-del $(OUTPATH)/bootpack.bin
-del $(OUTPATH)/nasmfunc.obj
-del $(OUTPATH)/bootpack.obj
-del $(OUTPATH)/bootpack
-del $(OUTPATH)/bootpack.bin
-del $(OUTPATH)/kernel.bin
2020.10.1
今天终于把键盘中断做好了
(很长时间没更新了,别问我为什么,去问我的老师为什么布置那么多作业)
(持续更新中…)