目录

免责声明

1.准备bochs软件

方法1: 下载发布版本

方法2: 使用Visual Studio 2022编译源代码

2.以KolibriOS操作系统镜像为例子

下载软盘版本的系统镜像

配置环境

配置CPU

配置Memory

配置Floopy & Boot

保存配置文件

启动bochs

3.以Windows XP的安装为例子

下载系统镜像

创建虚拟磁盘

配置环境

配置CPU

配置Memory

配置Floopy & Boot

配置ATA controller 0

保存配置文件

启动bochs

4.编译自己的汇编代码+使用bochs调试

安装nasm

将bochs的安装目录添加到系统环境变量中

编译+调试的方法

一键编译+调试的bat脚本

5.各种疑难杂症的解决方法

解决IPS过低的问题

方法1: 如果bochs是自己从源码编译的,之前选的debug编译,现在改用release编译

方法2: bochs配置中提高模拟的CPU的IPS

方法3: 关闭电脑的省电模式

方法4: 任务管理器提高bochs进程的优先级别

释放虚拟机中的鼠标的方法

更换软盘的方法

使用i386 CPU运行linux 0.11屏幕一直黑屏的解决方法


免责声明

本文内容为个人学习和实践的经验分享,旨在为广大技术爱好者提供参考和思路,不构成任何形式的正式建议或操作指导

风险提示
在 Windows 操作系统下配置 Bochs 虚拟机、修改系统设置(包括但不限于电源管理、进程优先级、硬件参数等)属于系统级操作,可能对系统稳定性、硬件性能甚至数据安全产生影响。常见风险包括但不限于:

  • 系统响应变慢、无响应或蓝屏;

  • 虚拟机运行异常、崩溃或数据丢失;

  • 真实硬件(如 CPU、内存、硬盘)因配置不当导致过热、寿命缩短或损坏;

  • 重要文件丢失或操作系统无法正常启动。

用户责任
在进行任何操作前,请您务必:

  • 充分了解当前操作的含义及可能后果

  • 备份所有重要数据至安全位置

  • 确认当前操作环境(如硬件配置、操作系统版本)与本文所述方法兼容
    您应自行承担因遵循本文内容而引发的一切风险及后果

免责范围
本文博主不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断、硬件损坏、系统故障或法律责任。使用本文所涉方法即表示您已知悉并同意本声明

1.准备bochs软件

方法1、2二选1即可

方法1: 下载发布版本

访问https://bochs.sourceforge.io/官网,点击右边的See All Releases:

来到https://sourceforge.net/projects/bochs/files/bochs/,点击绿色按钮下载最新版:

运行安装包,发现Windows警告有风险,忽略这个警告,仍要运行:

点Next:

点I Agree:

默认是给我Windows的所有账户安装的,这里我保持不变,读者可自行选择:

保持默认,点Next:

选择安装路径,我默认,读者可以自行配置:

点击Finish:

方法2: 使用Visual Studio 2022编译源代码

源码下载链接https://sourceforge.net/projects/bochs/files/bochs/3.1/bochs-3.1-msvc-src.zip/download

解压后,进入vs2019子目录,里面是带sln的,直接使用VS2022打开就行:

原项目是用VS2019开发的,所以VS2022打开时会提示升级SDK,点确定就行:

可以看到解决方案由很多项目(avx、bochs、......、stubs)组成:

由于VS的特点,必须要选择一个项目作为启动项目,否则无法编译,这里在bochs项目上右击,选择设置为启动项目:

接着点击本地Windows调试器进行编译后生成可执行文件:

下方的输出框中显示成功生成可执行文件:

也成功运行了bochs:

2.以KolibriOS操作系统镜像为例子

下载软盘版本的系统镜像

访问KolibriOS - Download,下载英语版img:

配置环境

配置CPU

点击CPU:

更改默认的corei7_haswell_4770:

下拉菜单有很多CPU:

不要选太新的CPU,也不要选太老的CPU(i386 CPU模拟是有问题的),这里我选pentium_mmx:

IPS是CPU的频率,默认是50000000,即50MHz,我保持不变,点Apply生效:

配置Memory

KolibriOS操作系统不需要那么大的内存,16M就行,把默认的32改成16,点Apply:

点击生效

配置Floopy & Boot

下载的img的大小是1.40MB:

那么选的时候就选对应规格的3.5 * 1.44M:

下拉展开:

