在Mac上使用以下命令安装:
brew install bochs
每个章节下的bios配置部分应视bochs的具体版本而定,可自行修改:
# 对应真实机器的bios
romimage: file=/usr/local/Cellar/bochs/2.6.9_2/share/bochs/BIOS-bochs-latest
# 对应真实机器的VGA bios
vgaromimage: file=/usr/local/Cellar/bochs/2.6.9_2/share/bochs/VGABIOS-lgpl-latest
每个章节下的代码均可以独立运行,在对应的目录下执行以下命令即可启动:
./build.sh
即可启动执行。完毕之后可执行以下命令清理环境:
./clean.sh
有以下几点需要注意:
书中的源码boot.inc的DESC_LIMIT_VIDEO2定义可能有误,应修改为:
DESC_LIMIT_VIDEO2 equ 00000000000000000000000000001011b
原因是保护模式的基地址是0xb8000,所以最后8位应该是b,而不是0,这样才能正确显示字母'P'。
第164页的图4-11同样有问题,第4个GDT表项(显存)的base应该等于0xb8000,因为如果是图中的0xc00b8000,那么对应的物理内存地址是3072MB处,明显不合理。
Mac上的nasm并不支持数字中间以下划线分割的写法,会出现编译错误。
第161页代码4-3的21行为:
times 60 dq 0
Apple版本的nasm这样写会报错,原因是不能把int型的0赋给dq。稍加变通即可:
times 120 dd 0
这里对书中源码进行了改造,只使用e820一种方式,检测失败时会在第一行显示字符串: 'failed',成功将在第二行显示: 'done',如下图:
内存检测的结果通过命令: x /4wx 0xb00
查看,如下图:
结果正是我们设置的内存大小: 32MB,无误。
这一节注意要和前面的保护模式、内存检测部分结合起来。
由于此时没有可以用于打印的手段,所以正确性需要到下一章节验证。此部分需要使用Linux交叉编译器中的ld命令才可以正常链接,Mac自带的无法使用,Mac上的安装参考:
这里是打印字符和打印字符串两者结合的效果,这里遇到了一个奇怪的问题,如果在main.c中存在除main之外的其它函数,那么实验结果将不正确,原因未知。
实验中的中断号与书中不同。
注意, 在64位Linux系统上编译时有几点需要注意:
GCC加上参数:
-m32 -fno-stack-protector
LD增加参数:
-m elf_i386
在Ubuntu上使用apt安装的bximage版本较老, 创建镜像的命令为:
bximage -hd -mode=flat -size=10 -q disk.img
注:上一节中内存池初始化代码有一个bug:用户内存池其实地址应该是0xc009a1e0,已在此节修正。
这部分两次上下文切换的过程较难理解,整理成如下的时序图:
注意:
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。