失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 【实现操作系统 01】CentOS 9 安装配置 Bochs 2.7 虚拟机 及编写简单的 bootloader 并写入软盘启动

【实现操作系统 01】CentOS 9 安装配置 Bochs 2.7 虚拟机 及编写简单的 bootloader 并写入软盘启动

时间:2020-11-04 07:19:53

相关推荐

【实现操作系统 01】CentOS 9 安装配置 Bochs 2.7 虚拟机 及编写简单的 bootloader 并写入软盘启动

系统环境:

OS:CentOS Stream release 9 (cmd: cat /etc/redhat-release)

Linux Kernel:Linux 5.14.0-142.el9.x86_64 (cmd: uname -a)

1. Bochs 虚拟机

Bochs是一个开源的虚拟机软件,并且提供了利于系统开发的相关调试功能,如果你也是研究操作系统或对Linux内核感兴趣的读者,那么这款软件将会帮助你更好的调试和完善开发内容。

下载链接:

Bochs 官网:https://bochs.sourceforge.io/

Sourceforge下载:/projects/bochs/files/bochs/

Github 下载:/stlintel/Bochs

2. 编译并安装 Bochs

笔者选择在sourceforge上下载

2.2. 解压源码包

下载后需要解压源码包。

[imaginemiracle@imos-ws Downloads]$ tar -zxvf bochs-2.7.tar.gz

2.3. 安装依赖并配置 Bochs

安装相关依赖,否则配置或编译会出先缺少依赖的情况。

[imaginemiracle@imos-ws bochs-2.7]$ sudo yum install gcc-c++[imaginemiracle@imos-ws bochs-2.7]$ sudo yum install gtk2-devel[imaginemiracle@imos-ws bochs-2.7]$ sudo yum install readline-devel[imaginemiracle@imos-ws bochs-2.7]$ sudo yum install xorg-x11-server-Xdmx.x86_64

2.3.1. 使用 configure 配置生成 Makefile

进入解压后的源码目录,使用configure对源码进行配置,这里笔者使用--prefix将其安装目录配置为指定位置,不需要指定的读者可以不用加该参数。

[imaginemiracle@imos-ws bochs-2.7]$ ./configure --prefix=/pgm/bochs --with-x11 --with-wx --enable-debugger --enable-all-optimizations --enable-readline --enable-long-phy-address --enable-ltdl-install --enable-idle-hack --enable-a20-pin --enable-x86-64 --enable-smp --enable-cpu-level=6 --enable-large-ramfile --enable-repeat-speedups --enable-fast-function-calls --enable-handlers-chaining --enable-trace-linking --enable-configurable-msrs --enable-show-ips --enable-cpp --enable-debugger-gui --enable-iodebug --enable-logging --enable-assert-checks --enable-fpu --enable-vmx=2 --enable-svm --enable-3dnow --enable-alignment-check --enable-monitor-mwait --enable-avx --enable-evex --enable-x86-debugger --enable-pci --enable-usb --enable-voodoo

2.3.2. make 编译

配置没有报错后,便可以直接编译了。

[imaginemiracle@imos-ws bochs-2.7]$ make

2.3.3. 报错:No rule to make target ‘’, needed by ‘parser.o’.

编译时可能会遇到这样或类似的错误:

make[1]: *** No rule to make target '', needed by 'parser.o'. Stop.

2.3.4. 解决没有 问题

只需要将对应的.cpp文件拷贝为.cc文件即可:

[imaginemiracle@imos-ws bochs-2.7]$ cp bx_debug/parser.cpp bx_debug/

[注]:不要疑问要怎么找到复制文件的目录所在。出错行紧后会提示从出错目录退出,这个目录便是缺少文件的目录,需要复制文件的目录也就在这里了。

2.3.5. 继续 make,继续报错:fatal error: config.h: No such file or directory

继续执行make命令,但是又会出现这样的错误:提示没有找到config.h