点击Browse... 选择下载的img文件:

Type of floppy media选1.44M:

状态选择inserted:

点击生效

保存配置文件

把刚刚的配置保存起来,点Save:

启动bochs

点Start运行:

成功启动img,等待它加载:

进入到了桌面,说明bochs模拟器成功运行:

下次启动这个镜像就直接点Load加载配置文件,再点Start运行:

注: KolibriOS操作系统不需要硬盘,但有些操作系统安装是需要向磁盘中写入数据的,下面以Windows XP为例演示操作系统的安装

3.以Windows XP的安装为例子

下载系统镜像

http://msdn3.cn/6/58/提供了

点进去后,发现下载链接是ed2k形式的,可以使用带ed2k下载功能的软件(比如迅雷)下载镜像

ed2k://|file|zh-hans_windows_xp_service_pack_3_x86_cd_x14-60563.iso|417675264|2AAB7F0CD4BE378D9113557B1D24D8D0|/

创建虚拟磁盘

Windows XP系统安装是需要向磁盘中写入数据的,这里创建一个空白文件充当磁盘就行,打开bochs自带的bximage软件,在bochs的安装目录下:

右击,以管理员身份运行:

输入1,之后回车:

直接回车,默认就是hd:

直接回车,默认就是flat:

直接回车,默认每个扇区就是512KB:

我这里只是纯粹为了验证能否成功安装Windows XP并进入桌面环境,不使用系统中的软件,也不拿来日常安装其它软件,所以我给的磁盘空间是2048M,即2GB,所以我输入2048后回车:

为虚拟磁盘文件起名,成功创建xp.img在当前bochs的安装目录中:

注意: flat类型的虚拟磁盘的空间是预先分配的,一定要充足,否则装到后面Windows会报空间不足

记下输出结果CHS=4161/16/63,后面会用到

这里我为了方便管理,将我的img镜像移动到了我自己新建的目录下:

配置环境

配置方法和之前一样,按下面的顺序执行,打开bochs

配置CPU

这个Windows XP的32位版本的,没有必要使用64位CPU,所以我选core2_penryn_t9600,IPS为200000000,即200MHz

点击生效

配置Memory

Windows XP需要至少64M才能安装,为了保险起见,我设置为128M:

点击生效

配置Floopy & Boot

这里不需要配置从软盘启动,但要在Boot Options选择启动优先级: 1.cdrom 2.disk

点击生效

配置ATA controller 0

ATA channel 0不要动:

配置First HD/CD on channel 0: 选择cdrom,inserted,填上下载的系统镜像路径

配置Second HD/CD on channel 0: 选择disk,inserted,flat(和使用bximage设置的镜像类型保持一致),填上bximage创建好的img文件的路径

前面bximage创建好镜像后显示CHS=4161/16/63,现在就排上用场了,4161是柱面数,16是磁头数,63是扇区数,具体CHS的讲解参见OS35.【Linux】文件系统前置知识

Sector size保持和bximage设置的一致:

点击生效

保存配置文件

本文上面讲过了

启动bochs

来到了Windows XP的安装界面:

等待加载完所有文件,之后来到这个界面,按Enter:

按F8:

按Enter:

上移,选择用FAT文件系统格式化磁盘分区(快),按Enter:

等待写入完所有文件:

点下一步:

键入账户名后,点下一步:

输入产品密钥,请从微软官方购买密钥:

填写计算机名,我为了简单起见,就不设置密码了,读者自行决定,设置好了后点Next

确定时间没问题后,点Next:

等待安装完成:

结束后,Windows XP重启:

成功进入Windows桌面,至此安装结束:

4.编译自己的汇编代码+使用bochs调试

我写了个在屏幕上显示Hello World的nasm语法的代码:

mov ax,0xb800                
mov es,ax
mov byte [es:0x00],'H'
mov byte [es:0x01],0x0A
mov byte [es:0x02],'e'
mov byte [es:0x03],0x0A
mov byte [es:0x04],'l'
mov byte [es:0x05],0x0A
mov byte [es:0x06],'l'
mov byte [es:0x07],0x0A
mov byte [es:0x08],'o'
mov byte [es:0x09],0x0A
mov byte [es:0x0a],' '
mov byte [es:0x0b],0x0A
mov byte [es:0x0c],"W"
mov byte [es:0x0d],0x0A
mov byte [es:0x0e],'o'
mov byte [es:0x0f],0x0A
mov byte [es:0x10],'r'
mov byte [es:0x11],0x0A
mov byte [es:0x12],'l'
mov byte [es:0x13],0x0A
mov byte [es:0x14],'d'
mov byte [es:0x15],0x0A
mov byte [es:0x16],'!'
mov byte [es:0x17],0x0A
jmp near $
times 510-($-$$) db 0
        db 0x55,0xaa

