zoukankan      html  css  js  c++  java
  • 第2课

    第2课 - Hello, DTOS!

    1. 主引导程序

      主引导程序是软件还是固件?如果是软件,那么由谁开发?如何开发?

      (1)上一节说到了固件和软件的区别。由于主引导程序没有在出厂前固化到硬件中,因此它是软件,由开发操作系统的程序员开发,隶属于操作系统代码的一部分

      (2)从物理意义上看,主引导程序是存储在主引导区(MBR)中的一段有效代码

      (3)从功能上看,主引导程序是启动操作系统内核的桥梁,由汇编程序写成

      (4)主引导程序的代码总量不能超过512个字节(包含 0x55aa

    2. 主引导程序的开发

      

    3. 课程实验

      (1)编写一个主引导程序(汇编语言)

      (2)可独立运行于 x86 架构的主机(无操作系统,直接在硬件上运行)

      (3)运行后在屏幕上打印 "Hello, DTOS!"

    4. 实现思路

      (1)将关键寄存器的值设置为 0 mov ax, 0)  

      (2)定义需要打印的数据db "Hello, D.T.OS!"

      (3)打印预定义好的字符数据int 0x10

    5. 汇编预备知识

      (1)mov赋值操作,将右操作数赋值给左操作数

        • mov ax, 0      ; 将 0 赋值给 ax 寄存器

      (2)int:用于触发中断

        • int  0x10        ; 触发 0x10 中断,对屏幕进行操作

      (3)hlt:停止运行,CPU 进入暂停状态,不执行任何操作

        • hlt                  ; 使程序进入睡眠状态

      (4)汇编中地址的访问方式:段地址:段内偏移地址

        • mov  byte [0xb800: 0x01], 0x07     ; 0xb800:0x01 → 0xb8000 + 0x01  

      (5)标签

        • 用于标识后续指令的地址     可等同为 C 语言中的标签,goto 语句的标签

      (6)$ vs $$

        • $ 表示当前指令行地址 $$ 表示当前汇编段起始地址

     6. 中断调用 VS 函数调用

      

    7. 编程实验

    第一个引导加载程序boot.asm

     1 org 0x7c00  ; 程序的运行地址
     2 
     3 start:
     4     mov ax, cs
     5     mov ss, ax
     6     mov ds, ax
     7     mov es, ax
     8     
     9     mov si, msg
    10     
    11 print:
    12     mov al, [si]   ; 类似于C中的解引用操作
    13     add si, 1
    14     cmp al, 0x00
    15     je last           ; jump if equal
    16     mov ah, 0x0e   ; 设置打印参数
    17     mov bx, 0x0f
    18     int 0x10       ; 使用BIOS提供的10号中断
    19     jmp print
    20     
    21 last:
    22     hlt
    23     jmp last 
    24     
    25 msg:
    26     db 0x0a, 0x0a    ; db ==> define byte
    27     db "Hello, DTOS!"
    28     db 0x0a, 0x0a
    29     times 510-($-$$) db 0x00    ; 填充以满足512字节,使用510是下面一条命令占用两个字节
    30     db 0x55, 0xaa
    31     
    boot.asm

    如何验证编写的主引导程序是否正确?为此,设计了以下解决方案

    解决方案设计:(以下操作均在 linux 下完成)

      (1)将汇编源码编译为二进制机器码(nasm命令

          nasm  boot.asm  -o  boot.bin 

      (2)创建虚拟盘(bximage命令

          bximage  a.img  -q  -fd  -size=1.44  

            q:无需任何交互,直接创建出 bximage

            fd:floppy disk   创建的是虚拟软盘

            size:创建的虚拟软盘的大小为1.44

      (3)将二进制代码写入虚拟盘起始位置(dd命令

          dd  if=boot.bin  of=a.img  bs=512  count=1  conv=notrunc

              if:input file         输入的文件

              of:output file     输出的文件

              bs:bytes           写入时每个单元的大小

                count:               写入单元的个数

              conv:notrunc    连续的写入,不能有间隔

      (4)在虚拟机中将虚拟盘作为启动盘执行(vmware虚拟机

        • 首先使用 vmware 创建一个虚拟机,注意下图中几步的选择

                 

        • 启动我们刚刚安装的操作系统,会提示找不到操作系统,因为存储介质中没有主引导区 MBR

          

        • 下面加载我们前面制作好的 a.img 文件到刚刚创建的虚拟机中的软盘中,然后启动虚拟机,出现 "Hello, DTOS!",大功告成!!!

          

          

    8. 小结

      (1)主引导程序的代码量不能超过 512 字节

      (2)主引导程序需要使用汇编语言开发

      (3)主引导程序中可以通过BIOS中断使用硬件功能

      (4)主引导程序运行于实模式(地址都是实际的物理地址)

    注:本文整理于《狄泰12月提升计划》课程内容

    狄泰QQ群:199546072

    本人QQ号:502218614

  • 相关阅读:
    package相关知识
    【算法设计与分析】5个数7次比较排序的算法
    Android下的应用编程——用HTTP协议实现文件上传功能
    5个数通过7次比较排序的方法
    数据库范式(1NF、2NF、3NF、BCNF)
    HttpDownloader2011年09月20日 写好用于下载的类 并且封装好
    POJ 1692 DP
    POJ 1682 多重DP
    TYVJ 1744 逆序对数(加强版)
    POJ 2151 概率DP
  • 原文地址:https://www.cnblogs.com/shiwenjie/p/8811333.html
Copyright © 2011-2022 走看看