首页 > 代码库 > 30天自制操作系统(第三天)

30天自制操作系统(第三天)

    磁头是一个针状的磁性设备,既可以从软盘的正面接触磁盘,也可以从软盘背面接触磁盘。与光盘不同,软盘磁盘是两面都能记录数据的。 因此我们有正面和反面两个磁头,分别是磁头1号和磁头0号。     指定了柱面和磁头后,在磁盘的这个圆环上,还能记录很多位信息,按照整个圆环位单位读写的话,实在有点多,所以把圆环均等分成几 份,软盘为18份,每一份称为一个扇区。     1张软盘有80个柱面,2个磁头,18个扇区,且一个扇区512字节     MOV CX,[1234]   实质是   MOV CX,[DS:1234]  默认段寄存器是DS,所以DS在使用前必须预先指定为0,否则地址的值要加上这个数的16倍 就会读写到其他的地方,引起混乱。

    保存到磁盘映像里:     使用make install指令,将磁盘映像写入磁盘     在windows里打开那个磁盘,把haribote.sys保存到磁盘上     使用工具将磁盘备份为磁盘映像

    一般向一个空软盘保存文件时:     1.文件名会写在0x002600     2.文件的内容会写在0x004200以后的地方

   在设置画面信息后,还要将画面信息保存在内存里面,

   映像文件,根据我的理解,即是不是本来的东西,只是一种代替形式

    HLT是I/O指令,MOV是转送指令,ADD是演算指令

bootpack.c

/*告诉C编译器,有一个函数在别的文件里面*/void io_hlt(void);/*函数申明不用{},而用;,函数在别的函数里*/void HariMain(void){    fin:    io_hlt();    /*这里想写上HLT,但C语言中不用HLT!*/    goto fin;}


naskfunc.nas

;naskfunc;TAB=4[FORMAT "WCOFF"]  ;制作目标文件的模式[BITS 32]          ;制作32位模式用的机械语言;制作目标文件的信息[FILE "naskfunc.nas"]   ;源文件名信息GLOBAL    _io_hlt        ;程序中包含的函数名;以下是实际函数[SECTION .text]     ;目标文件中写了这些之后在写程序_io_hlt:    ; void io_hlt(void);        HLT        RET

 

ipl10.nas

;hello-os;TAB=4CYLS    EQU        10    ORG     0X7C00          ;指明程序的装载地址  ;以下这段是标准FAT12格式软盘专用代码     JMP     entry    DB        0x90    DB        "HARIBOTE"      ;启动扇区的名称可以使任意的字符串    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          ;扇区2readloop:    MOV        SI,0         ;记录失败次数的寄存器retry:    MOV        AH,0x02       ;AH=0x02  :  读盘    MOV     AL,1          ;一个扇区    MOV     BX,0    MOV     DL,0x00        ;A驱动器    INT     0x13           ;调用磁盘BIOS    JNC     next            ;没出错的话就跳转到next    ADD        SI,1              CMP     SI,5                JAE        error           ;SI>=5跳转到error    MOV     AH,0x00    MOV     DL,0x00         ;A驱动器    INT     0x13            ;重置驱动器    JMP     retrynext:    MOV     AX,ES           ;把内存地址后移0x200    ADD        AX,0x0020    MOV     ES,AX            ;因为没有ADD ES,0x200指令    ADD     CL,1             ;往CL里面加1    CMP     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,msgputloop:    MOV     AL,[SI]         ADD     SI,1          ;给SI加1    CMP        AL,0    JE        fin    MOV        AH,0x0e     ;显示一个文字    MOV      BX,15       ;指定字符颜色    INT      0x10        ;调用显卡BIOS    JMP      putloopfin:    HLT                 ;让CPU停止循环,等待指令    JMP      fin        ;无限循环msg:    DB        0X0a,0X0a   ;换行两次    DB        "load error"    DB        0x0a    DB        0    RESB    0x7dfe-$          ;填写0x00,直到0x001fe    DB        0x55, 0xaa

 

30天自制操作系统(第三天)