0xB8000~0xBFFFF 这段物理地址空间,是留给显卡的,向这段物理空间中写入数据,会立刻呈现在屏幕上

我想编译后写入img文件,然后用bochs启动,按照以下步骤执行

安装nasm

访问Index of /pub/nasm/releasebuilds官网,找到最新版后下载

我用的是Windows 10 64位系统,所以进入win64目录:

点击exe文件下载:

以管理员身份打开exe文件,默认是给我Windows的所有账户安装的,这里我保持不变,读者可自行选择,选好了后点Next:

保持不变,点Next:

选择安装路径,我默认,读者可以自行配置:

点Install:

验证nasm是否可以用:

打开cmd,输入以下命令来检测nasm命令是否可用:

nasm -v

如果输出了版本,说明可以用:

将bochs的安装目录添加到系统环境变量中

Windows如何添加到系统环境变量,这个网上教程很多,不再赘述

打开cmd,输入以下命令来检测bochs命令是否可用:

bochs --help

编译+调试的方法

一键编译+调试的bat脚本

将代码保存为build&debug.bat:

@echo off
chcp 65001 >nul

echo 正在编译...
nasm -f bin hello_world.asm -o hello_world.bin
if %errorlevel% neq 0 (
    echo 编译失败,请检查错误信息。
    pause
    exit /b 1
)

echo 创建软盘镜像并写入引导扇区...
del /f /q hello_world.img 2>nul
del /f /q zero.tmp 2>nul
fsutil file createnew zero.tmp 1474048 >nul
copy /b hello_world.bin + zero.tmp hello_world.img >nul
del /f /q zero.tmp
if not exist hello_world.img (
    echo 创建镜像失败,请检查错误信息。
    pause
    exit /b 1
)

echo 启动Bochs调试器...
bochs -q -f .\bochsrc.bxrc -debugger
if %errorlevel% neq 0 (
    echo 启动Bochs调试器失败,请检查错误信息。
    echo Bochs下载链接: https://sourceforge.net/projects/bochs/
    pause
    exit /b 1
)

注: Windows自带的命令fsutil工具和bochs自带的bximage功能一样,只不过fsutil工具创建img文件后不会暂停,而bximage创建img文件后每次都会暂停一下,需要手动点击Enter才能退出,比较麻烦