cd bx_debug && \make libdebug.amake[1]: Entering directory '/home/imaginemiracle/Downloads/bochs-2.7/bx_debug'g++ -g -O2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES-c -o parser.o In file included from parser.y:8:debug.h:25:10: fatal error: config.h: No such file or directory25 | #include "config.h"|^~~~~~~~~~compilation terminated.make[1]: *** [<builtin>: parser.o] Error 1make[1]: Leaving directory '/home/imaginemiracle/Downloads/bochs-2.7/bx_debug'make: *** [Makefile:327: bx_debug/libdebug.a] Error 2

2.3.6. 解决没有找到 config.h 问题

关于这个头文件,我们在源码的主目录下可以看得到

[imaginemiracle@imos-ws bochs-2.7]$ lsaclocal.m4bxversion.rcconfiguregui ltdl.c osdep.cpp READMEbios bxversion.rc.in configure.in hostltdlconf.hosdep.h README-wxWidgetsbochs.h CHANGESCOPYING install-sh ltdlconf.h.in param_names.h TESTFORM.txtbuild config.cpp cpu instrument ltmain.shPARAM_TREE.txt TODObx_debug config.guesscpudb.h iodev main.cpp patches win32_enh_dbg.rcbxdisasm.cpp config.h crc.cpp libtool Makefile pc_system.cpp win32res.rcbxthread.cpp config.h.indoc LICENSE Makefile.in pc_system.hwxbochs.rcbxthread.hconfig.log docs-htmllogio.cppmemory plugin.cppbxversion.hconfig.status extplugin.h logio.h misc plugin.hbxversion.h.in config.sub gdbstub.cpp ltdl-bochs.h msrs.def qemu-queue.h

打开报错文件

[imaginemiracle@imos-ws bochs-2.7]$ vim bx_debug/debug.h

修改第25行的#include "config.h"#include "../config.h"即可。

2.3.7. 继续 make,继续报错:fatal error: osdep.h: No such file or directory 和 fatal error: cpu/decoder/decoder.h: No such file or directory

与上一个错误类似的还有两个,同样可以在主目录下找到osdep.h,因此同样打开bx_debug/debug.h#include “osdep.h”修改为#include "../osdep.h",第36行的#include "cpu/decoder/decoder.h"同样修改一下。

2.3.8. 继续 make,没错的话还会报错:No rule to make target ‘misc/’, needed by ‘misc/bximage.o’ 等一系列这样的问题

这类问题与第一个错误类似,在出错目录下也会有对应的.cpp文件,将其复制一份为.cc文件即可。

[imaginemiracle@imos-ws bochs-2.7]$ cp misc/bximage.cpp misc/[imaginemiracle@imos-ws bochs-2.7]$ cp iodev/hdimage/hdimage.cpp iodev/hdimage/[imaginemiracle@imos-ws bochs-2.7]$ cp iodev/hdimage/vmware3.cpp iodev/hdimage/[imaginemiracle@imos-ws bochs-2.7]$ cp iodev/hdimage/vmware4.cpp iodev/hdimage/[imaginemiracle@imos-ws bochs-2.7]$ cp iodev/hdimage/vpc.cpp iodev/hdimage/[imaginemiracle@imos-ws bochs-2.7]$ cp iodev/hdimage/vbox.cpp iodev/hdimage/

2.3.9. 继续 make 没错后 make install 安装

这个时候执行make应该不会有错了,执行make install命令安装。

[imaginemiracle@imos-ws bochs-2.7]$ make install

查看一下安装目录,如果使用的是默认安装目录的话,则直接键入boch然后使用tab键可以补齐。

[imaginemiracle@imos-ws ~]$ ls /pgm/bochs/bin/bochs bximage

OK,如果看到有可执行文件生成到这里的话,那就说明bochs算是安装好了。

3. 制作软盘镜像文件

我们刚安装的Bochs配带了一个叫bximage的工具,这个工具变是用来创建虚拟机镜像的。

