Windows下,bochs配置虚拟机及疑难杂症解决指南
目录免责声明1.准备bochs软件方法1: 下载发布版本方法2: 使用Visual Studio 2022编译源代码2.以KolibriOS操作系统镜像为例子下载软盘版本的系统镜像配置环境配置CPU配置Memory配置Floopy Boot保存配置文件启动bochs3.以Windows XP的安装为例子下载系统镜像创建虚拟磁盘配置环境配置CPU配置Memory配置Floopy Boot配置ATA controller 0保存配置文件启动bochs4.编译自己的汇编代码使用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生效:配置MemoryKolibriOS操作系统不需要那么大的内存,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会报空间不足记下输出结果CHS4161/16/63,后面会用到这里我为了方便管理,将我的img镜像移动到了我自己新建的目录下:配置环境配置方法和之前一样,按下面的顺序执行,打开bochs配置CPU这个Windows XP的32位版本的,没有必要使用64位CPU,所以我选core2_penryn_t9600,IPS为200000000,即200MHz点击生效配置MemoryWindows XP需要至少64M才能安装,为了保险起见,我设置为128M:点击生效配置Floopy Boot这里不需要配置从软盘启动,但要在Boot Options选择启动优先级: 1.cdrom 2.disk点击生效配置ATA controller 0ATA channel 0不要动:配置First HD/CD on channel 0: 选择cdrom,inserted,填上下载的系统镜像路径配置Second HD/CD on channel 0: 选择disk,inserted,flat(和使用bximage设置的镜像类型保持一致),填上bximage创建好的img文件的路径前面bximage创建好镜像后显示CHS4161/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,0xaa0xB80000xBFFFF 这段物理地址空间,是留给显卡的,向这段物理空间中写入数据,会立刻呈现在屏幕上我想编译后写入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脚本将代码保存为builddebug.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 2nul del /f /q zero.tmp 2nul 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和builddebug.bat放到同一个目录下,但里面的BIOS路径和VGABIOS路径需要手动填写:# configuration file generated by Bochs plugin_ctrl: voodoofalse, unmappedtrue, biosdevtrue, speakertrue, extfpuirqtrue, paralleltrue, serialtrue, busmousefalse, e1000false, es1370false, gameporttrue, iodebugtrue, ne2kfalse, sb16false, usb_uhcifalse, usb_ohcifalse, usb_ehcifalse, usb_xhcifalse config_interface: win32config display_library: win32 memory: guest32, host32, block_size128 #填写BIOS路径 romimage: file???, address0x00000000, optionsnone, flash_datanone vgaromimage: file??? #填写VGABIOS路径 boot: floppy floppy_bootsig_check: disabled0 floppya: type1_44, 1_44.\hello_world.img, statusinserted, write_protected0 # no floppyb ata0: enabledtrue, ioaddr10x1f0, ioaddr20x3f0, irq14 ata0-master: typenone ata0-slave: typenone ata1: enabledtrue, ioaddr10x170, ioaddr20x370, irq15 ata1-master: typenone ata1-slave: typenone ata2: enabledfalse ata3: enabledfalse optromimage1: filenone optromimage2: filenone optromimage3: filenone optromimage4: filenone optramimage1: filenone optramimage2: filenone optramimage3: filenone optramimage4: filenone pci: enabled1, chipseti440fx, slot1none, slot2none, slot3none, slot4none, slot5none vga: extensionvbe, update_freq75, realtime1 #vga: extensionvbe, update_freq75, realtime1, ddcbuiltin, vbe_memsize16 cpu: count1, ips4000000, modeli386, reset_on_triple_fault1, cpuid_limit_winnt0, ignore_bad_msrs1, mwait_is_nop0 print_timestamps: enabled0 magic_break: enabled1 0x0 port_e9_hack: enabledfalse, all_ringsfalse iodebug: all_rings0 private_colormap: enabled0 clock: syncrealtime, time0local, rtc_sync0 # no cmosimage log: - logprefix: %t%e%d debug: actionignore info: actionreport error: actionreport panic: actionask keyboard: typemf, serial_delay150, paste_delay100000, user_shortcutnone mouse: typeps2, enabledfalse, togglectrlmbutton sound: waveoutdrvwin, waveoutnone, waveindrvwin, waveinnone, midioutdrvwin, midioutnone speaker: enabledtrue, modesound, volume15 parport1: enabledtrue, filenone parport2: enabledfalse com1: enabledtrue, modenull com2: enabledfalse com3: enabledfalse com4: enabledfalse usb_debug: typenone运行bat,脚本将自动完成编译、写入img、运行bochs注意到bochs窗口是黑屏的,这是因为处于调试模式下的bochs会自动暂停在开机后的第一条指令jmpf 0xf000:e05b,等待用户调试键入c命令后回车就行:运行结果: 屏幕左上角成功打印Hello World!bochs的调试命令有很多,读者可阅读李忠老师写的《86汇编语言从实模式到保护模式 第二版》或者bochs官方提供的手册https://bochs.sourceforge.io/doc/docbook/user/internal-debugger.html5.各种疑难杂症的解决方法解决IPS过低的问题IPS过低会导致操作系统运行会非常卡,按以下步骤逐一解决方法1: 如果bochs是自己从源码编译的,之前选的debug编译,现在改用release编译如果bochs是自己从源码编译的,例如Windows下的VS2022,如果之前选的是debugx86或者debugx64,IPS的会很低,即使调高模拟的CPU的IPS也没有用,需要选择releasex64或者releasex86编译博主亲测,设置虚拟机的CPU为core2_penryn_t9600,IPS设置为200000000,也就是200MIPS,简称200M,bochs的debug版本最多跑到20M,release版本在140M~200M之间方法2: bochs配置中提高模拟的CPU的IPSEmulated 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.imghdc-0.11.imgrootimage-0.11.img我编写了bochsrc.bxrc配置文件:# configuration file generated by Bochs plugin_ctrl: voodoofalse, unmappedtrue, biosdevtrue, speakertrue, fw_cfgfalse, acpifalse, paralleltrue, serialtrue, busmousefalse, e1000false, es1370false, gameporttrue, iodebugfalse, ne2kfalse, sb16false, usb_uhcifalse, usb_ohcifalse, usb_ehcifalse, usb_xhcifalse config_interface: win32config display_library: win32 memory: guest32, host32, block_size0 romimage: fileC:\Program Files\Bochs-3.1\BIOS-bochs-latest, address0x00000000, optionsnone, flash_datanone vgaromimage: fileC:\Program Files\Bochs-3.1\VGABIOS-lgpl-latest.bin boot: floppy floppy_bootsig_check: disabled0 floppya: type1_44, 1_44D:\document\linux 0.11调试\Linux-0.11\Boot.img, statusinserted, write_protected0 floppyb: type1_44 ata0: enabledtrue, ioaddr10x1f0, ioaddr20x3f0, irq14 ata0-master: typedisk, pathD:\document\linux 0.11调试\Linux-0.11\hdc-0.11.img, modeflat, cylinders121, heads16, spt63, sect_size512, modelGeneric 1234, biosdetectauto, translationauto ata0-slave: typenone ata1: enabledtrue, ioaddr10x170, ioaddr20x370, irq15 ata1-master: typenone ata1-slave: typenone ata2: enabledfalse ata3: enabledfalse optromimage1: filenone optromimage2: filenone optromimage3: filenone optromimage4: filenone optramimage1: filenone optramimage2: filenone optramimage3: filenone optramimage4: filenone pci: enabled1, chipseti440fx, slot1none, slot2none, slot3none, slot4none, slot5none vga: extensionvbe, update_freq10, realtime1, ddcbuiltin, vbe_memsize16 cpu: count1, ips50000000, modeli386, reset_on_triple_fault1, cpuid_limit_winnt0, cpuid_freqhardware, ignore_bad_msrs1, mwait_is_nop0 print_timestamps: enabled0 debugger: log-, guifalse magic_break: enabled0 port_e9_hack: enabledfalse, all_ringsfalse iodebug: all_rings0 private_colormap: enabled0 clock: syncnone, time0local, rtc_sync0 # no cmosimage log: - logprefix: %t%e%d debug: actionignore info: actionreport warn: actionwarn error: actionreport panic: actionask keyboard: typemf, serial_delay150, paste_delay100000, user_shortcutnone mouse: typeps2, enabledfalse, togglectrlmbutton sound: waveoutdrvwin, waveoutnone, waveindrvwin, waveinnone, midioutdrvwin, midioutnone speaker: enabledtrue, modesound, volume8 parport1: enabledtrue, filenone parport2: enabledfalse com1: enabledtrue, modenull com2: enabledfalse com3: enabledfalse com4: enabledfalse usb_debug: typenone但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 源码。非原创