1. 安装bochs和sdl
在Mac上,使用brew安装Bochs虚拟机,以及Bochs虚拟机需要使用到的展示平台sdl
brew install bochs
brew install sdl
复制代码
2. 创建软盘
在安装bochs
时,还会自动安装一些辅助工具,其中包括虚拟磁盘镜像创建工具bximage
。
- 使用
bximage
命令直接创建磁盘镜像,选择1
创建磁盘 - 输入
fd
,表示创建软盘 - 选择软盘的大小,默认的
1.44M
就可以了 - 输入镜像的名称,可以使用默认的镜像名
a.img
,也可以自定义名称boot.img
,只要能跟配置文件中的名称对应即可
3. 编写Boot引导程序
创建一个boot.asm
文件,编写如下代码
org 07c00h ; 告诉编译器程序加载到7c00处
mov ax,cs
mov ds,ax
mov es,ax
call DispStr ; 调用显示字符串例程
jmp $
DispStr:
mov ax,BootMessage
mov bp,ax ; es:bp = 串地址
mov cx,16 ; cx = 串长度
mov ax,01301h ; ah = 13,al = 01h
mov bx,000ch ; 页号为0(bh=0) 黑底红字(b1=0ch,高亮)
mov dl,0
int 10h ; 10h号中断
ret
BootMessage: db "Hello,OS world!"
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
复制代码
4. 编译程序,写入软盘
首先,使用NASM编译器进行程序编译,生成“操作系统”的二进制代码。如果没有nasm
,依然使用brew
进行安装
brew install nasm
nasm boot.asm -o boot.bin
复制代码
编译结束后,将生成的二进制程序boot.bin
写入到boot.img
中
使用系统自带的dd
命令,把Boot程序强制写入到虚拟软盘的固定扇区中
dd if=boot.bin of=boot.img bs=512 count=1 conv=notrunc
复制代码
在这行命令中,if
指定输入源文件名,of
指定输出文件名,count=1
指定传输的块大小为512B
,conv=notrunc
规定在写入数据后不截断输出文件的尺寸大小。以下为该命令的执行日志信息:
5. 配置启动信息
创建bochsrc
文件,写入如下配置。在启动Bochs时,出现问题,一般都是配置的原因
# configuration file generated by Bochs
plugin_ctrl: unmapped=1, biosdev=1, speaker=1, extfpuirq=1, parallel=1, serial=1, iodebug=1
config_interface: textconfig
display_library: sdl2
memory: host=2048, guest=2048
romimage: file="/usr/local/share/bochs/BIOS-bochs-latest"
vgaromimage: file="/usr/local/share/bochs/VGABIOS-lgpl-latest"
boot: floppy
floppy_bootsig_check: disabled=0
floppya: type=1_44, 1_44="a.img", status=inserted, write_protected=0
# no floppyb
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=none
ata0-slave: type=none
ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15
ata1-master: type=none
ata1-slave: type=none
ata2: enabled=0
ata3: enabled=0
pci: enabled=1, chipset=i440fx
vga: extension=vbe, update_freq=5
cpuid: x86_64=1,level=6, mmx=1, sep=1, simd=avx512, aes=1, movbe=1, xsave=1,apic=x2apic,sha=1,movbe=1,adx=1,xsaveopt=1,avx_f16c=1,avx_fma=1,bmi=bmi2,1g_pages=1,pcid=1,fsgsbase=1,smep=1,smap=1,mwait=1,vmx=1
cpuid: family=6, model=0x1a, stepping=5, vendor_string="GenuineIntel", brand_string="Intel(R) Core(TM) i7-3770 CPU (Haswell)"
print_timestamps: enabled=0
debugger_log: -
magic_break: enabled=0
port_e9_hack: enabled=0
private_colormap: enabled=0
clock: sync=none, time0=local, rtc_sync=0
# no cmosimage
# no loader
log: -
logprefix: %t%e%d
debug: action=ignore
info: action=report
error: action=report
panic: action=ask
keyboard: type=mf, serial_delay=250, paste_delay=100000, user_shortcut=none
mouse: type=ps2, enabled=0, toggle=ctrl+mbutton
speaker: enabled=1, mode=system
parport1: enabled=1, file=none
parport2: enabled=0
com1: enabled=1, mode=null
com2: enabled=0
com3: enabled=0
com4: enabled=0
megs: 148
复制代码
6. 启动Bochs
输入启动命令
bochs -f bochsrc
复制代码
如果运行顺利,当Bochs虚拟机启动后,将会在终端中显示一下7个文字选项,默认回车选择6
现在虚拟机刚启动,它只完成了硬件平台的初始化,还为执行引导程序。在出现<bochs:1>
后输入字符串c
或者cont
或者continue
,即可使虚拟机运行。
引导程序的运行效果如下所示:
整体项目结构为:
- bochs
- boot.img
- bochsrc
- boot.asm
- boot.bin
复制代码
常见问题
[HD ] ata0-0: could not open hard drive image file '30M.sample'
这是配置问题,如果使用了从bochsrc-sample.txt
拷贝过来的配置,其中有一项默认配置ata0-master
,将该配置注释掉,换成ata0-master: type=none
。
sound
或者speaker
配置有误,将这两个的配置注释掉
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END