来看具体的使用方法:

(1)直接执行bximage(如果是像笔者一样安装到指定目录的话则首先需要将其添加进 在~/.bashrc文件中,并更新环境变量source ~/.bashrc,例:export PATH=$PATH:/pgm/bochs/bin

[imaginemiracle@imos-ws img]$ bximage========================================================================bximageDisk Image Creation / Conversion / Resize and Commit Tool for Bochs$Id: 14091 -01-30 17:37:42Z sshwarts $========================================================================1. Create new floppy or hard disk image2. Convert hard disk image to other format (mode)3. Resize hard disk image4. Commit 'undoable' redolog to base image5. Disk image info0. QuitPlease choose one [0] 1

(2)这里输入1,表示选择要创建一个软盘或者硬盘,按下回车则会出现如下内容;

Create imageDo you want to create a floppy disk image or a hard disk image?Please type hd or fd. [hd] fd

(3)这里让我们选择创建的类型是软盘 (fd) 还是硬盘 (hd),这里输入fd并回车;

Choose the size of floppy disk image to create.Please type 160k, 180k, 320k, 360k, 720k, 1.2M, 1.44M, 1.68M, 1.72M, or 2.88M.[1.44M]

(4)接下来会让选择创建的软盘大小,默认值是1.44MB,这里直接回车使用默认值就好;

What should be the name of the image?[a.img] imboot.imgCreating floppy image 'imboot.img' with 2880 sectorsThe following line should appear in your bochsrc:floppya: image="imboot.img", status=inserted

(5)下一步会询问创建的软盘名字是什么,默认名为a.img,这里笔者输入的名为imboot.img,因为之后将会使用这个软盘作为一个boot程序用来启动操作系统使用。

ok,到这里软盘镜像文件创建完成。

4. Bochs 运行环境配置

Bochs的安装目录下会提供一个供我们参考的一份配置文件/pgm/bochs/share/doc/bochs/bochsrc-sample.txt,复制一份到本地来参考或者直接拷贝笔者的配置。

# Configuration file generated by Bochs#=======================================================================plugin_ctrl: unmapped=1, biosdev=1, speaker=1, extfpuirq=1, parallel=1, serial=1, iodebug=1config_interface: textconfig#display_library: wxdisplay_library: xromimage: file=$BXSHARE/BIOS-bochs-latest, options=fastbootromimage: file=/pgm/bochs/share/bochs/BIOS-bochs-latestvgaromimage: file=/pgm/bochs/share/bochs/VGABIOS-lgpl-latest# choose the boot diskboot: floppyfloppy_bootsig_check: disabled=0floppya: type=1_44, 1_44=/home/imaginemiracle/Miracle/Projects/imOS/img/imboot.img, status=inserted, write_protected=0cpu: model=corei7_haswell_4770, count=1:1:1, ips=50000000, reset_on_triple_fault=1, ignore_bad_msrs=1, msrs="msrs.def"cpu: cpuid_limit_winnt=0cpuid: x86_64=1, mmx=1, level=6, sep=1, simd=sse4_2, apic=xapic, aes=1, movbe=1, xsave=1, apic=x2apic, sha=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=1cpuid: family=6, model=0x1a, stepping=5, vendor_string="GenuineIntel", brand_string="Intel(R) Core(TM) i7-4770 CPU (Haswell)"#memory: guest=512, host=256pci: enabled=1, chipset=i440fxvga: extension=vbe, update_freq=5#voodoo: enabled=1, model=voodoo1keyboard: type=mf, serial_delay=250, paste_delay=100000, user_shortcut=nonemouse: enabled=0, type=ps2, toggle=ctrl+mbuttonclock: sync=none, time0=local, rtc_sync=0#cmosimage: file=cmos.img, rtc_init=time0private_colormap: enabled=0ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14ata0-master: type=noneata0-slave: type=noneata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15ata1-master: type=noneata1-slave: type=noneata2: enabled=0, ioaddr1=0x1e8, ioaddr2=0x3e0, irq=11ata3: enabled=0, ioaddr1=0x168, ioaddr2=0x360, irq=9boot: floppy#boot: diskfloppy_bootsig_check: disabled=0#log: /dev/nulllog: bochsout.txtlogprefix: %t%e%dpanic: action=askerror: action=reportinfo: action=reportdebug: action=ignore, pci=report # report BX_DEBUG from module 'pci'debugger_log: -#com1: enabled=1, mode=term, dev=/dev/ttyp9parport1: enabled=1, file="parport.out"#sound: driver=default, waveout=/dev/dsp. wavein=, midiout=speaker: enabled=1, mode=systemparport1: enabled=1, file=noneparport2: enabled=0com1: enabled=1, mode=nullcom2: enabled=0com3: enabled=0com4: enabled=0#e1000: enabled=1, mac=52:54:00:12:34:56, ethmod=slirp, script=slirp.confmagic_break: enabled=0#debug_symbols: file="kernel.sym"print_timestamps: enabled=1port_e9_hack: enabled=0private_colormap: enabled=0megs: 2048

需要注意的是其中有一个floppya的配置,这里的镜像大小和文件路径是之前我们使用bximage工具创建出来的imboot.img,这里的路径和大小一定要写正确,否则将无法启动。

floppya: type=1_44, 1_44=/home/imaginemiracle/Miracle/Project/imOS/img/imboot.img, status=inserted, write_protected=0

5. 写一个简单的 Boot 引导程序

新建并打开一个文件imboot.S,编写基于BIOSboot代码:

org0x7c00 ; BIOS 会加载引导程序到内存地址 0x7c00 处BaseOfStackequ0x7c00 ; 定义一个标识符 BaseOfStack,代表值 0x7c00Start:mov ax, cs; 将代码寄存器 cs 的段基地址设置到 ds、es、ss寄存器movds, axmov es, axmov ss, axmov sp, BaseOfStack; 清屏mov ax, 0600hmov bx, 0700hmov cx, 0hmov dx, 0184fhint 10h; 设置光标位置mov ax, 0200hmov bx, 0000hmov dx, 0000hint 10h; 在屏幕上打印字符串 "The imboot is working!"mov ax, 1301hmov bx, 000fhmov dx, 0000hmov cx, 22push axmov ax, dsmov es, axpop axmov bp, IMBootMessageint 10h; 软盘驱动器复位xor ah, ahxor dl, dlint 13hjmp $IMBootMessage:dd"The imboot is working!"; 填充 0 到结尾前 2 个字节times 510 - ($ - $$) db 0dw 0xaa55; BIOS会检测软盘的第 0 磁头第 1 扇区最后两个字节是否为 0x55aa(代码中写成 0xaa55 是由于x86 使用小端存储),以确定这个扇区是否是引导扇区

这段汇编代码主要使用BIOS中断服务程序int 10hint 13h完成屏幕操作和驱动器复位的功能。

通过改变保存int 10h的主功能编号的ah寄存器使用不同功能,int 13h也同样。

6. 在 Bochs 运行 Boot 程序

6.1. 下载安装 NASM 编译器

上面我们已经将代码写好了,但还未编译,编译会用到NASM编译器,先来安装它。

先安装其它依赖:如果是Ubuntu系统则可以直接使用sudo apt-get install build-essential即可

# Ubuntu 系统imaginemiracle:~$ sudo apt-get install build-essentialimaginemiracle:~$ sudo apt-get install curl# CentOS 系统[imaginemiracle@imos-ws imboot]$ sudo yum install make automake gcc gcc-c++ kernel-devel[imaginemiracle@imos-ws imboot]$ sudo yum install -y curl

下载并安装nasm编译器。

[imaginemiracle@imos-ws Downloads]$ curl -O -L https://www.nasm.us/pub/nasm/releasebuilds/2.15/nasm-2.15.tar.gz[imaginemiracle@imos-ws Downloads]$ tar -zxvf nasm-2.15.tar.gz[imaginemiracle@imos-ws Downloads]$ cd nasm-2.15/[imaginemiracle@imos-ws nasm-2.15]$ ./autogen.sh[imaginemiracle@imos-ws nasm-2.15]$ ./configure --prefix=/pgm/nasm[imaginemiracle@imos-ws nasm-2.15]$ make install

添加nasm到环境变量中vim ~/.bashrc,添加如下内容

export PATH=$PATH:/pgm/bochs/bin:/pgm/nasm/bin

更新环境变量

source ~/.bashrc

6.2. 编译程序并烧写进软盘

用刚刚安装好的nasm工具编译boot代码:

[imaginemiracle@imos-ws imboot]$ nasm imboot.S -o imboot.bin[imaginemiracle@imos-ws imboot]$ lsimboot.bin imboot.S

编译将会生成一个二进制文件,将这个文件烧写进之前制作好的imboot.img软盘中:

[imaginemiracle@imos-ws img]$ dd if=../imboot/imboot.bin of=./imboot.img bs=512 count=1 conv=notrunc1+0 records in1+0 records out512 bytes copied, 0.000104768 s, 4.9 MB/s

打开镜像文件imboot.img检验烧写或者代码编写是否正确。

[imaginemiracle@imos-ws img]$ vim imboot.img

因为文件是二进制文件,因此打开后会看到 “乱码” 的现象,没关系,使用%!xxd工具即可将其转换为16进制查看。

转换后,我们就可以看到如下内容。

我们需要检验的主要是该软盘的第一个扇区最后两个字节是否为0x55aa,这是标识着是否作为引导扇区的结尾。一个扇区大小为512字节,这里的一行有16个字节,因此第511512字节应该会出现在第32行的末尾。(512 / 16 = 32

ok,看起来我们的代码和烧写是没有问题的,可以继续下一步了。

7. 用 Bochs 启动我们的 Boot 代码

使用bochs命令并指定配置文件为之前写好的配置文件。

[imaginemiracle@imos-ws bochs-run]$ bochs -f bochsrc

运行后将会有如下输出:

========================================================================Bochs x86 Emulator 2.7Built from SVN snapshot on August 1, Timestamp: Sun Aug 1 10:07:00 CEST ========================================================================00000000000i[] BXSHARE not set. using compile time default '/pgm/bochs/share/bochs'00000000000i[] reading configuration from bochsrc00000000000i[] Ignoring magic break points------------------------------Bochs Configuration: Main Menu------------------------------This is the Bochs Configuration Interface, where you can describe themachine that you want to simulate. Bochs has already searched for aconfiguration file (typically called bochsrc.txt) and loaded it if itcould be found. When you are satisfied with the configuration, goahead and start the simulation.You can also start bochs with the -q option to skip these menus.1. Restore factory default configuration2. Read options from...3. Edit options4. Save options to...5. Restore the Bochs state from...6. Begin simulation7. Quit nowPlease choose one: [6]

这里默认的选择是6,正是开始运行我们给的镜像文件,因此这里直接输入回车即可。

这个时候应该会看到一个黑屏的界面,这个时候需要继续在命令行中输入ccontinue来告诉bochs运行boot程序。

这个时候可以看到代码中的字符串The imboot is working!已经被打印了出来,就说明Boot程序已经执行了。

#本文完

到此你已经掌握了BIOSboot程序的工作流程,以及在虚拟机上的实际模拟。

觉得这篇文章对你有帮助的话,就留下一个赞吧^v^*

请尊重作者,转载还请注明出处!感谢配合~

[作者]: Imagine Miracle

[版权]: 本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

[本文链接]: /qq_36393978/article/details/126260487

如果觉得《【实现操作系统 01】CentOS 9 安装配置 Bochs 2.7 虚拟机 及编写简单的 bootloader 并写入软盘启动》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。