注意: 有读者可能会使用dd for Windows(官方下载链接http://www.chrysocome.net/downloads/ddrelease64.exe)来代替bximage,但下载的dd工具有较大概率被篡改为病毒文件,因为下载网站使用的是HTTP协议,不是加密的HTTPS协议,使用HTTP协议的网站是向用户明文传输数据的,容易受到中间人的篡改甚至是掉包!

将以下代码写到bochsrc.bxrc空文件中,将bochsrc.bxrc和build&debug.bat放到同一个目录下,但里面的BIOS路径和VGABIOS路径需要手动填写:

# configuration file generated by Bochs
plugin_ctrl: voodoo=false, unmapped=true, biosdev=true, speaker=true, extfpuirq=true, parallel=true, serial=true, busmouse=false, e1000=false, es1370=false, gameport=true, iodebug=true, ne2k=false, sb16=false, usb_uhci=false, usb_ohci=false, usb_ehci=false, usb_xhci=false
config_interface: win32config
display_library: win32
memory: guest=32, host=32, block_size=128
#填写BIOS路径
romimage: file="???", address=0x00000000, options=none, flash_data=none
vgaromimage: file="???" #填写VGABIOS路径
boot: floppy
floppy_bootsig_check: disabled=0
floppya: type=1_44, 1_44=".\hello_world.img", status=inserted, write_protected=0
# no floppyb
ata0: enabled=true, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=none
ata0-slave: type=none
ata1: enabled=true, ioaddr1=0x170, ioaddr2=0x370, irq=15
ata1-master: type=none
ata1-slave: type=none
ata2: enabled=false
ata3: enabled=false
optromimage1: file=none
optromimage2: file=none
optromimage3: file=none
optromimage4: file=none
optramimage1: file=none
optramimage2: file=none
optramimage3: file=none
optramimage4: file=none
pci: enabled=1, chipset=i440fx, slot1=none, slot2=none, slot3=none, slot4=none, slot5=none
vga: extension=vbe, update_freq=75, realtime=1
#vga: extension=vbe, update_freq=75, realtime=1, ddc=builtin, vbe_memsize=16
cpu: count=1, ips=4000000, model=i386, reset_on_triple_fault=1, cpuid_limit_winnt=0, ignore_bad_msrs=1, mwait_is_nop=0
print_timestamps: enabled=0
magic_break: enabled=1 0x0
port_e9_hack: enabled=false, all_rings=false
iodebug: all_rings=0
private_colormap: enabled=0
clock: sync=realtime, time0=local, rtc_sync=0
# no cmosimage
log: -
logprefix: %t%e%d
debug: action=ignore
info: action=report
error: action=report
panic: action=ask
keyboard: type=mf, serial_delay=150, paste_delay=100000, user_shortcut=none
mouse: type=ps2, enabled=false, toggle=ctrl+mbutton
sound: waveoutdrv=win, waveout=none, waveindrv=win, wavein=none, midioutdrv=win, midiout=none
speaker: enabled=true, mode=sound, volume=15
parport1: enabled=true, file=none
parport2: enabled=false
com1: enabled=true, mode=null
com2: enabled=false
com3: enabled=false
com4: enabled=false
usb_debug: type=none

运行bat,脚本将自动完成编译、写入img、运行bochs

注意到bochs窗口是黑屏的,这是因为处于调试模式下的bochs会自动暂停在开机后的第一条指令jmpf 0xf000:e05b,等待用户调试

键入c命令后回车就行:

运行结果: 屏幕左上角成功打印Hello World!

bochs的调试命令有很多,读者可阅读李忠老师写的《86汇编语言:从实模式到保护模式 第二版》或者bochs官方提供的手册https://bochs.sourceforge.io/doc/docbook/user/internal-debugger.html

5.各种疑难杂症的解决方法

解决IPS过低的问题

IPS过低会导致操作系统运行会非常卡,按以下步骤逐一解决

方法1: 如果bochs是自己从源码编译的,之前选的debug编译,现在改用release编译

如果bochs是自己从源码编译的,例如Windows下的VS2022,如果之前选的是debug+x86或者debug+x64,IPS的会很低,即使调高模拟的CPU的IPS也没有用,需要选择release+x64或者release+x86编译

博主亲测,设置虚拟机的CPU为core2_penryn_t9600,IPS设置为200000000,也就是200MIPS,简称200M,bochs的debug版本最多跑到20M,release版本在140M~200M之间

方法2: bochs配置中提高模拟的CPU的IPS

Emulated instructions per second (IPS)调大一点:

方法3: 关闭电脑的省电模式

免责声明: 关闭省电模式后,电脑将以更高性能状态运行,可能导致电池续航时间明显缩短、硬件温度升高、散热风扇转速加快等
在极端情况下可能影响硬件寿命或触发过热保护导致关机
请根据您的实际硬件状况和需求谨慎操作,在进行任何电源计划修改前,建议保存所有正在进行的工作,并确保重要数据已备份,您应自行承担因调整电源设置而产生的所有风险及后果
博主本人仅提供技术经验分享,不对此操作造成的任何直接或间接损失(包括但不限于数据丢失、硬件损坏、电池寿命缩短)承担责任

使用本文所述关闭电脑的省电模式方法即表示您已知悉并同意本声明

读者可以自己看看开启省电和关闭省电后bochs窗口下方的IPS的变化:

方法4: 任务管理器提高bochs进程的优先级别

打开任务管理器,点击"详细信息":

右击bochs进程,选择"设置优先级(P)":

根据自己的电脑情况选择合适的优先级:

免责声明: 本文内容为个人学习和实践的经验分享,旨在交流技术知识,不构成任何形式的正式建议,修改进程优先级属于系统级操作,可能对操作系统稳定性产生影响,甚至引发程序崩溃或数据丢失,请在充分了解相关风险的前提下谨慎操作,并在操作前备份所有重要数据
博主本人不对因遵循本文内容而导致的任何直接或间接损失承担责任,使用本文中提到的修改优先级的方法即表示您已知悉并同意此声明

释放虚拟机中的鼠标的方法

鼠标停留在一会,bochs显示:

释放虚拟机中的鼠标的方法: 先按住键盘上的Ctrl键,再点击鼠标的中键(即滚轮),即可释放鼠标,让它回到主机系统中

更换软盘的方法

方法: 更改下一个即将插入的软盘的文件名称,为当前插入的软盘名称,这样就不需要关掉bochs手动修改配置文件了

使用i386 CPU运行linux 0.11屏幕一直黑屏的解决方法

这里使用的是闪客大佬github项目https://github.com/dibingfa/flash-linux0.11-talk中flash-linux0.11-talk/一些非必要的资料/linux-0.11-quickstart-debug/Linux-0.11目录下的img文件:

rootimage-0.11.img

hdc-0.11.img

rootimage-0.11.img

我编写了bochsrc.bxrc配置文件:

# configuration file generated by Bochs
plugin_ctrl: voodoo=false, unmapped=true, biosdev=true, speaker=true, fw_cfg=false, acpi=false, parallel=true, serial=true, busmouse=false, e1000=false, es1370=false, gameport=true, iodebug=false, ne2k=false, sb16=false, usb_uhci=false, usb_ohci=false, usb_ehci=false, usb_xhci=false
config_interface: win32config
display_library: win32
memory: guest=32, host=32, block_size=0
romimage: file="C:\Program Files\Bochs-3.1\BIOS-bochs-latest", address=0x00000000, options=none, flash_data=none
vgaromimage: file="C:\Program Files\Bochs-3.1\VGABIOS-lgpl-latest.bin"
boot: floppy
floppy_bootsig_check: disabled=0
floppya: type=1_44, 1_44="D:\document\linux 0.11调试\Linux-0.11\Boot.img", status=inserted, write_protected=0
floppyb: type=1_44
ata0: enabled=true, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="D:\document\linux 0.11调试\Linux-0.11\hdc-0.11.img", mode=flat, cylinders=121, heads=16, spt=63, sect_size=512, model="Generic 1234", biosdetect=auto, translation=auto
ata0-slave: type=none
ata1: enabled=true, ioaddr1=0x170, ioaddr2=0x370, irq=15
ata1-master: type=none
ata1-slave: type=none
ata2: enabled=false
ata3: enabled=false
optromimage1: file=none
optromimage2: file=none
optromimage3: file=none
optromimage4: file=none
optramimage1: file=none
optramimage2: file=none
optramimage3: file=none
optramimage4: file=none
pci: enabled=1, chipset=i440fx, slot1=none, slot2=none, slot3=none, slot4=none, slot5=none
vga: extension=vbe, update_freq=10, realtime=1, ddc=builtin, vbe_memsize=16
cpu: count=1, ips=50000000, model=i386, reset_on_triple_fault=1, cpuid_limit_winnt=0, cpuid_freq=hardware, ignore_bad_msrs=1, mwait_is_nop=0
print_timestamps: enabled=0
debugger: log=-, gui=false
magic_break: enabled=0
port_e9_hack: enabled=false, all_rings=false
iodebug: all_rings=0
private_colormap: enabled=0
clock: sync=none, time0=local, rtc_sync=0
# no cmosimage
log: -
logprefix: %t%e%d
debug: action=ignore
info: action=report
warn: action=warn
error: action=report
panic: action=ask
keyboard: type=mf, serial_delay=150, paste_delay=100000, user_shortcut=none
mouse: type=ps2, enabled=false, toggle=ctrl+mbutton
sound: waveoutdrv=win, waveout=none, waveindrv=win, wavein=none, midioutdrv=win, midiout=none
speaker: enabled=true, mode=sound, volume=8
parport1: enabled=true, file=none
parport2: enabled=false
com1: enabled=true, mode=null
com2: enabled=false
com3: enabled=false
com4: enabled=false
usb_debug: type=none

但bochs屏幕是黑屏:

bochs控制台一直在疯狂打印:

原因: 新版的bochs在开机时会执行cpuid来检测CPU类型,但i386不支持cpuid指令,换较新的CPU,比如奔腾处理器pentium_mmx

现在没问题了:

网上有大佬配置了一键编译+写盘+启动bochs的项目Camio1945/linux-0.11-quickstart-debug-bochs2.7: 用 Bochs 2.7 的 GUI 窗口调试 Linux 0.11 源码。(非原创)

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