博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
引导扇区的实现
阅读量:6107 次
发布时间:2019-06-21

本文共 2404 字,大约阅读时间需要 8 分钟。

第一次编写,参考别人的实现了下。

实验环境及工具

  • ubuntu 14.0
  • nasm

思路:

  • 写一段汇编代码,输出 Hello, World
  • 将该段代码写入软盘镜像的第一个扇区
  • 安装virtualbox创建一个操作系统,从软盘镜像引导,查看结果

引导区代码

1  ;; BIOS会把512字节的引导扇区加载到 0000:7c00 处, 2     ;; 然后跳转到0000:7c00处,将控制权交给引导代码。 3     org 07c00h                  ;这一行告诉编译器,我们的代码将被加载到7c00处。 4     mov ax, cs                  ;将代码段寄存器的值送入AX 5     mov ds, ax                  ;将数据段的地址置为代码段的地址? 6     mov es, ax                  ;将附加段的地址置为代码段的地址? 7     call  DispStr               ;调用显示字符串例程 8     jmp $                       ;无限循环, $表示当前行编译后的地址 9     ;; 以上就是整个程序的执行过程了10     ;; 下面是DispStr子程序11 DispStr:12     mov ax, BootMessage         ;将字符串首地址传给寄存器ax13     mov bp, ax                  ;CPU将用ES:BP来寻址字符串14     mov cx, 16                  ;通过CX,CPU知道字符串的长度15     mov ax, 01301h              ;AH=13表示13号中断, AL=01H,表示目标字符串仅仅包含字符,属性在BL中包含,移动光标16     mov bx, 000ch               ;黑底红字, BL=0CH,高亮17     mov dl, 0                   ;dh表示在第几行显示,dl表示第几列显示18     int 10h                     ;BIOS的10H中断的13号中断用于显示字符串19     ret20 BootMessage:    db "Hello, OS world!" ;对NASM来讲,标号和变量的作用一样, db表示define byte21     ;; $当前行被汇编后的地址,$$表示一个section开始处的地址,本程序只有一个section,所以指0x7c0022     times 510-($-$$) db 0           ;填充剩下空间,使生成的二进制恰好为512字节23     dw 0xaa55                       ;结束标志,如果发现扇区以0xAA55结束,则BIOS认为它是一个引导扇区,dw表示define word
View Code

编译生成二进制

需要nasm

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

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 用户组,并编译所需的内核模块。现在,你还不能启动 VirtualBox,因为你的当前用户还不属于 vboxusers 用户组。你可以使用下面的指令来将当前的用户添加到 vboxusers 用户组中:

sudo adduser username vboxusers

把上面的username改为当前用户的名字。

启动virtualbox(直接输入virtualbox)。

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

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

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

virtualbox可能出现的问题:

  1. 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

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

转载地址:http://wghza.baihongyu.com/

你可能感兴趣的文章
RecycleView设置顶部分割线(记录一个坑)
查看>>
【设计模式系列】单例模式的7种写法
查看>>
汉字转拼音 (转)
查看>>
Machine Learning Techniques -6-Support Vector Regression
查看>>
会计基础_001
查看>>
Cordova 开发环境搭建及创建第一个app
查看>>
ajax请求拿到多条数据拼接显示在页面中
查看>>
小程序: 查看正在写的页面
查看>>
dedecms生成文档数据库崩溃 mysql daemon failed to start
查看>>
Linux的50个基本命令
查看>>
Objective-C中创建单例方法的步骤
查看>>
[转]无法安装MVC3,一直卡在vs10-kb2483190
查看>>
Codeforces 520B:Two Buttons(思维,好题)
查看>>
web框架-(二)Django基础
查看>>
Jenkins持续集成环境部署
查看>>
emoji等表情符号存mysql的方法
查看>>
Excel到R中的日期转换
查看>>
检查磁盘利用率并且定期发送告警邮件
查看>>
MWeb 1.4 新功能介绍二:静态博客功能增强
查看>>
linux文本模式和文本替换功能
查看>>