迷你操作系统设计

操作系统 实验(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
    3
    movb $0x46, %al /* 输出字母F */
    movw $0x3F8, %dx
    outb %al, %dx /* put char */

实验二:Multiboot2myMain

  • 在源代码的语言层面,完成从汇编语言到 C 语言的衔接
  • 在功能上,实现清屏、格式化输入输出,设备包括 VGA 和串口,接口符合要求
    • 可以直接修改指针指向地址的值,以此实现修改 VGA 的输出,例如
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      void 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);
      }
  • 在软件层次和结构上,完成 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)
  • 任务管理器
    • 任务数据结构
    • 任务创建/销毁
    • 调度器

详细代码:请看

      详细的实验报告可以看:链接