这是一个根据Linux操作系统-构建自己的内核课程的学习项目。
- 运行在保护模式下,不支持分页功能
- 处理鼠标和键盘输入
- 简单的定时器
- 简单的内存管理
- 简单的图层管理,保证图层及时刷新
- 简单的任务调度
- 支持系统调用
- 类似于fat32的只读文件系统
- 一个输入框,可以输入和删除字符
- 一个简易的终端,支持:
cls, ls, cat, mem, free
命令 - 支持运行外部命令, 外部命令运行在特权级3, 拥有自己的代码段和数据段. 并且内核能够处理外部程序的异常
- 快捷键
ctrl+k
结束正在运行的外部命令(有概率出现bug, 目前没有找到原因) - 快捷键
ctrl+q
关闭焦点窗口 - 快捷键
ctrl+tab
切换焦点窗口
- 编译软盘镜像:
make
- 启动
virtualbox
,创建一个虚拟机,虚拟机以软盘启动。软盘加载build/disk.img
作为启动镜像.
- 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/else
和swich
语句 -
不要把变量的指针作为获取函数内部状态的参数,反汇编的代码出问题
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();