- vm安装CentOS虚拟机带有桌面的版本。
su
输入密码123456
。更新yum -y update
。一般已经安装好后面这2个工具:yum install -y net-tools wget
。- 看下ip地址
ifconfig
,然后本地终端连接ssh root@192.168.249.132
输入密码即可,主要是为了复制网址方便些。大概率wget https://nchc.dl.sourceforge.net/project/bochs/bochs/2.7/bochs-2.7.tar.gz
无法下载bochs,所以直接下载到本地然后复制过去scp .\bochs-2.7.tar.gz root@192.168.249.132:~
。 - 安装bochs。
tar -zvxf bochs-2.7.tar.gz
,cd bochs-2.7
,安装过程主要参考这两篇文章:最新Linux(centos)安装bochs和【实现操作系统 01】CentOS 9 安装配置 Bochs 2.7 虚拟机,及编写简单的 bootloader 并写入软盘启动
// 1、先安装依赖
yum install gcc-c++ glibc-headers
yum install libX11-devel.x86_64
yum install libXrandr-devel.x86_64
yum install -y epel-release
// 2.configure
./configure --with-x11 --with-wx --enable-debugger --enable-disasm --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
// 3.修改文件cpp为cc且修改配置文件路径
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 bx_debug/parser.cpp bx_debug/parser.cc
vi bx_debug/debug.h
修改:
#include "config.h"为#include "../config.h"
#include “osdep.h"为#include "../osdep.h"
#include "cpu/decoder/decoder.h"为#include "../cpu/decoder/decoder.h"
make
make install
- 生成个软盘镜像。在家目录
bximage
,选择创建软盘fd其他默认,成功后目录中出现a.img文件。 - 按照书上的,编写asm代码,
vi boot.asm
。
org 07c00h ;org指令规定程序的起始地址,不规则则默认是0000h
mov ax,cs
mov ds,ax
mov es,ax
call DispStr
jmp $ ;$表示当前行地址,所以这是无限循环
DispStr:
mov ax,BootMessage
mov bp,ax
mov cx,16
mov ax,01301h
mov bx,000ch
mov dl,0
int 10h
ret
BootMessage: db "Hello,OS World!"
times 510-($-$$) db 0 ;一共512字节,最后2字节写0xaa55,所以中间插入很多0字节,数量就是512-2-上面那段代码占用的字节(当前行地址-这一节开头地址即程序初地址)
dw 0xaa55 ;最后补这个是由于加电自检后寻找启动盘会优先查找软盘0面0磁道1扇区(1扇区512字节),并发现如果扇区最后字节以0xaa55结尾则认为这是引导扇区,并把这512字节数据复制到0000:7c00处并把控制交由这段引导程序,即我们这段程序,那我们这段程序怎么跑到7c00处的?请看第一行代码!
- 安装nasm。
sudo yum install automake gcc kernel-devel
wget https://www.nasm.us/pub/nasm/releasebuilds/2.15/nasm-2.15.tar.gz
tar -zvxf nasm-2.15.tar.gz
./autogen.sh
./configure
make && make install
- 编译代码:
nasm boot.asm -o boot.bin
- 写进软盘镜像:
dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
- 配置文件,在家目录中
vi bochsrc
。
################################################
#configure file for Bochs
################################################
# how much memory the emulated machine will have
megs: 32
# filename of Rom images, 注意下边要根据你安装目录来调整
romimage: file=/usr/local/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest
#what disk images will be used
floppya: 1_44=/root/a.img, status=inserted
#choose the boot disk.
boot: floppy
#where do we send log messages?
log: bochsout.txt
#disable the mouse
mouse: enabled=0
# enable key mapping, using US layout as default.
keyboard: keymap=/usr/local/share/bochs/keymaps/x11-pc-us.map
-
在家目录启动
bochs -f bochsrc
,后面是指定配置文件,其实可以省略,因为bochs会默认从几个目录中找配置文件。询问操作时默认或按6,之后按c
表示continue?就启动了,虽然这个启动界面有些奇怪,但至少显示了自定义的信息。
-
上面制作并把数据写到a.img镜像后,可以vi查看这个文件,输入命令
%!xxd
可以以16进制查看,这时候32行末尾即512字节处最后2个字节就是55aa,即我们程序最后一行的dw 0xaa55
。