第三章第一节代码运行实录
前言
去年就开始学习Orange’s:一个操作系统的实现,今年记录并总结一下学习中遇到的一些问题,由于我汇编基础几乎为0,对计算机也不是很了解,所以写的这些注释和总结难免会有错误和纰漏,敬请原谅。此篇笔记抄的书上的代码已经实际运行过了,有可能后期添加注释的时候出现bug,如果运行不起来,可以删除所有注释再运行。此篇笔记去年参考了很多文章,可能我现在找不全了,等后续有时间我再把参考文章写在对应位置。如果笔记有侵权的地方,请联系我我会删除。
代码实现了什么
代码实现了操作系统从实模式跳转到保护模式,在保护模式下显示一个红色的“P”
操作流程
- 编写pmtest1.asm(可以直接复制粘贴下面的代码)
- 在相同文件夹下编写pm.inc(可以直接复制粘贴下面的代码)
- 使用NASM汇编pmtest1.asm,在终端输入下面指令
nasm pmtest1.asm -o pmtest1.bin
编译完成后会出现一个pmtest1.bin
4. 编写bochsrc(参考学习笔记1中进行修改)
#Configuration 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=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
- 生成一个虚拟软盘
bximage
参考下图选择配置
执行完上述流程后,文件目录下会出现一个a.img
- 将生成的二进制导入a.img
dd if=pmtest1.bin of=a.img bs=512 count=1 conv=notrunc
- 启动bochs
在对应文件目录下输入下面一条指令
bochs
输入完成后回车,根据提示按6回车后,再输入c,bochs启动完成
代码+注释
;pmtest1.asm
%include "pm.inc"
;常量,宏,以及一些说明
org 07c00h
jmp LABEL_BEGIN
;跳转到LABEL_BEGIN处执行
[SECTION .gdt]
;GDT
;Descriptor段描述符,64位八个字节
;Descriptor的三个参数依次为段基址,段界限,属性
;在pm.inc中有三个参数如何送到对应位置的代码,所以此处直接填写即可
LABEL_GDT: Descriptor 0, 0, 0
; 空描述符
LABEL_DESC_CODE32: Des