02 - Hello, DTOS(第一个主引导程序,屏幕上打印Hello,DTOS)

---- 整理自狄泰软件唐佐林老师课程

查看所有文章链接:(更新中)深入浅出操作系统 - 目录

1. 问题

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

2. 主引导程序

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

2.1 主引导程序的开发

对比应用程序的开发:

入口:0x7c00VS入口:main
主引导程序
(汇编语言)
应用程序
(C/C++)
||
V
||
V
BIOS中断OS系统调用

2.2 课程实验:编写一个主引导程序

2.2.1 目标

  • 可独立运行于x86架构的主机(无操作系统)
  • 运行后在屏幕上打印 “Hello,DTOS!”

2.2.2 关键实现思路

  1. 将关键寄存器的值设为0
mov ax,0
  1. 定义需要打印的数据
db "Hello,DTOS!"
  1. 打印预定义的字符数据
int 0x10

2.3 汇编小贴士

  • mov:赋值
  • int:触发中断
  • hlt:停止运行,CPU进入 暂停状态,不执行任何操作
  • 汇编中地址的访问方式:段地址 : 段内偏移地址
; 0xb800:0x01 ==> 0xb8000 + 0x01; 0xb800 左移四位,加上偏移地址0x01,将0x07赋值到地址0xb8001
mov byte [0xb800:0x01],0x07  
  • 标签:用于 标识后续指令的地址(可等同于C语言中的 goto所用的标签
  • $:表示当前指令行地址
  • $$:表示当前汇编段起始地址

2.4 中断调用vs函数调用

在屏幕上打印一个字符:
在这里插入图片描述

3. 编程实验

【参看链接】:02 - Hello, DTOS!(第一个主引导程序,屏幕上打印Hello,DTOS! )

3.1 问题

  • 如何验证编写的主引导程序?

3.2 解决方案设计

  1. 将汇编源码编译为二进制机器码(nasm)
nasm boot.asm -o boot.bin
  1. 创建虚拟盘(bximage)
bximage 

在这里插入图片描述

c. 将二进制代码boot.bin写入虚拟盘a.img起始位置

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

if:输入文件,boot.bin
of:输出文件,a.img
bs:每次操作的块大小,这里为512字节
count:每次操作的块数量,这里为1
conv:notrunc表示无间隙写入

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

开启此虚拟机:

在这里插入图片描述

4. 小结

  • 主引导程序的代码量不能超过512字节
  • 主引导程序需要使用汇编语言开发
  • 主引导程序中可以通过BIOS中断使用硬件功能
  • 主引导程序运行于实模式(地址都是实际的物理地址)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要将 squeeze2upnp 设置为开机启动,您需要将该命令添加到系统的启动脚本中。 具体步骤如下: 1. 打开终端并输入以下命令以编辑启动脚本文件: sudo vi /etc/rc.local 如果您使用的是 systemd 系统,则可以编辑 /etc/systemd/system/rc.local.service 文件。 2. 在文件的末尾添加以下行: /full/path/to/root/dtos/squeeze2upnp-linux-x86_64-static -z -x /path/to/config.xml & 请注意,必须将“/full/path/to/”替换为 squeeze2upnp 可执行文件的实际路径。 3. 保存并关闭文件。 4. 确保文件可执行。如果您使用的是 systemd 系统,请执行以下命令: sudo chmod +x /etc/systemd/system/rc.local.service 5. 启用 rc.local 服务。如果您使用的是 systemd 系统,请执行以下命令: sudo systemctl enable rc-local.service 如果您使用的是其他系统,请根据您的系统文档启用 rc.local 服务。 6. 重新启动系统并检查 squeeze2upnp 是否已在启动时自动启动。 请注意,如果您的系统使用 systemd,则还可以使用 systemctl 命令将 squeeze2upnp 添加到系统的自启动服务中。具体步骤如下: 1. 打开终端并输入以下命令: sudo vi /etc/systemd/system/squeeze2upnp.service 2. 向文件添加以下内容: [Unit] Description=Squeeze2UPnP [Service] Type=simple ExecStart=/full/path/to/root/dtos/squeeze2upnp-linux-x86_64-static -z -x /path/to/config.xml [Install] WantedBy=multi-user.target 请注意,必须将“/full/path/to/”替换为 squeeze2upnp 可执行文件的实际路径。 3. 保存并关闭文件。 4. 执行以下命令以重新加载 systemd 守护进程配置: sudo systemctl daemon-reload 5. 启动 squeeze2upnp 服务: sudo systemctl start squeeze2upnp.service 6. 将 squeeze2upnp 添加到系统的自启动服务中: sudo systemctl enable squeeze2upnp.service 7. 重新启动系统并检查 squeeze2upnp 是否已在启动时自动启动。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uuxiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值