OS实验 : 用NASM编写MBR引导程序,在BOCHS虚拟机中测试
2021/4/10 18:14:52
本文主要是介绍OS实验 : 用NASM编写MBR引导程序,在BOCHS虚拟机中测试,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
实验环境
- VMware Workstation Pro
- ubuntu 20.10 amd64
实验步骤
安装Nasm
sudo apt install nasm
创建引导扇区
首先编写汇编代码。使用命令vim boot.asm
创建 boot.asm 文件
写入以下代码:
org 07c00h mov ax, cs mov ds, ax mov es, ax call DispStr jmp $ DispStr: mov ax, BootMessage mov bp, ax mov cx, 16 mov ax, 01301h mov bx, 000ch mov dl, 0 int 10h ret BootMessage: db "Hello, OS world!" times 510 - ($-$$) db 0 dw 0xaa55
输入 :wq
保存并退出。再使用命令nasm boot.asm -o boot.bin
生成 boot.bin 文件。
安装Bochs
使用命令sudo apt-get install vgabios bochs bochs-x bximage
使用bximage创建虚拟软盘
输入命令bximage
,显示如下画面:
选择生成 fd(软盘),其他选择可以使用默认值,直接按回车。完成这一步后,当前目录就生成了软盘映像 a.img 。
将引导扇区写入软盘
使用命令dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
编写Bochs的配置文件
使用命令 vim bochsrc
,将以下内容写入
megs: 32 romimage: file=/usr/share/bochs/BIOS-bochs-latest vgaromimage: file=/usr/share/vgabios/vgabios.bin floppya: 1_44=a.img, status=inserted boot: floppy log: bochsout.txt mouse: enabled=0
启动Bochs 虚拟机(举有调试功能)
输入命令bochs -f bochsrc
.进入后,返回终端,输入···c···,则会直接显示出 Hello,OS world。
若想调试,可参考下表
查找和定位代码
行为 | 指令 | 举例 |
---|---|---|
在某物理地址设置断点 | b addr | b 0x7c00 |
显示当前所有断点信息 | info break | info break |
继续执行,直到遇上断点 | c | c |
单步执行(n次) | s n | s 100 |
单步执行(遇到函数跳过) | n | n |
反汇一段内存 | u start end | u 0x30400 |
查看寄存器
行为 | 指令 | 举例 |
---|---|---|
查看所有寄存器 | info cpu | info cpu |
查看通用寄存器 | r | r |
查看段寄存器 | sreg | sreg |
查看控制寄存器 | creg | creg |
查看调试寄存器 | dreg | greg |
查看内存
行为 | 指令 | 举例 |
---|---|---|
查看内存物理地址内容 | xp /nuf addr | xp /40bx 0x9013e |
查看线性地址内容 | x /nuf addr | x /40bx 0x13e |
想要使用更多指令,可以参考8.15 Using Bochs internal debugger,或Bochs调试常用命令
这篇关于OS实验 : 用NASM编写MBR引导程序,在BOCHS虚拟机中测试的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享