bochs模拟器中文文档

一、前言:

相信很多人都有使用模拟器的需求,因为并不是所有的场景都能用虚拟机代劳,如果你需要对程序精心的调试,实时查看内存与寄存器信息、研究指令集的工作原理,那么模拟器就是一种非常重要的工具。常见的模拟器有很多,最出名的就是Qemu,它既可以作为模拟器又可以作为虚拟机使用,并且对大多数CPU指令集架构提供支持,且有多种工作模式,支持kvm加速、gdb调试等等功能,可以说对于操作系统内核开发、嵌入式开发、指令集设计等都有着非常重要的作用。但是我今天不讲Qemu而是另一个开源的x86模拟器 --- bochs(读音同:box  [bɒks]).对于内核开发者来说,这也是一个非常重要的工具,它可以提供比Qemu+gdb更加精细、精准的调试,可以查看更多的信息,对于内核开发初学者来说是一个强悍的工具,更重要的是它是开源的,并且现在还在更新。

bochs当前信息

bochs官网

bochs官方文档

bochs下载地址

bochs百度百科

bochs作为一个开源工具,它本身是可以使用GNU/linux自带的包管理器安装的,但直接使用包管理器安装的bochs并不具备调试功能,如果想使用bochs来调试自己的内核,请务必下载它的源代码并自己配置和编译。

至于为什么我会想起来写bochs的文档,那正是因为bochs在今年(2024)三月份发布了其最新版本bochs-2.8,我就想开源开发者这么努力、坚持不懈做出更好、更先进、支持更多CPU和指令集的模拟器,那么我是不是也该为社区做一点什么呢?bochs的英文文档可以说是已经非常详细了,但是它的中文文档好像就比较少,只有一些自己配置bochs的资料,对于全面使用bochs模拟器来调试内核来说还是不太够用,那么希望大家看了这篇文章就可以配置出适合自己的bochs模拟器,并用它来调试和学习x86架构和操作系统内核。

最新版新增了几块现代CPU,有了这些新CPU,就可以在模拟器里为自己的内核开发出更多的基础功能,大家不要着急,我会在后面的章节告诉大家怎么把这些CPU给使用起来,让自己的操作系统内核跑在如图所示的先进的CPU上面。祝大家内核学习顺利吧。

二、Bochs简介

1、什么是Bochs

        Bochs是一个完整模拟Intel x86指令集的计算机程序。它包括对Intel x86CPU、常见IO设备和自定义BIOS的仿真,除了IntelCPU之外还有AMD处理器的支持。Bochs拥有标准PC外设的设备模型:鼠标、键盘、VGA卡/显示器、磁盘、定时器芯片、网卡等。

Bochs最早由Kevin Lawton大佬于1994年开始编写,2000年3月,Bochs以LGPL协议开源出来。

它一开始使用svn集中式版本管理工具,现在已经改成了Git分布式版本管理来管理项目。

  LGPL协议:This library is free software; you can redistribute it and/ormodify it under the terms of the GNU Lesser General PublicLicense as published by the Free Software Foundation; eitherversion 2 of the License, or (at your option) any later version.This library is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNULesser General Public License for more details.You should have received a copy of the GNU Lesser General PublicLicense along with this library; if not, write to the Free SoftwareFoundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA

2、Bochs能在哪些机器上运行

        Bochs使用C++编程语言编写,由于C++具有跨平台性,因此Bochs可以在x86,PPC,Alpha,Sun,MIPS等指令集的CPU上面运行。Bochs是一个单纯的模拟器、它不是虚拟机,它的指令集的实现并不依赖于宿主机本身拥有的指令集,也就是不使用VMX等虚拟化指令集的支持。Bochs支持x86的高度仿真,也就是可以把它当成一台物理机器,拥有自己的BIOS。

bochs实际上提供了源码包、exe文件和rpm包,其中最重要的就是源代码。有了源代码,Bochs可以拿来跑在很多机器上,只是可能需要自己去编译和构建。

3、Bochs模拟器适合哪些人使用

  实际上Bochs完全可以拿来当成一个“虚拟机”,比如在没有Windows生态的机器上跑Windows操作系统。不过我是站在内核开发者的角度来看,更多把Bochs作为一个能够模拟真实PC环境的仿真工具。实际上Bochs在为indows、Linux、MacOS都可以跑,由于我没有其中一些设备,因此我就在GNU/Linux上面使用Bochs作为例子。

