迷你操作系统设计
操作系统 实验(cxl 老师)
上了一个学期的操作系统,总算也是拼拼凑凑整了个玩具操作系统,写一篇文章来记录一下,本文就按照实验的顺序,介绍一下一个学期的成果吧
- 本文的实验均在
wsl2+Unbuntu
的环境下完成 - 使用
qemu-system-i386
实验一:Start
- 使用 multiboot 协议,借助 qemu 实现 VGA 的简单输出
movx source, destination
movl
: 32 位movw
: 16 位movb
: 8 位
- VGA 的输出:
- 使用
movl $0x2f4b2f4f, 0xB8000
的格式,其中,前串字符表示输出的字符,后字符串表示输出的地址 - 其中,每个字符需要 2 个字节,一个存放 ASCII 码,一个存放字符的显示颜色
- 使用
- 串口的输出:使用以下格式
1
2
3movb $0x46, %al /* 输出字母F */
movw $0x3F8, %dx
outb %al, %dx /* put char */
实验二:Multiboot2myMain
- 在源代码的语言层面,完成从汇编语言到 C 语言的衔接
- 在功能上,实现清屏、格式化输入输出,设备包括 VGA 和串口,接口符合要求
- 可以直接修改指针指向地址的值,以此实现修改 VGA 的输出,例如
1
2
3
4
5
6
7
8
9
10void put_char2pos(unsigned char c, int color, unsigned short int pos)
{
unsigned short int data = 0;
data += color << 8;
data += c;
unsigned short int *p;
p = (unsigned short int *)(pos * 2 + VGA_BASE);
*p = data;
set_cursor_pos(pos + 1);
}
- 可以直接修改指针指向地址的值,以此实现修改 VGA 的输出,例如
- 在软件层次和结构上,完成 multiboot_header、myOS 和 userApp 的划分,体现在文件目录组织和 Makefile 组织上
实验三:shell&Interrupt&timer
- 简单的 shell 程序,提供 cmd 和 help 命令,允许注册新的命令
- 中断机制和中断控制器 i8259A 初始化
- 时钟 i8253 和周期性时钟中断
- VGA 输出的调整:
- 左下角:时钟中断之外的其他中断,一律输出“unknown interrupt”
- 右下角:从某个时间开始,大约每秒更新一次格式为:HH:MM:SS
实验四:Memory Management
- 内存检测,确定动态内存的范围
- 提供动态分区管理机制 dPartition
- 提供等大小固定分区管理机制 ePartition
- 使用动态分区管理机制来管理所有动态内存
- 提供 kmalloc/kfree 和 malloc/free 两套接口,分别提供给内核和用户
实验五:TaskManager & FCFS
- 任务管理器
- 任务数据结构
- 任务池:数据结构的静态 or 动态管理
- 任务创建/销毁,任务启动和终止
- 上下文切换
- idle 任务、init 任务
- 调度器 FCFS
- 初始化完成后,转入多任务状态运行
实验六:Scheduler
- 调度算法,至少 2 种(不含 FCFS)
- 任务管理器
- 任务数据结构
- 任务创建/销毁
- 调度器
详细代码:请看
详细的实验报告可以看:链接