门徒进阶课第2课:Hello,DTOS

问题:主引导程序是软件还是固件呢?如果是软件,那么是由谁来开发的?如何开发?

  • 主引导程序:
    1、它是一段存储在主引导区(MBR)中的有效代码
    2、它并不固化于硬件,属于操作系统代码的一部分
    3、它是启动操作系统内核的桥梁,由汇编程序编写而成
    4、代码总量是不能超过 512 个字节(包含 0x55aa 在内)

  • 主引导程序的开发
    在这里插入图片描述
    对比一般的应用程序:
    1、主引导程序的的入口地址是 0x7c00,而一般的应用程序的入口地址为 main 函数;
    2、主引导程序的语言是汇编,而一般的应用程序的语言则是常见的 C/C++;
    4、主引导程序因为没有操作系统的概念,因此它最后调用的是 BIOS 中断,一般的应用程序最后是 OS 系统程序的调用。

  • 课程实验:
    — 编写一个主引导程序(基于汇编语言)
    — 可独立运行于 x86 架构的主机(无操作系统)
    — 运行后在屏幕上打印“Hello,DTOS!”

实现思路:
1、先将关键寄存器的值设置为 0(mov ax, 0)
2、定义需要打印的数据(db "Hello, DTOS!");
3、打印预定义好的字符数据(int 0x10)。

关于汇编的知识点:

1、mov:赋值操作,它是将右操作数赋值给左操作数。      如 mov ax, 0 代表的意思是将 0 赋值给 ax 寄存器

2int:触发中断。								      如 int 0x10 代表的是触发 0x10 中断,对屏幕来进行操作

3、hlt:停止运行,CPU进入暂停状态,不再执行任何操作。 如 hlt 代表的是使程序进入睡眠状态

4、汇编中的地址访问方式是:段地址:段内偏移地址。     如 mov byte [0xb800:0x01], 0x07;那么此处的 0xb8000:0x01 可等价于 0xb8000 + 0x01,byte 代表的是后面的数据占用一个字节

5、标签。用于表示后续指令的地址(可等同于 C 语言中的标签,作用类似于 goto 跳转语句一样)

6、$ 和 $$。											$ 表示当前指令行地址,$$ 表示当前汇编段起始地址

下来我们来看看中断调用和函数调用的对比,如下图所示

我们看到在一般的应用程序中 printf 的 %c 对应于在主引导程序中是用两条 mov 指令来完成的,参数 ‘c’ 对应于主引导程序中的 mov al, ‘c’。那么在一般的应用程序到此就编写完成了,而主引导程序还加了一句 int 0x10。因为一般的应用程序是基于操作系统来编写的,后续的处理由操作系统来完成;而主引导程序则是没有操作系统的,后面的 CPU 挂起工作就交由编写者自己来完成了。

下来我们来编写一个用于引导加载的程序,如下

boot.asm 源码

org 0x7c00    		// 定义起始地址

start:				//将关键寄存器的值设置为0
    mov ax, cs
    mov ss, ax
    mov ds, ax
    mov es, ax
    
mov si, msg    		// 将 msg 所代表的标签地址放到 si 寄存器中
    
print:
    mov al, [si]    // 将 si 中所代表的内容取出来,类似于 C 中的*(头地址)
    add si, 1       // 将地址 + 1
    cmp al, 0x00
    je last        // 如果上面定义的 al 和 0x00 相等,则跳转到 last
    mov ah, 0x0e
    mov bx, 0x0f
    int 0x10    	// 触发中断
    jmp print    	// 类似于 C 中的 while 循环
    
last:
    hlt            // 跳转完成,CPU 挂起
    jmp last    	// 循环跳转
    
msg:
    db 0x0a, 0x0a    	 // 定义换行符
    db "Hello, DTOS!"    // 定义打印数据
    db 0x0a, 0x0a
    times 510-($-$$) db 0x00    // 将 510 - 上面代码所占用的字节,因为 msg 也占用字节,所以是 510
                                // $ 代表本行的地址数,$$ 代表上面全部代码的地址个数
    db 0x55, 0xaa

我们在完成引导程序的编写之后,应如何来验证所编写的程序呢?这时我们便可以利用 VMWare 来创建一个空的虚拟机,基于它来验证我们所写的汇编程序。

在这里插入图片描述
具体思路是:首先将汇编代码编译为二进制机器码(nasm指令),紧接着创建虚拟盘(bximage);然后将二进制 diamante 写入虚拟盘起始位置(dd),最后在虚拟机中将虚拟盘作为启动盘执行(VMware)。

实验的原材料:
nasm 指令:nasm boot.asm -o boot.bin,这是将我们编写的 boot.asm 编译为二进制 bin 文件;
bximage 指令:bximage a.img -q -fd -size=1.44,其中的 -q 选项是指不用进行交互界面,直接一次运行完成;
dd 指令:dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc,这是将 bin 文件写入到 a.img 文件中。

在这里插入图片描述

  • 小结:
    1、主引导程序的代码量不能超过 512 字节;
    2、主引导程序需要使用汇编语言开发;
    3、主引导程序中可以通过 BIOS 中断使用硬件功能;
    4、主引导程序运行于实模式(地址都是实际的物理地址)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值