三、准备使用Bochs

1、下载Bochs的源代码        

  Bochs模拟器有很多版本,从最开始的1.0版本到现在最新的2.8版本,大家需要选择一个合适的版本,不同版本有不同的特点,使用的配置文件的语法也不尽相同,如果大家知道自己需要哪一个版本就最好,如果大家不知道该选择哪一个版本那么我推荐大家使用Bochs-2.8也就是最新的版本,我也是按照这个版本的文档写成的中文文档。

点进Bochs2.8这个目录,可以看到提供了很多不同的包,那么我们这里选择下载源码包,名称中带有src的就是源码包。.zip源码包带有msvc字样,应该是给Windows用的。我主要在Linux上写内核,因此会选择bochs-2.8.tar.gz.

2、解压并观察源代码

tar -xvf bochs-2.8.tar.gz

解压后会在tar包所在目录产生一个新目录bochs-2.8

我们不要急着就开始配置和编译,而是要先观察。

文件/目录作用
configure非常重要的shell脚本,配置的时候执行它
Makefile.in根据configure脚本的配置 生成最终的Makefile文件
install-sh用于在安装过程中复制文件
main.ccBochs的主程序入口点
bios目录包含Bochs使用的BIOS文件
gui目录Bochs支持图形界面调试(不过我更喜欢字符界面调试)

我们在最终执行make install之前实际上要稍微修改一些文件才能编译通过,否则可能会出现错误,因此需要简单了解一下目录里面的构成。

3、配置Bochs

  这一步可以说是最重要的,我们怎么配置Bochs,那么最终构建出来的Bochs就会具有什么样的能力;或者说关闭一些配置,那么Bochs就会失去什么样的能力。
我们在执行make install 之前执行./configure,但不是直接这么执行就好,而是要自己配置。

比如./configure --with-x11 ....等一系列配置

平台相关的配置

PlatformGUI说明
Win32/MinGW--with-win32Windows平台带上这个参数
MacOS/Darwin--with-carbonMac平台带上这个参数
MacOS9--with-macos这应该比较老了
AmigaOS--with-amigaos我不了解这个系统
带有x显示服务器的Linux--with-x11Linux上用这个参数

虽然说是需要带有x显示服务器的Linux用--with-x11,但实际上只要是Linux就用这个参数就好了,Bochs是可以跑在Xwayland上面的。

Bochs使用的图形库

由于Bochs是跑在操作系统上的,因此需要调用图形库才能使用。

显示库选项作用
--with-x11Linux上用这个
--with-win32Win32原生GUI
--with-carbon使用Carbon GUI
--with-sdl启用对SDL 1.2.x GUI接口的支持
--with-sdl2启用对SDL 2.x GUI接口的支持
--with-term需要curses库
--with-wx启用对wxWidgets配置和显示接口的支持
--with-nogui你不关心视频输出/单纯调试
--with-all-libs自动检测系统上安装的库(我没试过)

我启动了三个选项

--with-x11 --with-wx --with-sdl2
大家可以参考我的做法

Bochs通用配置

这会是一个大的表格,如果大家没有耐心看了,那么可以直接参考我的做法

通用选项默认情况说明

--enable-plugins

启用插件支持

--enable-debugger

Bochs内置调试器,默认关闭因此使用包管理器安装的Bochs不带调试功能

--enable-debugger-gui

开(如果debugger开)有图形界面的调试器

--enable-readline

-提供命令行编辑和历史记录功能

--enable-gdb-stub

使用gdb调试,它与--enable-debugger不兼容,并且gdb调试和smp也不兼容

--enable-docbook

-如果系统安装了docbook2html则默认开启

--enable-instrumentation=directory

仪器支持

--enable-xpm

XMP

--enable-show-ips

启用测量IPS(每秒指令数)的日志记录功能

--enable-logging

运行时记录日志

--enable-cpp

将所有.cc文件重命名为.cpp

--enable-idle-hack

保持Bochs响应性(Bochs不占用过量的系统资源)

--enable-assert-checks

-BX_ASSERT事件在断言失败时会导致panic

我的做法:除了--enable-docbook,全开

CPU与内存配置

配置参数默认情况说明

--enable-cpu-level={3,4,5,6}

6386/486/586/686及以上(你选6就好)

--enable-smp

对称多处理器支持

--enable-fpu

浮点运算单元

--enable-3dnow

AMD的指令集

