第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

 org 0x7c00  ; 程序的运行地址

 start:
mov ax, cs
mov ss, ax
mov ds, ax
mov es, ax mov si, msg print:
mov al, [si] ; 类似于C中的解引用操作
add si,
cmp al, 0x00
je last ; jump if equal
mov ah, 0x0e ; 设置打印参数
mov bx, 0x0f
int 0x10 ; 使用BIOS提供的10号中断
jmp print last:
hlt
jmp last msg:
db 0x0a, 0x0a ; db ==> define byte
db "Hello, DTOS!"
db 0x0a, 0x0a
times -($-$$) db 0x00 ; 填充以满足512字节,使用510是下面一条命令占用两个字节
db 0x55, 0xaa

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

第2课 - Hello, DTOS!的更多相关文章

  1. ABP(现代ASP.NET样板开发框架)系列之16、ABP应用层——数据传输对象(DTOs)

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之16.ABP应用层——数据传输对象(DTOs) ABP是“ASP.NET Boilerplate Project ...

  2. vue.js学习(第一课)

    学习资料 来自台湾小凡! vue.js是javascript的一个库,只专注于UI层面,核心价值永远是 API的简洁. 第一课: 不支持IE8. 1.声明式渲染: el元素的简称 element : ...

  3. 【bb平台刷课记】wireshark结合实例学抓包

    [bb平台刷课记]wireshark结合实例学抓包 背景:本校形势与政策课程课需要在网上观看视频的方式来修得学分,视频网页自带"播放器不可快进+离开窗口自动暂停+看完一集解锁下一集(即不能同 ...

  4. 【第三课】WEBIX 入门自学-Hello World

    在看官网教程时,入门的例子就是dataTable这个空间.So,遵循官网,一起来看一下入门的DataTable组件: WEB使用时固然是先引入相应的库文件: 代码如下 <html> < ...

  5. Python之路第一课Day6--随堂笔记(面向对象 )

    本节内容: 1. 面向对象编程介绍 2. 为什么要用面向对象进行开发? 3. 面向对象的特性:封装.继承.多态 4. 类.方法   一.面向过程 VS 面向对象  1. 编程范式 编程是 程序 员 用 ...

  6. Python之路第一课Day4--随堂笔记(迭代生成装饰器)

    上节回顾: 1.集合 a.关系测试 b.去重 2.文件操作及编码 3.函数 4.局部变量和全局变量 上节回顾 本节课内容: 1.迭代器生成器 2.装饰器 3.json pickle数据序列化 4.软件 ...

  7. 【Java学习系列】第1课--Java环境搭建和demo运行

    本文地址 分享提纲: 1. java环境的搭建 2. java demo代码运行 3.参考文档 本人是PHP开发者,一直感觉Java才是程序的王道(应用广,科班出身),所以终于下决心跟一跟. 主要是给 ...

  8. Magento学习第一课——目录结构介绍

    Magento学习第一课--目录结构介绍 一.Magento为何强大 Magento是在Zend框架基础上建立起来的,这点保证了代码的安全性及稳定性.选择Zend的原因有很多,但是最基本的是因为zen ...

  9. XAF视频教程来啦,已出15课

    第一到第七课在这里: http://www.cnblogs.com/foreachlife/p/xafvideo_1_6.html 视频地址:http://i.youku.com/i/UMTI5OTE ...

随机推荐

  1. C++统计单词数

    [题目描述] 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数.现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在 ...

  2. 分析dubbo心跳检测机制

    目的: 维持provider和consumer之间的长连接 实现: dubbo心跳时间heartbeat默认是60s,超过heartbeat时间没有收到消息,就发送心跳消息(provider,cons ...

  3. springboot2整合activiti7具体步骤

    写在前面 需要提前了解的内容有 springboot.springSecurity.activiti基本使用 关于activiti Activiti项目是一项新的基于Apache许可的开源BPM平台, ...

  4. Java多线程_Future设计模式

    Future模式的核心:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑.    Future模式有点类似于商品订单.在网上购物时,提交订单后,在收货的这段时间里无需一直在家 ...

  5. 7. Jackson用树模型处理JSON是必备技能,不信你看

    每棵大树,都曾只是一粒种子.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[BA ...

  6. JVM大作业5——指令集

    JVM的每一个线程都有一个虚拟机栈,方法调用时,JVM会在虚拟机栈内为该方法创建一个栈帧. 一条线程,只有正在执行的方法对应的栈帧时可活动的,这个栈帧被称为当前栈帧,当前栈帧对应的方法被称为当前方法, ...

  7. google protocol buffer——protobuf的编码原理二

    这一系列文章主要是对protocol buffer这种编码格式的使用方式.特点.使用技巧进行说明,并在原生protobuf的基础上进行扩展和优化,使得它能更好地为我们服务. 在上一篇文章中,我们主要通 ...

  8. Labview学习之路(一)程序框图中的修饰

    很多小伙伴知道在前面板有很多修饰符,比如上凸框,加粗下凹框等等,但是其实在程序框图中也是有修饰符的,他的位置比较隐蔽,并且修饰符很少,所以很多人基本没有用过.现在就给大家介绍一些这些程序框图种的修饰. ...

  9. wpf附加属性详解

    为什么使用附加属性 附加属性的一个用途是允许不同的子元素为父元素中定义的属性指定唯一的值. 此方案的一个具体应用是,让子元素通知父元素它们在用户界面 (UI) 中的呈现方式. 一个示例是 DockPa ...

  10. wxmini

    微信小游戏架构概览 https://www.jianshu.com/p/02199c35d749 微信小程序:工具配置 project.config.json https://www.cnblogs. ...