《一个操作系统的实现》windows用vm安装CentOS——从bochs环境搭建到第一个demo跑通

  1. vm安装CentOS虚拟机带有桌面的版本。
  2. su输入密码123456。更新yum -y update 。一般已经安装好后面这2个工具:yum install -y net-tools wget
  3. 看下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:~
  4. 安装bochs。tar -zvxf bochs-2.7.tar.gzcd bochs-2.7,安装过程主要参考这两篇文章:最新Linux(centos)安装bochs【实现操作系统 01】CentOS 9 安装配置 Bochs 2.7 虚拟机,及编写简单的 bootloader 并写入软盘启动
sql 复制代码
// 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
  1. 生成个软盘镜像。在家目录bximage,选择创建软盘fd其他默认,成功后目录中出现a.img文件。
  2. 按照书上的,编写asm代码,vi boot.asm
sql 复制代码
        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处的?请看第一行代码!
  1. 安装nasm。
sql 复制代码
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
  1. 编译代码: nasm boot.asm -o boot.bin
  2. 写进软盘镜像: dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
  3. 配置文件,在家目录中vi bochsrc
sql 复制代码
################################################
#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
  1. 在家目录启动bochs -f bochsrc,后面是指定配置文件,其实可以省略,因为bochs会默认从几个目录中找配置文件。询问操作时默认或按6,之后按c表示continue?就启动了,虽然这个启动界面有些奇怪,但至少显示了自定义的信息。

  2. 上面制作并把数据写到a.img镜像后,可以vi查看这个文件,输入命令%!xxd可以以16进制查看,这时候32行末尾即512字节处最后2个字节就是55aa,即我们程序最后一行的dw 0xaa55

相关推荐
人工智能训练2 小时前
OpenEnler等Linux系统中安装git工具的方法
linux·运维·服务器·git·vscode·python·ubuntu
蒜丶3 小时前
Windows 11 22H2 跳过联网激活
windows
QT 小鲜肉3 小时前
【Linux命令大全】001.文件管理之which命令(实操篇)
linux·运维·服务器·前端·chrome·笔记
oMcLin4 小时前
Ubuntu 22.04 无法连接外部网络的故障排查与解决(解决 DNS 配置问题)
linux·网络·ubuntu
还不秃顶的计科生4 小时前
LeetCode 热题 100第二题:字母易位词分组python版本
linux·python·leetcode
咯哦哦哦哦4 小时前
WSL + ubantu22.04 + 远程桌面闪退+黑屏闪退解决
linux·开发语言
fantasy5_55 小时前
Linux 动态进度条实战:从零掌握开发工具与核心原理
linux·运维·服务器
weixin_462446235 小时前
exo + tinygrad:Linux 节点设备能力自动探测(NVIDIA / AMD / CPU 安全兜底)
linux·运维·python·安全
..过云雨5 小时前
17-2.【Linux系统编程】线程同步详解 - 条件变量的理解及应用
linux·c++·人工智能·后端
oMcLin5 小时前
CentOS 7 频繁出现 “Connection Refused” 错误的原因分析与解决
linux·运维·centos