《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


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 吃中药吃大蒜了怎么办 呕吐蛋黄哥干了怎么办 鹦鹉的脚受伤了怎么办 内痔疮疼得厉害怎么办 孕妇用了痔疮膏怎么办 痔疮犯了特别疼怎么办 有痔疮肛门很痛怎么办 这几天痔疮犯了怎么办 孕初期肛裂出血怎么办 胃疼怎么办怎么缓解胃 脚踝崴了肿了怎么办 脚扭了脚背肿了怎么办 儿童脚扭伤肿了怎么办 脚关节扭伤肿了怎么办 小孩脚扭伤肿了怎么办 抱小孩腰扭伤了怎么办 跳舞把腰拉伤了怎么办 脚不小心扭伤了怎么办 娱乐之太帅了怎么办txt 走路走多了脚痛怎么办 胃疼怎么办简单按摩法 经常胃疼的厉害怎么办 半夜胃疼的厉害怎么办 吃消炎药伤胃了怎么办 吃药伤胃了胃疼怎么办 宝宝吃药伤胃了怎么办 胃胀胃痛怎么办快速解决方法 半夜2点3点胃疼怎么办 晚上吃多了胃疼怎么办 骨折打石膏后痒怎么办 脚脖子崴了肿了怎么办 喝酒喝的吐血了怎么办 感冒后咳嗽有痰怎么办 嗓子里老是有痰怎么办 物业把水停了怎么办 机洗衬衫缩水了怎么办 羊绒大衣洗缩水了怎么办 棉质衣服缩水了怎么办 衣服洗了变小了怎么办 毛衣洗后缩水了怎么办 鼻子又大又塌怎么办