Skip to content

heng30/toy-os

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ae16712 · Jan 15, 2025
Dec 20, 2024
Dec 8, 2024
Jan 2, 2025
Jan 13, 2025
Dec 30, 2024
Jan 15, 2025
Jan 15, 2025
Jan 15, 2025
Jan 15, 2025
Dec 2, 2024
Jan 5, 2025
Dec 2, 2024
Dec 5, 2024
Dec 26, 2024
Jan 8, 2025
Jan 15, 2025
Dec 14, 2024
Dec 30, 2024
Dec 14, 2024
Dec 31, 2024
Dec 8, 2024
Dec 30, 2024

Repository files navigation

0.png

这是一个根据Linux操作系统-构建自己的内核课程的学习项目。

实现的功能

  • 运行在保护模式下,不支持分页功能
  • 处理鼠标和键盘输入
  • 简单的定时器
  • 简单的内存管理
  • 简单的图层管理,保证图层及时刷新
  • 简单的任务调度
  • 支持系统调用
  • 类似于fat32的只读文件系统
  • 一个输入框,可以输入和删除字符
  • 一个简易的终端,支持:cls, ls, cat, mem, free 命令
  • 支持运行外部命令, 外部命令运行在特权级3, 拥有自己的代码段和数据段. 并且内核能够处理外部程序的异常
  • 快捷键ctrl+k结束正在运行的外部命令(有概率出现bug, 目前没有找到原因)
  • 快捷键ctrl+q关闭焦点窗口
  • 快捷键ctrl+tab切换焦点窗口

如何使用该项目?

  • 编译软盘镜像:make
  • 启动virtualbox,创建一个虚拟机,虚拟机以软盘启动。软盘加载build/disk.img作为启动镜像.

1.png

1.png

构建工具

  • gcc: gcc (GCC) 13.3.0
  • objconv: Object file converter version 2.54 for x86 and x86-64 platforms
  • nasm: NASM version 2.16.03 compiled on Apr 17 2024

注意事项

  • 无法使用函数指针,会运行错误

  • 整个结构体赋值会出问题,导致整个程序异常退出。应该是objconv反汇编出问题。

struct Foo {
    int a;
    int b;
}

Foo a = { .a = 0, .b = 0 };
Foo b = a; // 此处会出问题,可能导致内核在刚启动就异常退出,而不是代码运行到此处
  • 条件分支语句太长可能会出异常, 如if/else if/elseswich语句

  • 不要把变量的指针作为获取函数内部状态的参数,反汇编的代码出问题

void foo(int *flag) {
    *flag = 1;
}

int flag = 0;
foo(&flag);
assert(flag == 1); // 此处会出错,flag的值依然为0
  • 关中断和开中断的使用?

    • 在中断函数
        int eflags = io_load_eflags();
        io_cli(); // 暂时停止接收中断信号
        // 中断代码
        io_store_eflags(eflags); // 恢复接收中断信号
    
    • 在非中断函数
        io_cli();
        // 代码
        io_sti();
    

参考