《一个64位操作系统的设计与实现》第一部分 第二部分 环境搭建和boot引导程序

Posted by 橙叶 on Fri, May 15, 2020

这次也没什么营养,主要是先把环境搭起来,然后试着跑一下boot引导。

书上给的环境是CentOS6,编译安装bochs。我在Ubuntu上编译,如我所预料的各种报错,烦不胜烦,干脆用apt安装

sudo apt-get install bochs

Intel x64 体系结构 寄存器集

书中的BootLoader部分用Intel汇编语言编写。先简单说一下寄存器部分,内容参考自Introduction x64 Assembly,暂时只用到通用寄存器。

8比特为一字节,16比特位一个字,32比特为一个双字,64比特是一个4字,128比特是一个双八字。小端字节序。

如图,前8个寄存器(RAX,RBX,RCX,RDX,RBP,RSI,RDI,RSP)和后8个寄存器(R8,R9,R10,R11,R12,R13,R14,R15)

寄存器的命名

前八个寄存器: 来自简书

  • RAX Accumulator Register 累加器
  • RBX Base Register 基寄存器
  • RCX Counter Register 计数寄存器
  • RDX Data Register 数据寄存器
  • RSI Source Index
  • RDI Destination Index
  • RBP Base Pointer
  • RSP Stack Pointer

对于前8个寄存器

将开头的R替换为E,访问低32bits (如RAX->EAX);

对于RAX、RBX、RCX、RDX寄存器,

  • 去掉开头的R,访问低16bits (如RAX->AX);
  • 在访问16bits的基础上,将X替换为L(如AX->AL)访问低8bits,也就是最低的一字节
64-bit register Lower 32 bits Lower 16 bits Lower 8 bits
rax eax ax al
rbx ebx bx bl
rcx ecx cx cl
rdx edx dx dl
rsi esi si sil
rdi edi di dil
rbp ebp bp bpl
rsp esp sp spl
r8 r8d r8w r8b
r9 r9d r9w r9b
r10 r10d r10w r10b
r11 r11d r11w r11b
r12 r12d r12w r12b
r13 r13d r13w r13b
r14 r14d r14w r14b
r15 r15d r15w r15b

安装Bochs

看到Bochs的图表,猛然会想起从前在安卓手机上跑win95的搞机的日子……

先试一下编译安装,环境是Ubuntu 20.04,新装的需要先安装gcc和g++

sudo apt-get install g++ gcc

从bochs官网上下载源码: Bochs,链接在页面最底下的TAR file containing source code (5158k),下载完后解压,进入解压得到的文件夹。

安装libxrandr和xorg

sudo apt-get install libxrandr-dev
sudo apt-get install xorg-dev

然后需要复制一些文件,不然会出现make: *** No rule to make target 'misc/bximage.cc', needed by 'misc/bximage.o'. Stop.这样的问题。(内容来自原书),

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-img.cpp iodev/hdimage/vpc-img.cc
cp iodev/hdimage/vbox.cpp iodev/hdimage/vbox.cc

然后开始着手编译:

编译配置:

./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-plugins --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

编译(新安装的Ubuntu需要先安装make)

make
sudo make install

编译完成后,试一下能不能用

apt安装的话,可能存在版本的问题,没法使用书上附带的配置文件,操作上也有些许出入,还是建议编译安装。

编译boot.asm

这一部分照着书上操作,没出现什么问题,运行效果如图

boot.asm

最开始boot.asm的内容很简单,调用BIOS中断服务来显示文字。 话说回来,之前学习《计算机组成与设计》的时候,书里也讲汇编,不过是MIPS,但是一直是纸上谈兵。现在有了环境,不管是什么汇编,先把玩一下再说。

简单修改一下,让界面显示AB

感觉后面的内容还是挺难的,得找个时间对着代码好好捋一捋。



comments powered by Disqus