《30天自制操作系统》读书笔记Day3
来源:互联网 发布:数学编程软件cdf 编辑:程序博客网 时间:2024/05/29 06:57
前几天开始看《30天》,觉得Day1和Day2比较简单就没有写笔记,今天开始写。前两天的内容可以到github上查看:https://github.com/scusjs/MyOS
这里将这个操作系统命名为dogged吧,“像狗一样”哈哈,其实这单词意思也不错,也是我现在做其他项目的团队名,不错吧
这里向前面的汇编程序ipl.nas中添加一些代码来让IPL(Initial Program Loader)装载下一个512字节的内容:
; hello-os; TAB=4ORG0x7c00; 指明装载地址; 以下标注FAT12格式软盘JMPentryDB0x90DB"DOGGED ";启动区的名称 ,8字节DW512;每个扇区大小,必须是512字节DB1;簇的大小DW1;FAT的起始位置DB2;FAT的个数DW224;根目录大小DW2880;该磁盘大小DB0xf0;磁盘种类DW9;FAT长度DW18;1个磁道有几个扇区DW2;磁头数,必须为2DD0;不使用分区DD2880;重写一次磁盘大小DB0,0,0x29DD0xffffffff;卷标号码DB"HELLO-OS ";磁盘名称DB"FAT12 ";磁盘格式名称RESB18;空出18个字节,并置为0; 程序核心entry:; 标签MOVAX,0; 初始化寄存器 注,AX累加寄存器BX基址寄存器CX计数寄存器DX数据寄存器MOVSS,AX ; SS栈段寄存器MOVSP,0x7c00; SP栈指针寄存器MOVDS,AX ; DS数据段寄存器; 读盘MOVAX,0x0820 ; 装载到内存0x0820,因为0x0800以后内存为空且0x0800-0x08ff已经被ipl占用MOVES,AXMOVCH,0; 柱面0MOVDH,0; 磁头0MOVCL,2; 扇区2MOVAH,0x02; AH=0x02 : 读盘MOVAL,1; 1个扇区MOVBX,0MOVDL,0x00; A驱动器INT0x13; 调用磁盘BIOSJCerror; 如果出错则显示错误;JNC successfin:HLT; 停止CPU,等待指令JMPfin; 无限循环error:MOVSI,msg;success:;MOVSI,msgputloop:MOVAL,[SI]ADDSI,1CMPAL,0 ; 比较AL与0,进而判断是否执行JE。相等则执行JEJEfin ; 如果AL==0,则跳转到fin,否则跳过这个指令 注:fin为结束标号MOVAH,0x0e; 显示一个文字MOVBX,15; 指定字符颜色INT0x10; 调用显卡BOIS 注:INT中断,用来调用BIOS函数JMPputloop; 跳转;以下为输出信息msg:DB0x0a,0x0a; 换行DB "Load error"DB 0x0aDB"BY Shen Jinsheng"DB0RESB0x7dfe-$DB0x55, 0xaa
为了防止读取错误,再加上限制,允许5次读取尝试,并且尝试读到18扇区,读入10个柱面,即完成启动区的制作,得到如下代码:
; hello-os; TAB=4CYLSEQU10; 定义CYLS=10ORG0x7c00; 指明装载地址; 以下标注FAT12格式软盘JMPentryDB0x90DB"DOGGED ";启动区的名称 ,8字节DW512;每个扇区大小,必须是512字节DB1;簇的大小DW1;FAT的起始位置DB2;FAT的个数DW224;根目录大小DW2880;该磁盘大小DB0xf0;磁盘种类DW9;FAT长度DW18;1个磁道有几个扇区DW2;磁头数,必须为2DD0;不使用分区DD2880;重写一次磁盘大小DB0,0,0x29DD0xffffffff;卷标号码DB"HELLO-OS ";磁盘名称DB"FAT12 ";磁盘格式名称RESB18;空出18个字节,并置为0; 程序核心entry:; 标签MOVAX,0; 初始化寄存器 注,AX累加寄存器BX基址寄存器CX计数寄存器DX数据寄存器MOVSS,AX ; SS栈段寄存器MOVSP,0x7c00; SP栈指针寄存器MOVDS,AX ; DS数据段寄存器; 读盘MOVAX,0x0820 ; 装载到内存0x0820,因为0x0800以后内存为空且0x0800-0x08ff已经被ipl占用MOVES,AXMOVCH,0; 柱面0MOVDH,0; 磁头0MOVCL,2; 扇区2readloop:MOV SI,0 ; SI寄存器记录失败次数retry:MOVAH,0x02; AH=0x02 : 读盘MOVAL,1; 1个扇区MOVBX,0MOVDL,0x00; A驱动器INT0x13; 调用磁盘BIOSJNC next ; 没有错误则跳转到nextADD SI,1 ; SI加一CMP SI,5 ; 比较SI和5,大于等于5则跳转到errorJAE error MOVAH,0x00MOV DL,0x00 ; A驱动器INT 0x13 ; 重置驱动JMP retrynext:MOVAX,EX; 把内存地址后移0x200ADDAX,0x0020MOVES,AXADD CL,1 ; CL加一,进行比较CMPCL,18JBEreadloopMOVCL,1ADDDH,1CMPDH,2 ; DH小于2则跳转JB readloopMOVDH,0ADDCH,1CMPCH,CYLSJB readlooperror:MOVSI,msg;success:;MOVSI,msgfin:HLT; 停止CPU,等待指令JMPfin; 无限循环putloop:MOVAL,[SI]ADDSI,1CMPAL,0 ; 比较AL与0,进而判断是否执行JE。相等则执行JEJEfin ; 如果AL==0,则跳转到fin,否则跳过这个指令 注:fin为结束标号MOVAH,0x0e; 显示一个文字MOVBX,15; 指定字符颜色INT0x10; 调用显卡BOIS 注:INT中断,用来调用BIOS函数JMPputloop; 跳转;以下为输出信息msg:DB0x0a,0x0a; 换行DB "Load error"DB 0x0aDB"BY Shen Jinsheng"DB0RESB0x7dfe-$DB0x55, 0xaa
这样加载时,就把软盘最初的10*2*18*512=184320Byte=180KB加载到了内存。
接下来编写“操作系统”dogged.nas:
; Dogged-os; TAB=4ORG0xc200;程序装载在内存中位置MOVAL,0x13;VGA显卡,320*200*8位色MOVAH,0x00INT0x10fin:HLTJMPfin
在ipl.nas中添加:
MOV[0x0ff0],CH; IPL装载地址告诉dogged.sysJMP0xc200
注:因为要实现磁盘镜像操作,需要更改makefile文件,其次因ipl读入10个柱面,故将其更名为ipl10.nas
使用make img命令制作镜像文件
make run查看,得到全黑界面,说明成功
接下来,需要从BIOS里获取信息,修改dogged.nas文件:
; Dogged-os; TAB=4; 有关BOOT_INFOCYLSEQU0x0ff0;设定启动区LEDSEQU0x0ff1;键盘LED指示灯状态VMODEEQU0x0ff2;颜色的位数SCRNXEQU0x0ff4;分辨率的XSCRNYEQU0x0ff6;分辨率的YVRAMEQU0x0ff8;图像缓冲区的开始地址ORG0xc200;程序装载在内存中位置MOVAL,0x13;VGA显卡,320*200*8位色MOVAH,0x00INT0x10MOVBYTE [VMODE],8 ;记录画面模式MOVWORD [SCRNX],320MOV WORD [SCRNY],200MOV DWORD [VRAM],0x000a0000;获取键盘上各种LED指示灯的状态MOVAH,0x02INT0x16;键盘BIOSMOV [LEDS],ALfin:HLTJMPfin
接下来切换到32为模式导入C语言。
暂时略掉导入详细过程,将dogged更名为asmhead.nas
添加文件bootpack.c
void HariMain(void){fin:goto fin;}
*.c变成机器码步骤:
cc1.exe gas2nask.exe nask.exe obi2bim bim2hrb
*.c------->*.gas------------>*.nas--------->*.obj------->*.bim-------->*.hrb
然后copy命令将*.bin与*.hrb结合生成haribote.sys
结果出现黑屏表示正常
为了让程序执行halt省电,加入naskfunc.nas并在bootpack.c中调用即可
具体代码移步:https://github.com/scusjs/MyOS
- 《30天自制操作系统》读书笔记Day3
- 30天自制操作系统day3
- 《30天自制操作系统》 day3 小结
- 30天自制操作系统day3-HLT实现
- [读书笔记]30 天自制操作系统 day3 进入32bit模式并导入C语言
- 读书笔记《30天自制操作系统》day01
- 读书笔记《30天自制操作系统》day02
- 读书笔记《30天自制操作系统》day03
- 读书笔记《30天自制操作系统》day04
- 读书笔记《30天自制操作系统》day05
- 读书笔记《30天自制操作系统》day06
- 读书笔记《30天自制操作系统》day07
- 读书笔记《30天自制操作系统》day08
- 读书笔记《30天自制操作系统》day09
- 读书笔记《30天自制操作系统》day10
- 读书笔记《30天自制操作系统》day11
- 读书笔记《30天自制操作系统》day01
- 读书笔记《30天自制操作系统》day02
- uva10056 - What is the Probability ?(概率是多少)
- OO设计原则(不断地艰苦实践,才能成功)
- 马云:年轻人必须思考的4大问题
- java学习笔记11--Annotation
- 悼念512汶川大地震遇难同胞——选拔志愿者+博弈
- 《30天自制操作系统》读书笔记Day3
- acm 2040
- 高精度乘法
- java多线程详解
- CSS Reset样式重置
- VC动态轨迹画线
- oracle 的数据库、方案、用户
- 初识PE
- 树上两点的最近公共祖先-Tarjan_LCA离线算法