【OS课设日志】《Orange‘S:一个操作系统的实现》第四章——让操作系统走进保护模式
实验内容:引导扇区突破512个字节的限制,将工作分给loader;加载loader进入内存并运行;将控制权交给loader。
4.1 突破512字节的限制
基本思想:将文件(Loader)通过引导扇区加载入内存,然后将控制权交给它,即可突破512字节的束缚
OS从开机到开始运行:引导 → \rightarrow →加载内核入内存 → \rightarrow →跳入保护模式 → \rightarrow →开始执行内核
4.1.1 FAT12
是文件系统(更像是磁盘组织格式),会将文件分为扇区、簇、分区
引导扇区是整个软盘的第0个扇区,扇区中有个很重要的数据结构叫BPB
根目录中的条目定义如下:
实验内容
①创建虚拟软盘x.img
bximage
②更新配置文件
###############################################################
# Configuration file for Bochs
###############################################################
# how much memory the emulated machine will have
megs: 32
# filename of ROM images
romimage: file=/home/lzp/BOCHS/bochs-2.6.9/bios/BIOS-bochs-latest
vgaromimage: file=/home/lzp/BOCHS/bochs-2.6.9/bios/VGABIOS-lgpl-latest
# what disk images will be used
floppya: 1_44=freedos.img, status=inserted
floppyb: 1_44=x.img, status=inserted
# choose the boot disk.
boot: a
# 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=/home/lzp/BOCHS/bochs-2.6.9/gui/keymaps/x11-pc-us.map
③启动Bochs,格式化B盘
bochs -f bochsrc
# 格式化B盘,注意在A盘进行操作
format b:
④创建文本文件及目录,加入x.img
此处出现无法找到 e d i t 的 b u g ,导致无法创建 . t x t 文件! \textcolor{red}{此处出现无法找到edit的bug,导致无法创建.txt文件! } 此处出现无法找到edit的bug,导致无法创建.txt文件!
解决问题后,执行下述步骤创建文件录入x.img
(即B盘):
- 切换到b盘,执行
edit river.txt
进入编辑界面 - 按
ALT + F
后选择保存
以下略
!此处出现 d i r 指令失效的情况,导致无法查看 x . i m g 软盘的文件目录 \textcolor{red}{!此处出现dir指令失效的情况,导致无法查看x.img软盘的文件目录} !此处出现dir指令失效的情况,导致无法查看x.img软盘的文件目录
解决办法:新建配置文件bochsrc.txt
,由freedos.img
启动,专门用于查看x.img
软盘目录
⑤使用二进制查看器查看x.img
偏移0x2600处的内容
输入指令
xxd -u -a -g 1 -c 16 -s +0x2600 -l 512 x.img
由根目录区起始位置加上长度得到数据区的起始位置,查看数据区启示位置数据得到:
即我们在RIVER.TXT
中输入的内容
4.1.2 DOS可识别的引导盘
编写BPB等头信息,写入软盘,即
创建一个新的软盘a.img
,将编写的boot.bin
文件写入引导扇区,以后就可以从a.img
启动
实验步骤:
①编译生成boot.bin
文件
nasm boot.asm -o boot.bin
②将文件写入引导扇区(即第一个扇区)
dd if=boot.bin of=a.img bs=512 count=1
③启动bochs
4.1.4 加载Loader入内存
文件boot.asm
编写逻辑:
- 内部包含读软盘扇区的函数(给定磁头号,磁道号,当前磁道的扇区号)
- 执行:遍历根目录区所有的扇区,将每个扇区加载入内存,从中寻找
Loader.bin
的条目,找到为止
实验环节
暂时的操作是找到Loader.bin之后进入死循环
①编译生成boot.bin
文件
nasm boot.asm -o boot.bin
②新建软盘a.img
,执行下述指令
nasm loader.asm -o loader.bin
dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc # 系统从引导扇区的boot.bin文件启动
# 将loader.bin复制到a.img的根目录之下
sudo mount -o loop a.img /mnt/floppy/ # 将a.img挂载到“/mnt/floppy/”目录之下
sudo cp loader.bin /mnt/floppy/ -v # 将loader.bin复制到上述目录下
sudo umount /mnt/floppy/ # 将a.img从上述目录卸载,整个操作相当于将loader.bin复制到a.img中
对于c文件夹
之前的boot.asm
已经获得了loader.bin
的扇区位置,接下来要做的事情是:
- 把该扇区装入内存
- 通过它找到FAT中的项(我们编写一个函数来完成该任务,输入扇区号,输出FAT中的项的值)
4.1.5 向loader交出控制权
实际上只需要一个jmp
语句跳转到loader
在内存中的位置即可
至此,任务结束
附录:Bug
1. 无法找到edit的bug,导致无法创建.txt文件
原因分析
原a.img
(即我们改名后的freedos.img
文件)中不包含edit
相关文件
edit
相关操作在c.img
中
解决办法
①下载freedos-img.tar.gz
,链接为这里,执行指令解压
tar vxzf freedos-img.tar.gz
②更改配置文件bochsrc
,使Bochs从c.img
启动
# 更改为如下内容
###############################################################
# Configuration file for Bochs
###############################################################
# how much memory the emulated machine will have
megs: 32
# filename of ROM images
romimage: file=/home/lzp/BOCHS/bochs-2.6.9/bios/BIOS-bochs-latest
vgaromimage: file=/home/lzp/BOCHS/bochs-2.6.9/bios/VGABIOS-lgpl-latest
# what disk images will be used
floppya: 1_44=freedos.img, status=inserted
floppyb: 1_44=x.img, status=inserted
ata0-master: type=disk, path=c.img, cylinders=306, heads=4, spt=17
# choose the boot disk.
boot: c
# boot: a # 此处改为从a盘启动查看目录,否则dir指令失效
# 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=/home/lzp/BOCHS/bochs-2.6.9/gui/keymaps/x11-pc-us.map
当前文件目录:
参考