30天自制操作系统笔记(三)

来源:互联网 发布:去除数据中的噪声 编辑:程序博客网 时间:2024/05/16 00:30

今天学习了第三天的内容,相比较前两天的内容有点难,但是还好成果出来啦。本次主要的改进之处是修改了主函数的名字,是我们可以不拘泥作者的要求。

我们先看一下运行结果截图:

此图为正常的运行结果,到现在操作系统采用了汇编+C语言的方式。我们看一下操作系统的主函数:

/*告诉C编译器,有一个函数在别的文件里*/void io_hlt(void);void UcanMain(void){fin:io_hlt();    /*执行nashfunc.nas里的_io_hlt*/goto fin;}
注:原来的代码中的主函数只能为HariMain,不能修改,但是我发现在其调用的库中可以修改,故将其修改为自己想要的函数名字,需要修改下面的部分:


如果需要,需要修改haribote.rul文件上面黄色的部分,除此之外还要修改文件:


需要将harilibc.lib文件上面圈起来的部分修改为自己想要的名字,但注意大小写,大小写一定要跟源文件中的一样。

下面是函数_io_hlt所在的文件源码:

; naskfunc; TAB=4[FORMAT "WCOFF"][BITS 32][FILE "naskfunc.nas"]GLOBAL _io_hlt[SECTION .text]_io_hlt:HLTRET
下面是ucan23.nas文件的源码

; ucan23-os; TAB=4BOTPAKEQU0x00280000DSKCACEQU0x00100000DSKCAC0EQU0x00008000; 有关BOOT_INFOCYLSEQU0x0ff0LEDSEQU0x0ff1VMODEEQU0x0ff2SCRNXEQU0x0ff4SCRNYEQU0x0ff6VRAMEQU 0x0ff8ORG0xc200MOVAL, 0x13MOVAH, 0x00INT0x10MOV BYTE[VMODE], 8MOVWORD[SCRNX], 320MOVWORD[SCRNY], 200MOVDWORD [VRAM], 0x000a0000; 用BIOS获取LED指示灯的状态MOVAH, 0x02INT0x16          ; keyboard BIOSMOV[LEDS], ALMOVAL, 0XffOUT0x21, ALNOPOUT0xa1, ALCLICALLwaitkbdoutMOVAL, 0xd1OUT0x64, ALCALLwaitkbdoutMOVAL, 0xdfOUT0x60, ALCALLwaitkbdout[INSTREST "i486p"]LGDT[GDTR0]MOVEAX,CR0ANDEAX, 0x7fffffffOREAX, 0x00000001MOVCR0, EAXJMPpipelineflushpipelineflush:MOVAX, 1*8MOVDS, AXMOV ES, AXMOVFS, AXMOVGS, AXMOV SS, AXMOVESI, bootpackMOVEDI, BOTPAKMOVECX, 512*1024/4CALLmemcpyMOVESI, 0x7c00MOVEDI, DSKCACMOVECX, 512/4CALLmemcpyMOVESI, DSKCAC0+512MOVEDI, DSKCAC+512MOVECX, 0MOVCL, BYTE [CYLS]IMULECX, 512*18*2/4SUBECX, 512/4CALLmemcpyMOVEBX, BOTPAKMOVECX, [EBX+16]ADDECX, 3SHRECX, 2JZskipMOVESI, [EBX+20]ADDESI, EBXMOVEDI, [EBX+12]CALLmemcpyship:MOVESP, [EBX+12]JMPDWORD 2*8:0X0000001Bwaitkdbout:INAL, 0x64ANDAL, 0x02JNZwaitkdboutRETmemcpy:MOVEAX, [ESI]ADDESI, 4MOV[EDI], EAXADDEDI, 4SUBECX, 1JNZmemcpyRETALIGNB16GDT0:RESB 8DW0xffff,0x0000,0x9200,0x00cfDW0xffff,0x0000,0x9a28,0x0047DW0GDTR0:DW8*3-1DDGDT0ALIGNB16bootpack:;fin:;HLT;JMPfin

接下来是引导文件ucan23ipl.nas的源码:

