zoukankan      html  css  js  c++  java
  • 《30天自制操作系统》03_day_学习笔记

    harib00a:
      添加的部分从P46开始,制作IPL准备开始从磁盘装载程序了
      笔者讲解了软盘的驱动的构造,以及汇编语言读取软盘的方法

            MOV        AX,0x0820
            MOV        ES,AX
            MOV        CH,0            ; 柱面0
            MOV        DH,0            ; 磁头0
            MOV        CL,2            ; 扇区2
    
            MOV        AH,0x02         ; AH=0x02 : 读盘
            MOV        AL,1            ; 1个扇区
            MOV        BX,0
            MOV        DL,0x00         ; A驱动器
            INT        0x13            ; 调用磁盘BIOS

    harib00b:
      这一部的目的主要是试错
      P51 软盘是很不可靠的存储设备,有时候会发生不能读取数据的情况
      改良后的程序就是这一部分
      在重新读盘之前添加了系统复位的功能,复位软盘的状态再读一次

    ; 读磁盘
            MOV        AX,0x0820
            MOV        ES,AX
            MOV        CH,0            ; 柱面0
            MOV        DH,0            ; 磁头0
            MOV        CL,2            ; 扇区2
    
            MOV        SI,0            ; 记录失败次数的寄存器
    retry:
            MOV        AH,0x02         ; AH=0x02 : 读入磁盘
            MOV        AL,1            ; 1个扇区
            MOV        BX,0
            MOV        DL,0x00         ; A驱动器
            INT        0x13            ; 调用磁盘BIOS
            JNC        fin             ; 没有出错就跳到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

    harib00c:
      P51 读到18扇区

    ; 读磁盘
            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            ; 没有出错时转到next
            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

    harib00d:
      P53   读入10个柱面的内容

            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            ; 没有错误跳转NEXT
            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

    harib00e:
      P54 到此已经完成了启动区的制作
      下面编写一个小的程序,只让它 HLT
      这里要做的事就是将文件hanbote.sys文件保存在镜像haribote.img中
      执行之后打开hatibote.img 在0000:2600附近保存着文件名hanbote.sys
                    在0000:4200附近保存着文件hanbote.sys中的内容
      总结:一般向软盘(镜像)b保存文件时 文件名写在0000:2600;文件内容写在0000:4200

    harib00f:
      P56 从启动区执行操作系统
      在上一部的基础上(已经将启动文件写入了镜像)
      用ORG 0xc200加上JMP跳转到这里来从启动区执行操作系统
    harib00g:
      P56 检验haribote.sys的执行情况(让它表现出来)
      这里设置了显卡的模式,课本中讲解了一点关于显卡的原理
      该HLT执行的内容就是通过修改显卡,显示全黑。检测完毕

    ; haribote.nas
    ; TAB=4
            ORG        0xc200            ; 该程序将要装载到镜像中  的地址
    
            MOV        AL,0x13            ; VGA显卡;320x200x8bit彩色
            MOV        AH,0x00
            INT        0x10
    fin:
            HLT
            JMP        fin

    harib00h:
      P58 接下来准备用32位的模式进行开发
      注意:BIOS是用16位的机器语言写的,用32位模式就不能调用BIOS函数
      如果想要使用BIOS来做,就必须全部都放在开头先做好
      该次实验的目:设置画面的模式,然后把画面模式保存在内存中
      为了支持不同的画面模式,需要把现在设置的信息保存起来以供以后使用

    ;haribote.nas
    ; haribote-os
    ; TAB=4
    ; 有关BOOT_INFO
    CYLS    EQU        0x0ff0             ; 设定启动区
    LEDS    EQU        0x0ff1
    VMODE    EQU        0x0ff2            ; 关于颜色数目的信息,颜色的位数
    SCRNX    EQU        0x0ff4            ; 分辨率X
    SCRNY    EQU        0x0ff6            ; 分辨率Y
    VRAM    EQU        0x0ff8             ; 图像缓冲区开始的地址
    
            ORG        0xc200             ; 这个程序要被装载的地方
    
            MOV        AL,0x13            ; VGA显卡,320x200x8bit彩色
            MOV        AH,0x00
            INT        0x10
            MOV        BYTE [VMODE],8     ; 记录画面模式
            MOV        WORD [SCRNX],320
            MOV        WORD [SCRNY],200
            MOV        DWORD [VRAM],0x000a0000
    
    ; 用BIOS取得键盘上各种LED指示灯的状态
            MOV        AH,0x02
            INT        0x16              ; keyboard BIOS
            MOV        [LEDS],AL 
    
    fin:
            HLT
            JMP        fin

    harib00i:
      P59 开始导入C语言,切换到32位的模式,
      这一部分讲解了编写的C程序bootpack.c是怎样一步一步的被编译成机器语言的P60

    //bootpack.c
    void HariMain(void)
    {
    fin:
        /* 将要编写的HLT */
        goto fin;
    }

    harib00j:
      p62 分别用汇编语言和C语言编写HLT函数。

    ; naskfunc.nas
    ; TAB=4
    [FORMAT "WCOFF"]                 ; 制作目标文件的模式    
    [BITS 32]                        ; 制作32位模式的机械语言
    ; 制作目标文件的信息
    [FILE "naskfunc.nas"]            ; 源文件名信息
    
            GLOBAL    _io_hlt        ; 程序中包含的函数名
    ; 以下是实际的函数
    
    [SECTION .text]                  ; 目标文件中写了这些之后再写程序
    
    _io_hlt:                         ; void io_hlt(void);
            HLT
            RET
    //bootpack.c
    /* 告诉C编译器,有一个函数在别的文件里 */
    void io_hlt(void);
    /* 是函数声明,不用{ }用 ; 表明:函数在别的文件中,需要系统自己去查找 */
    void HariMain(void)
    {
    fin:
        io_hlt(); /* 执行naskfunc.nas里的_io_hlt */
        goto fin;
    }
  • 相关阅读:
    [VC++入门]C++中常用的运算符及微软自定义类型
    搜索引擎蜘蛛爬虫原理
    Enterprise Library 5.0
    Installshield 12 中文系列教程之 定义安装必要条件
    installshield脚本
    c# 事物处理
    InStallShield网络资源参考
    Could not execute query against OLE DB provider 'OraOLEDB.Oracle'
    frameset小结
    最痛心的距离
  • 原文地址:https://www.cnblogs.com/pengfeiz/p/5781032.html
Copyright © 2011-2022 走看看