zoukankan      html  css  js  c++  java
  • 02 Hello, DTOS!一个最简单的引导程序

    参考

    https://www.cnblogs.com/wanmeishenghuo/tag/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/

    https://blog.51cto.com/13475106/category6.html

    及狄泰软件相关课程

    Q:主引导程序是软件还是固件?如果是软件,那么由谁开发?如何开发
    A.主引导程序
    1.一段存储在主引导区中的有效代码
    2.并不固化于硬件,属于操作系统代码的一部分
    3.启动操作系统内核的桥梁,由汇编程序写出
    4.代码总量不能超过512个字节(包含0x55aa)
    我们可以由图可以看出BIOS的入口于C/C++的入口的对比
    操作系统-Hello,DTOS!的创建
    实验-编写一个主引导程序(汇编语言),可独立运行于x86架构的主机(无操作系统),运行后在屏幕上打印"Hello,DTOS!"
    A.实现思路
    1.将关键寄存器的值设为0(mov ax,0)
    2.定义需要打印的数据(db "Hello,D.T.OS!")
    3.打印预定义好的字符数据(int 0x10)
    在这里需要知道的是
    mov:赋值操作,将右操作数赋值给左操作数
    操作系统-Hello,DTOS!的创建
    int:触发中断
    操作系统-Hello,DTOS!的创建
    hlt:停止运行,CPU进入暂停状态,不执行任何操作
    操作系统-Hello,DTOS!的创建
    汇编中地址的访问 方式:段地址:段内偏移地址
    操作系统-Hello,DTOS!的创建
    标签
    操作系统-Hello,DTOS!的创建
    操作系统-Hello,DTOS!的创建
    B.中断调用VS函数调用
    操作系统-Hello,DTOS!的创建
    实验解决方案的设计
    1.将汇编源码编译为二进制机器码(nasm)

    操作系统-Hello,DTOS!的创建创建虚拟网盘
    2.创建虚拟盘(bximage)
    操作系统-Hello,DTOS!的创建设置大小
    3.将二进制代码写入虚拟盘起始位置(dd)
    操作系统-Hello,DTOS!的创建if为输入 of为输出 bs为大小 连续写入没有间隔
    4.在虚拟机将虚拟盘作为启动盘执行(vmware)
    B.实现过程如下
    a.编写汇编语言

    org 0x7c00
     
    start:
        mov ax, cs
        mov ss, ax
        mov ds, ax
        mov es, ax
         
        mov si, msg
         
    print:
        mov al, [si]
        add si, 1
        cmp al, 0x00
        je last
        mov ah, 0x0e
        mov bx, 0x0f
        int 0x10
        jmp print
         
    last:
        hlt
        jmp last
         
    msg:
        db 0x0a, 0x0a
        db "Hello, DTOS!"
        db 0x0a, 0x0a
        times 510-($-$$) db 0x00
        db 0x55, 0xaa
    

    b.在Linux下将其编译成二进制
    操作系统-Hello,DTOS!的创建
     

    1-2.通过nasm命令进行二进制编译,如果没有安装nasm通过提示进行安装
    3-4.通过bximage命令进行网盘设置,如果没有安装bximage通过提示进行安装
    5-8.分别设置虚拟为虚拟网盘,然后将其设置为标准大小1.44兆,同时将其命名为a.img
    9.通过dd命令将二进制代码写入虚拟盘起始位置,不间断的写入大小为512
    生成的a.img如图所示

    至此,这张软盘的前512字节就写入了主引导记录,因此,它就成为了一张启动盘了。

    下面使用VmWare创建一个物理机器,详细过程不在贴出,创建好的机器如下,这是一个未安装任何操作系统的空的机器。

     

    接下来,启动这台机器,效果如下:

     

    可见,主引导程序成功被加载并运行了。

    小插曲:

    主引导程序部分是16位操作,因此,我们需要一个16位的汇编器,现存的汇编器大概有gas汇编器和nasm汇编器,nasm是16位的,用来编译英特尔格式汇编代码,gas是32位的用来编译AT&T格式汇编的,也是唯一支持AT&T格式的汇编器,因此,我们不能选择AT&T格式进行实验。linux的boot程序使用的是as86汇编器进行编译的,这个汇编器是16位的,但是资料比较少。as86是编写Minix操作系统的那个教授编写 的,这个汇编器支持的格式既不是标准的AT&T格式也不是Intel格式,只是和Intel格式比较接近。因此,我们选择了nasm汇编器。

    小结
    1.主引导程序的代码量不能超过512字节
    2.主引导程序需要使用汇编语言开发
    3.主引导程序中可以通过BIOS中断使用硬件功能
    4.主引导程序运行于实模式(地址都是实际的物理地址)

  • 相关阅读:
    Spring 框架的概述以及Spring中基于XML的IOC配置
    SpringBoot(1)
    C/C++经典程序之打印三角形
    C++构造函数详解(复制构造函数)
    利用函数模板计算并返回数组d 中size个元素的平方和
    C++模板之typename和class关键字的区别
    构造函数与成员函数的区别?
    为什么多数穷人很难逆袭成功
    用递归方式求解这个问题:一只母兔从四岁开始每年生一只小母兔,按此规律,第n年有多少只母兔?
    编写一个函数 reverseDigit(int num).该函数读入一个整数,然后将这个整数的每个位上的数字逆序输出。
  • 原文地址:https://www.cnblogs.com/lh03061238/p/13845196.html
Copyright © 2011-2022 走看看