dd 删除引导扇区_自制操作系统:引导扇区的实现

本文介绍了如何实现操作系统的引导扇区,并通过编写汇编代码输出'Hello, OS world!'。首先,使用nasm编译器将汇编代码转化为二进制,接着使用dd命令将引导扇区写入软盘镜像,创建虚拟软盘。在VirtualBox中设置虚拟机,将boot.img加载到软驱,成功启动后,能在虚拟机中看到预期的输出。此外,还讨论了可能遇到的VirtualBox问题及其解决办法。" 80721304,7401575,XeLaTeX中表格、图片和公式的标签与引用,"['LaTeX', '文档编辑', '排版', '技术写作', '学术出版']
摘要由CSDN通过智能技术生成

本书依靠的教材是于渊的《Orange'S:一个操作系统的实现》

实验环境及工具

ArchLinux(windows也可以)

代码编辑器Emacs(你尽情使用自己喜欢的编辑器)

nasm (一个开源的汇编器,可以从sourceforge下载,也可以从Linux发行版的软件仓库安装)

思路:

写一段汇编代码,输出 Hello, World

将该段代码写入软盘镜像的第一个扇区

安装virtualbox创建一个操作系统,从软盘镜像引导,查看结果

引导区代码

;; BIOS会把512字节的引导扇区加载到 0000:7c00 处,

;; 然后跳转到0000:7c00处,将控制权交给引导代码。

org 07c00h ;这一行告诉编译器,我们的代码将被加载到7c00处。

mov ax, cs ;将代码段寄存器的值送入AX

mov ds, ax ;将数据段的地址置为代码段的地址?

mov es, ax ;将附加段的地址置为代码段的地址?

call DispStr ;调用显示字符串例程

jmp $ ;无限循环, $表示当前行编译后的地址

;; 以上就是整个程序的执行过程了

;; 下面是DispStr子程序

DispStr:

mov ax, BootMessage ;将字符串首地址传给寄存器ax

mov bp, ax ;CPU将用ES:BP来寻址字符串

mov cx, 16 ;通过CX,CPU知道字符串的长度

mov ax, 01301h ;AH=13表示13号中断, AL=01H,表示目标字符串仅仅包含字符,属性在BL中包含,移动光标

mov bx, 000ch ;黑底红字, BL=0CH,高亮

mov dl, 0 ;dh表示在第几行显示,dl表示第几列显示

int 10h ;BIOS的10H中断的13号中断用于显示字符串

ret

BootMessage: db "Hello, OS world!" ;对NASM来讲,标号和变量的作用一样, db表示define byte

;; $当前行被汇编后的地址,$$表示一个section开始处的地址,本程序只有一个section,所以指0x7c00

times 510-($-$$) db 0 ;填充剩下空间,使生成的二进制恰好为512字节

dw 0xaa55 ;结束标志,如果发现扇区以0xAA55结束,则BIOS认为它是一个引导扇区,dw表示define word

编译生成二进制

需要nasm。如果你使用Linux,可以直接从软件仓库安装。

nasm即可以从汇编代码生成目标代码,也带了一个反汇编工具ndisasm, 可以从目标代码生成汇编代码。

编译我们的扇区代码生成二进制:

nasm boot.asm -o boot.bin

写入软盘的第一个扇区

我们用软盘镜像来模拟软盘。

dd if=/dev/zero of=emptydisk.img bs=512 count=2880 #生成空白软盘镜像文件

dd if=boot.bin of=boot.img bs=512 count=1 #用 bin file 生成对应的镜像文件

dd if=emptydisk.img of=boot.img skip=1 seek=1 bs=512 count=2879 #在 bin 生成的镜像文件后补上空白,成为合适大小的软盘镜像

这样,我们引导系统用的虚拟软盘就准备好了。

安装virtualbox,建立系统

可以直接从Linux软件仓库安装virtualbox。

把当前用户加入vboxusers组:gpasswd -a vboxusers。

启动virtualbox,可能提示vboxdrv未能成功加载。如果发生这种情况,需要重新编译vboxdrv模块。安装linux-headers和dkms,然后sudo dkms autoinstall就会编译生成vboxdrv模块。

手动执行sudo modprobe vboxdrv加载vboxdrv模块,启动virtualbox应该不会有问题了。

建立一个虚拟机,有没有硬盘都可以,增加一个软驱,把我们的boot.img加载到软驱中,启动虚拟机,成功的话,可以看到:

b60d8ee6f179f33f12a4bde59db27c00.png

virtualbox可能出现的问题:

Failed to open a session for the virtual machine a. Failed to load VMMR0.r0 (VERR_SUPLIB_OWNER_NOT_ROOT). Unknown error creating VM (VERR_SUPLIB_OWNER_NOT_ROOT). 解决方法:sudo chown -R root:root /usr/lib/virtualbox

Effective UID is not root. 解决方法: sudo chmod 4711 /usr/lib/virtualbox/VirtualBox。

参考文章:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值