zl程序教程

您现在的位置是:首页 >  其他

当前栏目

0x02_我的第一个操作系统My-OS

2023-04-18 15:19:52 时间

 

首先配置环境见目录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_toolsqemufdimage0.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_toolsmake.exe run 

 

 
实体机运行(见目录0x03)

自制操作系统合集

原文地址:https://www.cnblogs.com/Frank-dev-blog/category/2249116.html

项目github地址rick521/My-OS (github.com)给我点颗star