Skip to content

Latest commit

 

History

History
81 lines (66 loc) · 2.69 KB

README.md

File metadata and controls

81 lines (66 loc) · 2.69 KB

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();
    

参考