前言

去年就开始学习Orange’s:一个操作系统的实现,今年记录并总结一下学习中遇到的一些问题,由于我汇编基础几乎为0,对计算机也不是很了解,所以写的这些注释和总结难免会有错误和纰漏,敬请原谅。此篇笔记抄的书上的代码已经实际运行过了,有可能后期添加注释的时候出现bug,如果运行不起来,可以删除所有注释再运行。此篇笔记去年参考了很多文章,可能我现在找不全了,等后续有时间我再把参考文章写在对应位置。如果笔记有侵权的地方,请联系我我会删除。

代码实现了什么

代码实现了操作系统从实模式跳转到保护模式,在保护模式下显示一个红色的“P”

操作流程

  1. 编写pmtest1.asm(可以直接复制粘贴下面的代码)
  2. 在相同文件夹下编写pm.inc(可以直接复制粘贴下面的代码)
  3. 使用NASM汇编pmtest1.asm,在终端输入下面指令
nasm pmtest1.asm -o pmtest1.bin

编译完成后会出现一个pmtest1.bin
4. 编写bochsrc(参考学习笔记1中进行修改)

#Configuration file for Bochs#howmuch memory the emulated machine will have
megs:32#filenameof ROM images
romimage: file=/usr/local/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest
#whatdisk images will be used
floppya:1_44=a.img, status=inserted
#choosethe boot disk.
boot: floppy
#wheredo we send log messages
log: bochsout.txt
#disablethe mouse
mouse: enabled=0#enablekey mapping, using US layout as default
keyboard:keymap=/usr/local/share/bochs/keymaps/x11-pc-us.map
  1. 生成一个虚拟软盘
bximage

参考下图选择配置

执行完上述流程后,文件目录下会出现一个a.img

  1. 将生成的二进制导入a.img
dd if=pmtest1.bin of=a.img bs=512 count=1 conv=notrunc
  1. 启动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;