自制OS记录
《三十天自制操作系统》学习记录
说明:
为了满足我自制OS的小小愿望,慕名买来了《三十天自制操作系统》书籍进行学习,虽然我预料到了估计是一路抄代码。但是学一学也无坏处,如果能点亮几个技能点是再好不过。
本书毕竟是十几年前的老书,操作系统仍然停留在32位,所以与现在主流操作系统差别很大,是极为简单的操作系统。纯属学习以及娱乐打发时间
本人大一,处于学习阶段,有误欢迎私信指正
前三天知识汇总
启动区核心汇编代码
CYLS EQU 10 ; 常量
ORG 0x7c00 ; 指明程序装载地址
; 一下为标准FAT12格式软盘专用代码
JMP entry
DB 0x90
DB "HARIBOTE" ; 启动区名称(8字节)
DW 512 ; 扇区大小(必须为512字节)
DB 1 ; 簇大小(必须为1个扇区)
DW 1 ; FAT起始位置(一般从第一个扇区开始)
DB 2 ; FAT个数(必须2)
DW 224 ; 根目录大小(一般为224项)
DW 2880 ; 该磁盘大小(必须2880扇区)
DB 0xf0 ; 磁盘种类(必须0xf0)
DW 9 ; FAT长度(必须是9扇区)
DW 18 ; 1个磁道扇区个数(必须18)
DW 2 ; 磁头数(必须是2)
DD 0 ; 不使用分区必须是0
DD 2880 ; 重写一次磁盘大小
DB 0,0,0x29 ;
DD 0xffffffff ;
DB "HARIBOTEOS " ; 磁盘名称(11字节)
DB "FAT12 " ; 磁盘格式名称(8字节)
RESB 18 ; 空出18字节
; 程序主体
entry:
MOV AX,0 ; 初始化寄存器
MOV SS,AX
MOV SP,0x7c00
MOV DS,AX
; 读磁盘
MOV AX,0x0820
MOV ES,AX
MOV CH,0 ; 柱面0
MOV DH,0 ; 磁头0
MOV CL,2 ; 扇区2
readloop:
MOV SI,0 ; 记录失败次数的寄存器
retry:
MOV AH,0x02 ; AH=0x02 : 读盘
MOV AL,1 ; 1个扇区
MOV BX,0
MOV DL,0x00 ; A驱动器
INT 0x13 ; 调用磁盘BIOS
JNC next ; 没出错跳转fin
ADD SI,1 ; SI+1
CMP SI,5 ; SI与5比较
JAE error ; SI >= 5 跳转error
MOV AH,0x00
MOV DL,0x00 ; A驱动器
INT 0x13 ; 重置驱动器
JMP retry
next:
MOV AX,ES ; 内存地址后移0x200
ADD AX,0x0020
MOV ES,AX ; 没有ADD ES,0x020指令,绕个弯
ADD CL,1 ; CL+1
CMP CL,18 ; CL与18比较
JBE readloop ; CL <= 18 跳转readloop
MOV CL,1
ADD DH,1
CMP DH,2
JB readloop ; DH < 2 跳转readloop
MOV DH,0
ADD CH,1
CMP CH,CYLS
JB readloop ; CH < CYLS 跳转readloop
;
MOV [0x0ff0],CH ;
JMP 0xc200 ; 跳转至操作系统程序
error:
MOV SI,msg
putloop:
MOV AL,[SI]
ADD SI,1 ; SI+1
CMP AL,0
JE fin
MOV AH,0x0e ; 显示文字
MOV BX,15 ; 指定字符颜色
INT 0x10 ; 调用显卡BIOS
JMP putloop
fin:
HLT ; 停止CPU,等待指令
JMP fin ; 死循环
msg:
DB 0x0a, 0x0a ; 2个换行
DB "load error"
DB 0x0a ; 换行
DB 0
RESB 0x7dfe-$ ; 填写0x00到0x7dfe $符号为当前和行现在字节数
DB 0x55, 0xaa
寄存器
AX:累加寄存器
CX:计数寄存器
DX:数据寄存器
BX:基址寄存器
SP:栈指针寄存器
BP:基址指针寄存器
SI:源变址寄存器
DI:目的变址寄存器
以上为均为16位寄存器;
AL:累加寄存器低位
CL:计数寄存器低位
DL:数据寄存器低位
BL:基址寄存器低位
AH:累加寄存器高位
CH,DH,BH…同上
段寄存器:
ES:附加段寄存器
CS:代码段寄存器
SS:栈段寄存器
DS:数据段寄存器
FS、GS
相关指令:
DB:写入一个字节
RESB(reserve byte):空出多少字节
DW以及DD:写入字节
JMP:跳转(类似C语言goto)
MOV:赋值语句
ADD:加法
CMP:比较
JE:条件跳转,相等跳转
HLT:CPU停止
BIOS:
存在于电脑主板ROM单元,提供操作系统开发一系列工具
其中INT指令则为调用BIOS里面的函数
MakeFile:
批处理,可在控制台输入字符执行其中的语句