; ucan23-os; TAB-4CYLSEQU10ORG0x7c00;指明程序的装载地址; 以下这段是标准FAT12格式软盘专用的代码JMPentryDB0x90DB"UCAN23LD";启动区的名称可以是任意的字符串(8字节)DW512;每个扇区的大小DB1;簇的大小DW1DB2DW224DW2880DB0xf0DW9DW18DW2DD0DD2880DB0,0,0x29DD0xffffffffDB"UCAN23-OS  "DB"FAT12   "RESB18;程序主体entry:MOVAX, 0;初始化寄存器MOVSS, AXMOVSP, 0x7c00MOVDS, AX;读磁盘MOVAX, 0x0820MOV ES, AXMOVCH, 0MOVDH, 0MOVCL, 2readloop:MOVSI, 0 ;记录失败次数的寄存器retry:MOVAH, 0x02MOVAL, 1MOVBX, 0MOVDL, 0x00INT0x13JNCnextADDSI, 1CMPSI, 5JAEerrorMOVAH, 0x00MOVDL, 0x00INT0x13JMPretry;JMPerrornext:MOVAX, ESADDAX, 0x0020MOVES, AXADDCL, 1CMPCL, 18JBEreadloopMOVCL, 1ADD DH, 1CMPDH, 2JBreadloopMOVDH, 0ADDDH, 1CMPCH, CYLSJBreadloopMOV[0x0ff0], CHJMP0xc200error:MOVSI, msgputloop:MOVAL, [SI]ADDSI, 1CMPAL, 0JEfinMOVAH, 0x0eMOVBX, 15INT0x10JMPputloopfin:HLTJMPfin;信息显示部分msg:DB0x0a, 0x0a;2个换行DB"Hello, world(ucan23)"DB0x0aDB"This is my first OS"DB0x0aDB"Copyright GPL"DB0x0aDB"Author: ucan23(Howard)"DB0x0aDB"Blog:http://blog.sina.com/rjxx007"DB0x0aDB"Blog:http://blog.csdn.net/ucan23"DB0x0aDB0RESB0x7dfe-$DB0x55, 0xaa

最后是Makefile文件:

TOOLPATH = ../tolset/z_tools/INCPATH = ../tolset/z_tools/haribote/MAKE = $(TOOLPATH)make.exe -rNASK = $(TOOLPATH)nask.exeCC1 = $(TOOLPATH)cc1.exe -I$(INCPATH) -Os -Wall -quietGAS2NASK = $(TOOLPATH)gas2nask.exe -aOBJ2BIM = $(TOOLPATH)obj2bim.exeBIM2HRB = $(TOOLPATH)bim2hrb.exeRULEFILE = $(TOOLPATH)haribote/haribote.rulEDIMG = $(TOOLPATH)edimg.exeIMGTOL   = $(TOOLPATH)imgtol.comCOPY = copyDEL = deldefault:$(MAKE) imgucan23ipl.bin: ucan23ipl.nas Makefile$(NASK) ucan23ipl.nas ucan23ipl.bin ucan23ipl.lstucan23.bin: ucan23.nas Makefile$(NASK) ucan23.nas ucan23.bin ucan23.lstbootpack.gas: bootpack.c Makefile$(CC1) -o bootpack.gas bootpack.cbootpack.nas: bootpack.gas Makefile$(GAS2NASK) bootpack.gas bootpack.nasbootpack.obj: bootpack.nas Makefile$(NASK) bootpack.nas bootpack.obj bookpack.lstnaskfunc.obj: naskfunc.nas Makefile$(NASK) naskfunc.nas naskfunc.obj naskfunc.lstbootpack.bim: bootpack.obj naskfunc.obj Makefile$(OBJ2BIM) @$(RULEFILE) out:bootpack.bim stack:3136k map:bootpack.map \bootpack.obj naskfunc.objbootpack.hrb: bootpack.bim Makefile$(BIM2HRB) bootpack.bim bootpack.hrb 0ucan23.sys: ucan23ipl.bin bootpack.hrb Makefilecopy /B ucan23ipl.bin+bootpack.hrb ucan23.sysucan23.img: ucan23ipl.bin ucan23.sys Makefile$(EDIMG) imgin:../tolset/z_tools/fdimg0at.tek \wbinimg src:ucan23ipl.bin len:512 from:0 to:0 \copy from:ucan23.sys to:@: \imgout:ucan23.imgasm:$(MAKE) ucan23ipl.binimg:$(MAKE) ucan23.imgrun:$(MAKE) img$(COPY) ucan23.img ..\tolset\z_tools\qemu\fdimage0.bin$(MAKE) -C ../tolset/z_tools/qemuinstall:$(MAKE) img$(IMGTOL) w a: ucan23.imgclean:-$(DEL) *.bin-$(DEL) *.lst-$(DEL) *.gas-$(DEL) *.obj-$(DEL) bootpack.nas-$(DEL) bootpack.map-$(DEL) bootpack.bim-$(DEL) bootpack.hrb-$(DEL) ucan23.syssrc_only:$(MAKE) clean-$(DEL) ucan23.img