【OS课设日志】《Orange‘S:一个操作系统的实现》Ch4

【OS课设日志】《Orange‘S:一个操作系统的实现》第四章——让操作系统走进保护模式

实验内容:引导扇区突破512个字节的限制,将工作分给loader;加载loader进入内存并运行;将控制权交给loader。

4.1 突破512字节的限制

基本思想:将文件(Loader)通过引导扇区加载入内存,然后将控制权交给它,即可突破512字节的束缚

OS从开机到开始运行:引导 → \rightarrow 加载内核入内存 → \rightarrow 跳入保护模式 → \rightarrow 开始执行内核

4.1.1 FAT12

是文件系统(更像是磁盘组织格式),会将文件分为扇区、簇、分区

引导扇区是整个软盘的第0个扇区,扇区中有个很重要的数据结构叫BPB

FAT12格式软盘

根目录中的条目定义如下:
根目录区中的条目格式

实验内容

①创建虚拟软盘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文件! } 此处出现无法找到editbug,导致无法创建.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

当前文件目录:
在这里插入图片描述

参考

一个操作系统的实现–freedos中edit问题_freedos edit.exe_T_Megan的博客-CSDN博客

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值