0x02_我的第一个操作系统My-OS
首先配置环境见目录0x00,创建class01文件夹
直接看目录结构
│ main.c(可以调用asm的函数,可以使用最原始的c语言,你要明白基本所有头文件都要用汇编自己造)
│ Makefile(make脚本)
├─asm
│ asmhead.asm(别管)
│ ipl10.asm(别管)
│ naskfunc.asm(这里用来写asm函数)
└─include
head.h(关联asm和c的头文件,c就可以调用asm的函数)
绿色的文件都可以动,我来教你们怎么动
下面我们来实现显示功能
naskfunc.asm
; naskfunc ; TAB=4 [FORMAT "WCOFF"] ; 制作目标文件的模式 [INSTRSET "i486p"] ; 使用到486为止的指令 [BITS 32] ; 3制作32位模式用的机器语言 [FILE "naskfunc.asm"] ; 文件名 GLOBAL _io_hlt,_write_mem8 [SECTION .text] _io_hlt: ; void io_hlt(void); HLT RET _write_mem8: ; void write_mem8(int addr, int data); MOV ECX,[ESP+4] ; taking content of add MOV AL,[ESP+8] ; taking content of data MOV [ECX],AL ; *ecx=al RET
GLOBAL 这里 和 两个函数这里是关键,_io_hlt函数就是休眠cpu的,_是必须要的,这个没有链接不到c语言的函数
_write_mem8用来在指定内存地址写内容的,有两个参数,第一个是地址,第二个是数据,都是int
head.h
void io_hlt(void); void write_mem8(int addr, int data);
main.c
#include "include/head.h" void Main(void){ int i; for (i = 0xa0000; i <= 0xaffff; i++) { write_mem8(i, 12); /* MOV BYTE [i],15 */ } for (;;) { io_hlt(); } }
就是把12(红色)用循环写入显存,每个像素点怎么显示都要看对应的显存地址,比如0xa0000到0xaffff就是每一个像素点的显存
你问为什么12就是红色,这些东西在主板出厂的时候就是规定好的,就是有点调用主板api的味道
makefile
.PHONY:appcations TOOLPATH = ../z_tools/ INCPATH = ../z_tools/haribote/ ASMPATH = ./asm/ 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 OBJS_MAIN = main.obj naskfunc.obj FONTPATH = ./font/ MAKEFONT = $(TOOLPATH)makefont.exe BIN2OBJ = $(TOOLPATH)bin2obj.exe BIM2HRB = $(TOOLPATH)bim2hrb.exe RULEFILE = $(TOOLPATH)haribote/haribote.rul EDIMG = $(TOOLPATH)edimg.exe IMGTOL = $(TOOLPATH)imgtol.com COPY = copy DEL = del # 默认动作 %.gas : %.c Makefile $(CC1) -o $*.gas $*.c %.asm : %.gas Makefile $(GAS2NASK) $*.gas $*.asm %.obj : %.asm Makefile $(NASK) $*.asm $*.obj naskfunc.obj : $(ASMPATH)naskfunc.asm Makefile $(NASK) $(ASMPATH)naskfunc.asm naskfunc.obj ipl10.bin : $(ASMPATH)ipl10.asm Makefile $(NASK) $(ASMPATH)ipl10.asm ipl10.bin asmhead.bin : $(ASMPATH)asmhead.asm Makefile $(NASK) $(ASMPATH)asmhead.asm asmhead.bin font.bin : $(FONTPATH)font.txt Makefile $(MAKEFONT) $(FONTPATH)font.txt font.bin font.obj : font.bin Makefile $(BIN2OBJ) font.bin font.obj _font main.bim : $(OBJS_MAIN) Makefile $(OBJ2BIM) @$(RULEFILE) out:main.bim stack:3136k map:main.map \ $(OBJS_MAIN) # 3MB+64KB=3136KB main.hrb : main.bim Makefile $(BIM2HRB) main.bim main.hrb 0 system.sys : asmhead.bin main.hrb Makefile copy /B asmhead.bin+main.hrb system.sys
system.img : ipl10.bin system.sys Makefile $(EDIMG) imgin:../z_tools/fdimg0at.tek \ wbinimg src:ipl10.bin len:512 from:0 to:0 \ copy from:system.sys to:@: \ imgout:system.img # 其他指令 build : $(MAKE) system.img run : $(MAKE) build $(COPY) system.img ..\z_tools\qemu\fdimage0.bin $(MAKE) -C ../z_tools/qemu # $(MAKE) src_only clean : -$(DEL) *.bin -$(DEL) *.gas -$(DEL) *.obj -$(DEL) graphic.asm -$(DEL) main.asm -$(DEL) main.map -$(DEL) main.bim -$(DEL) main.hrb -$(DEL) system.sys src_only : $(MAKE) clean -$(DEL) system.img
绿色的地方我教你,每次添加一个c文件就要写xxx.obj
要做文章的文件就是上面四个,其他的直接到github上面copy
编译运行:
cd class01
..\z_tools\make.exe run
实体机运行(见目录0x03)
自制操作系统合集
原文地址:https://www.cnblogs.com/Frank-dev-blog/category/2249116.html
项目github地址rick521/My-OS (github.com)给我点颗star