--enable-vmx

支持Intel虚拟化扩展(VMX)

--enable-svm

支持AMD SVM(安全虚拟机)扩展模拟

--enable-avx

支持AVX指令集

--enable-x86-debugger

支持x86调试器

--enable-monitor-mwait

支持MONITOR/MWAIT指令

--enable-alignment-check

-如果CPU级别大于4则开启(支持CPU中的对齐检查和#AC异常)

--enable-configurable-msrs

支持用户配置模拟的MSR

--enable-long-phy-address

支持大于32位的客户物理地址

--enable-a20-pin

支持A20引脚

--enable-large-ramfile

支持大于主机支持的客户内存

--enable-repeat-speedups

启用对重复I/O和内存复制加速的支持

--enable-fast-function-calls

启用对快速函数调用的支持

--enable-handlers-chaining

启用对处理程序链优化的支持

--enable-all-optimizations

开启所有开发者认为安全使用的速度优化选项:--enable-repeat-speedups--enable-fast-function-calls--enable-handlers-chaining

我的做法:全部打开

对设备的模拟支持

配置选项默认情况说明

--enable-cdrom

启用对真实CD-ROM/DVD驱动器的使用

--enable-sb16

启用Sound Blaster模拟,可用的低级声音接口会自动检测。

--enable-es1370

启用ES1370声音模拟

--enable-gameport

启用标准PC游戏端口

--enable-ne2000

启用NE2000网络卡支持

--enable-pnic

启用PCI伪NIC(网络卡)支持

--enable-e1000

启用Intel(R) 82540EM千兆以太网适配器支持

--enable-clgd54xx

启用Cirrus Logic GD54xx(CL-GD5430 ISA或CL-GD5446 PCI)视频卡支持

--enable-voodoo

启用实验性的3dfx Voodoo Graphics模拟。Voodoo1已知可以工作,Voodoo2支持尚未完成,但几乎可用

--enable-iodebug

跟随debuggerDave Poirier编写了一个使用I/O端口的实验性调试器接口,使得在客户操作系统中运行的软件可以访问调试器的功能

--enable-pci

启用有限的i440FX / i430FX / i440BX PCI支持

--enable-pcidev

启用PCI主机设备映射支持

--enable-usb

启用i440FX / i440BX PCI USB支持(UHCI)

--enable-usb-ohci

启用USB OHCI支持,提供带有2端口根集线器的主控制器

--enable-usb-ehci

启用USB EHCI支持,提供带有6端口根集线器的主控制器

--enable-usb-xhci

启用USB xHCI支持,提供带有4端口根集线器的主控制器

--enable-raw-serial

启用对串行端口模拟的支持,以访问宿主的串行端口

我的做法:--enable-voodoo --enable-iodebug可以打开

其他配置你可以根据自己的情况自行配置,比如你想写USB驱动,那么就可以打开--enable-usb等

总结configure

相比大家对官方文档里的这些配置参数有了一定的了解,可以看到,参数真的非常的多,如果大家不知道哪些是自己必备的,那么你可以尽可能多的选择一些参数,编译出来你不使用也是可以的。但是如果你参数加少了,那么你就得重新编译了,这样得不偿失。

这里我提供我自己的configre

./configure --with-x11 --with-wx --with-sdl2 --enable-plugins --enable-debugger --enable-debugger-gui --enable-readline --enable-xpm --enable-show-ips --enable-logging --enable-assert-checks --enable-cpp --enable-idle-hack --enable-cpu-level=6 --enable-smp --enable-fpu --enable-3dnow --enable-x86-64 --enable-vmx --enable-svm --enable-avx --enable-x86-debugger --enable-monitor-mwait --enable-alignment-check --enable-configurable-msrs --enable-long-phy-address --enable-a20-pin --enable-large-ramfile --enable-repeat-speedups --enable-fast-function-calls --enable-handlers-chaining --enable-all-optimizations --enable-cdrom --enable-sb16 --enable-es1370 --enable-gameport --enable-ne2000 --enable-pnic --enable-e1000 --enable-clgd54xx --enable-voodoo --enable-iodebug --enable-pci --enable-pcidev --enable-usb --enable-usb-ohci --enable-usb-ehci --enable-usb-xhci --enable-raw-serial --enable-vmx=2  --prefix=/home/april_zhao/bochs

大家可以看到我还添加了一个参数--prefix=directory

这里最重要的一点我在前面的表格里已经提到了:--enable-gdb-stub这个参数和--enable-debugger是不能共存的,也就是你要么使用bochs自带的调试工具,要么使用gdb远程调试,不可兼得。并且gdb调试是不能够开启smp的,也就是--enable-gdb-stub和--enable-smp不能共存。

因此我在这里推荐,尽量使用bochs自带的调试工具吧,除非你的内核不需要开启smp或者你不需要多核处理器的支持。

这个参数就是给Bochs安一个家,否则会放置到默认的FHS位置,由于我在调试内核的时候可能会使用不同版本和编译参数的Bochs,因此我不会去使用系统全局的Bochs而是我项目本地的Bochs,因此放置到一个我自己创建的目录里。

做好这一些配置之后,大家千万不要忙着直接就make install,因为这么多很有可能会出错的。

make前的准备

cp misc/bximage.cpp misc/bximage.cc
cp iodev/hdimage/hdimage.cpp iodev/hdimage/hdimage.cc
cp iodev/hdimage/vmware3.cpp iodev/hdimage/vmware3.cc
cp iodev/hdimage/vmware4.cpp iodev/hdimage/vmware4.cc
cp iodev/hdimage/vpc.cpp iodev/hdimage/vpc.cc
cp iodev/hdimage/vbox.cpp iodev/hdimage/vbox.cc
cp misc/bxhub.cpp misc/bxhub.cc
cp iodev/network/netutil.cpp iodev/network/netutil.cc

在我的配置中,我就需要做一些cp操作,修改一些c++程序的文件名,否则会导致报错,大家可以跟着这么做,然后再执行make install ,假如这么做了之后还是报错了,那么大家有可能需要更多的cp操作,同样是把.cpp文件替换成.cc文件就好。在编译过程中还会出现各种各样的错误,它们很有可能是因为你的系统缺少了某些库或者包,这就需要大家根据报错日志自行安装这些缺少的库,使用包管理器安装就好了。安装好之后再执行make install,如果还是提示同样的错误,那么你可以重新执行./configure然后再make install.

make install执行成功之后,在你的--prefix指定的目录里会出现三个新目录:bin lib share

bin目录最关键,它里面保存了几个重要二进制命令:bochs(模拟器本身)、bxhub(虚拟网络环境)、bximage(创建虚拟磁盘)。

Bochs配置文件:

你是否以为文章快结束了?不,这仅仅只是个开始。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/765119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简介:KMeans聚类算法

在机器学习中,无监督学习一直是我们追求的方向,而其中的聚类算法更是发现隐藏数据结构与知识的有效手段。聚类是一种包括数据点分组的机器学习技术。给定一组数据点,我们可以用聚类算法将每个数据点分到特定的组中。 理论上,属于同…

海量数据处理项目-学以致用-商用短链平台需求文档拆分和总结

海量数据处理项目-学以致用-商用短链平台需求文档拆分和总结

提升Midjourney风格化的三个技巧

1. 引言 在前篇博文中,我们详细讲述了Midjourney的新功能风格参考的一些基础使用方法,事实上我们可以通过控制参数和提示权重进行更多的自定义操作,在本文中,我将向大家介绍我在网上搜集到的一些提升风格化效果的三个技巧。 闲话…

怎么卸载Mybatis?(仅需三步)

解决办法如下: 第一步:选择文件→设置 第二步:找到插件→输入Mybatis找到这个标志 第三步:把这个勾勾取消掉,点击确定,就可以轻松卸载了

capl实现crc校验码计算

CAPL (Communication Access Programming Language) 是一种用于CANoe和CANalyzer工具中的脚本语言,它允许用户模拟和测试CAN网络中的ECU(Electronic Control Unit)行为。CAPL 提供了丰富的函数库来支持CAN通信的各种功能,包括发送…

hcip复习总结2(广域网与OSPF)

数据链路层面: 针对不同的物理链路定义不同的封装 局域网封装: Ethernet 2 ( TCP/IP ) , IEEE802.3 ( OSI ) 广域网封装: PPP HDLC FR ATM HDLC : 高级数据链路控制协…

备考ICA----Istio实验7---故障注入 Fault Injection 实验

备考ICA----Istio实验7—故障注入 Fault Injection 实验 Istio 的故障注入用于模拟应用程序中的故障现象,以测试应用程序的故障恢复能力。故障注入有两种: 1.delay延迟注入 2.abort中止注入 1. 环境准备 kubectl apply -f istio/samples/bookinfo/platform/kube/…

PTA题解 --- 阶梯电价(C语言)

今天是PTA题库解法讲解的第五天,今天我们要讲解A-B,题目如下: 解题思路: 要解决这个问题,我们可以编写一个C语言程序,首先判断输入的月用电量是否有效(即大于等于0)。如果有效&…

对高阶组件的理解?应用场景?

1. 是什么 高阶函数(Higher-order function),至少满足下列一个条件的函数 接受一个或多个函数作为输入输出一个函数 在React中,高阶组件即接受一个或多个组件作为参数并且返回一个组件,本质也就是一个函数,并不是一个组件 const Enhanced…

多态样式stateStyles=>鸿蒙

属性:stateStyles() 参数 描述 normal 组件无状态时的样式(默认状态) pressed 组件按下状态的样式 disabled 组件禁用状态的样式 focused 组件获焦状态的样式 clicked 组件点击状态的样式 Entry Component struct Index {State message: st…

面试笔记——MySQL(主从同步原理、分库分表)

主从同步原理 主从同步结构:主库负责写数据,从库负责读数据,如图—— MySQL主从复制的核心就是二进制日志(BINLOG),它记录了所有的 DDL(数据定义语言)语句和 DML(数据操…

Linux centos7安装nginx-1.24.0并且实现自启动

1.安装之前的操作 ps -ef|grep nginx 查看是否有运行 如果有就杀掉 kill -9 pid find / -name nginx 查看nginx文件 rm -rf file /usr/local/nginx* 通通删掉删掉 yum remove nginx 限载一下服务 1.2.下载安装包 地址 nginx: download 2.减压文件 tar…

npm audit fix --force

npm audit fix --force是npm的一个命令,用于自动修复包中的安全漏洞。 其中: - npm audit:审查项目中的依赖包,检查是否存在已知的安全漏洞。 - fix:自动安装相关的补丁来修复发现的漏洞。 - --force:强制安装补丁版本,即使出现不兼容也强制更新。 所以npm audit fix --fo…

发现了一个限免的GPT体验入口,不要太方便

你是否苦恼没有渠道接触最牛的AI? 最近,一个限免的GPT体验站火了。 无论你用它写文案、做PPT、写代码、调bug、还是画图,都不再需要以往繁琐的步骤了,直接上去一键用就行了。 GPT-3.5研究测试: https://hujiaoai.c…

二叉树的层次遍历经典问题-算法通关村

二叉树的层次遍历经典问题-算法通关村 1 层次遍历简介 广度优先在面试里出现的频率非常高,整体属于简单题。广度优先又叫层次遍历,基本过程如下: 层次遍历就是从根节点开始,先访问根节点下面一层全部元素,再访问之后…

stable diffusion 提示词进阶语法-年龄身材肤色-学习小结

stable diffusion 提示词进阶语法-年龄&身材&肤色 前言年龄提示词青年(18-25岁)幼年、少年(1-18)中年(35-60岁)老年(65-80岁 老爷爷 老奶奶) 身材提示词肤色关键词(人物基础…

Ubuntu 22.04安装Python3.10.13

Ubuntu最好设置为英文,我之前用中文在make的test的时候,总是会有fail。 查了下有人怀疑是language的问题,保险起见都用英文,个人实践也证明改为英文就不报错了。 issue 44031: test_embed and test_tabnanny fails if the curre…

删除了几个月的照片能找回么 怎么找回半年前删除的照片 数据恢复软件推荐

照片定格了风景,保存了记忆,是我们对过往的一种留念。在数字化的今天,我们越来越习惯把照片存放在电脑里面,随着占用的空间越来越大,我们也会经常处理不用的照片。当然,难免有时候也会误删有用的照片。本篇…

js定时器功能

js定时器功能 定时器返回值:是一个正整数,表示由 setTimeout() 调用创建的定时器的编号。这个值可以传递给 clearTimeout() 来取消该定时器。 var st;var sp; function start(){stsetTimeout("test()",3000); //3s后执行test,返…

AcWing 528. 奶酪 (并查集)

记录此题主要是明确两点: 强制转long long的时候只会影响乘法,如果是加法的话就要在每个乘的前面都加上long long,否则无法达到要求。在使用并查集来做连通问题时,可以设出两个不影响其他数据的点来代表想要连通的两个地方 现有一…