Lazy loaded image
技术分享
操作系统实验
00 分钟
2024-4-25
2024-10-28
type
status
date
slug
summary
tags
category
icon
password

参考资料

实现案例:
自己动手写操作系统书籍
作者的官网:有相关代码仓库地址

环境搭建

可能出现的问题:运行bochs -f bochsrc后,终端输入c命令,窗口仍然是黑色的,无法启动。
这可能是因为bochs窗口没有正确地加载虚拟机镜像。你可以尝试重新启动bochs并确保配置文件中指定了正确的虚拟机镜像文件。另外,你也可以尝试在启动bochs后手动加载虚拟机镜像,例如在bochs窗口中输入命令floppy_insert boot.img或者ata0-master: type=disk, path="hdd.img", mode=flat, cylinders=130, heads=16, spt=63(具体命令取决于你的虚拟机镜像文件类型和路径)
搭建环境参考:
关闭程序方法:如果像我一样一开始找不到UI按钮,可在bochs命令行输入q或者直接杀死进程:
更优雅的方式:点击界面上的power按钮退出虚拟机

第一,二章示例

几个地方要改一下:
应该是版本过于老旧的问题,有些文件目录结构变化了,同时keyboard这一配置的格式也发生了变化
没有问题后运行make,在终端键入c开启虚拟机:
notion image

第三章示例

在freedos上运行程序,实现保护模式切换

运行与结果

首先下载freedos:
解压并准备好img文件
把bochsrc文件放入这个项目文件夹,添加freedos对应信息:
启动:
notion image
格式化b盘:
退出,进行挂载操作,把编译好的程序放进去:
可以看到红色的字符显示了出来,内容有:in protect mode now
notion image
注意本次使用的是于渊仓库中的b程序,和书上的示例有一点点不同,其他的程序也可以尝试一下。

代码解析


首先可以看到,代码用宏创建了一个名为GDT的数据结构,其中Descriptror是在头文件pm.inc中定义的宏
解释一下GDT这个数据结构是什么:首先我们知道,在保护模式下CPU的寻址能力变得十分强大,而这正依赖于GDT表,GDT的表项被称为描述符Descriptor(如下代码),表项中详细定义了段的起始地址,属性,界限等。也就是说,原本的段+偏移的寻址方式,在保护模式下(段)有了新的意义,CPU可以从GDT中获得段的信息
GDT表项目具体情况如图所示:
notion image
接着代码又通过GDT选择子实现将一系列地址导入寄存器,最终实现跳转,GDT选择子可以简单理解为一个相对于GDT基地址的一个偏移:
接下来就是具体的步骤了,这里有几个关键操作,先将GDT数据结构的地址导入寄存器,接着关闭中断,防止可能产生的额外影响,接着打开A20,这涉及一个历史设计,打开地址线A20能开放寻址范围(>1MB),最后是将cr0的0位进行置1操作。准备完毕,运行跳转指令就成功了

实验任务1

创建两个进程交替显示

运行与结果

创建了两个任务,交替显示HUST和JACK:
notion image

代码解析

源码

解释

前半部分和第三章示例是有共通之处的,都定义了GDT数据结构和GDT选择子,用于进行一些实模式到保护模式的切换,这其中原理前文已经详细解释,这里略去。
但是这一次不只是需要GDT数据结构,一共需要定义三个数据结构如下所示:
  1. GDT(全局描述符表):GDT 存储了各种段的描述符,如代码段、数据段等。在这个汇编代码中,GDT 的一些描述符被定义了,比如代码段、数据段等。每个描述符包括段基址、段限长和一些属性信息
  1. IDT(中断描述符表):IDT 存储了处理器对各种中断和异常的响应程序的入口地址。在这个代码中,IDT 中预留了 255 个中断门,用于处理各种中断事件,因为保护模式下的中断表已经被IDT代替了
  1. TSS(任务状态段):TSS 是保护模式下任务切换时需要的一种数据结构,其中保存了任务的上下文信息。在这段代码中,定义了两个 TSS,分别用于任务 A 和任务 B。每个 TSS 中包含了任务的各种寄存器的状态信息,包括代码段、数据段等的选择子
核心功能的实现代码在这一段:
首先是准备好了GDT数据结构用于32位保护模式寻址,接着在IDT中定义相关中断服务,利用计时器中断的机制实现两个任务的切换,任务的信息存储在TSS中,配置tr执行任务,这样两个死循环的任务就会交替显示了。时钟中断服务代码如下:

实验任务2

创建多个进程,按照调度规则交替显示

运行与结果

创建Task2工程文件夹,类似上一个任务准备好pm.img,freedos.img两个软盘文件,然后拖进来上一个文件夹里面的bochsrc配置文件,运行并且格式化b盘
改写一下Makefile:
运行:
可以看到四个字符串交替显示:
notion image

代码解析

源码

解释

关键代码,中断服务_ClockHandler时钟中断处理程序,用于处理时钟中断。在处理时钟中断时,它执行以下操作:
  • 保存寄存器状态
  • 设置数据段寄存器
  • 向端口0x20发送0x20,通知PIC芯片已经处理了时钟中断
  • 保护当前执行的进程编号
  • 检查任务计时器是否为0,如果是,则重置
  • 选择下一个要执行的任务

设计思路

画一个试验任务2的设计思路图
notion image

验收视频

工程文件

123网盘,无需付费无需客户端:
 
上一篇
信息系统安全实验(3/3)
下一篇
Arch linux安装使用踩坑记录