这是我创建的第一个操作系统。它用两种语言编写:C语言和汇编。
该项目自2017年12月15日以来已被激活

工作计划
引导加载程序
风俗
引导部门
阶段2
g
核心
内存管理
页面框架分配器
动态内存分配
建筑系统
写信给VGA
CPU中断(IDT,ISRS,IRQ等)
从PS/2键盘读取字符
从PS/2键盘读取字符串
虚拟内存(分页,帧等)
页面框架分配和分配
动态内存分配(LIBALLOC)
CPU计时器
获取CPU信息
实时时钟:所以我们可以知道电影何时开始
内核堆栈跟踪
多任务
用户模式进程
硬盘驱动器
软盘驱动器
文件系统
图形用户界面
该操作系统使用2阶段的引导加载程序。如果第二阶段是我们进入受保护模式并调用内核时。
我的软盘图像的前512个字节包含引导扇区,该启动扇区有很多保护模式无法做到的事情。 (例如,从磁盘加载东西)。然后,它跳到以0x7E00 (引导扇区之后)加载的第二阶段。
此阶段将加载GDT并进入受保护的模式,然后将启动扇区加载的内核在0x1000到0x100000 (1 MB)。最后跳!
内核的大小总是在增长,但我不能总是增加加载扇区。作为解决方案。我决定使用grub。内核被存储为ELF图像( kernel.img ),该CD使用ISO 9660作为其文件系统。 GRUB还支持Multiboot,因此我的操作系统可以与其他人(Windows,Linux等)一起使用。
我们进入了受保护的模式,这意味着我们无法访问BIOS功能。因此,此内核需要重新实现这些功能来控制硬件。
现在,我已经重新实现了标准设备:屏幕和键盘。在进一步的发展中。我将实现磁盘驱动程序。
该操作系统同时使用分段和分页来提供内存保护。在我的全局描述符表中,我列出了5个段描述符:
空段
内核的代码段:我的内核代码属于的段
内核的数据段:我的内核全局变量属于的段
用户的代码段:当前不使用
用户的数据段:与4相同
我也启用了分页。现在,我故意将第一页表中的第四页映射到not-present和read-only内容,因此您可以通过执行在我的操作系统命令行中执行输入bsod来生成页面故障。

该内核提供了一个页面框架分配器,因此内存管理将更加方便,我将更容易接近多任务处理。
正如Jamesm的教程所暗示的那样,我将使用bitset来确定框架是否免费。
1: Allocated 0: Free
v v
frame_bitset: 11110111110101111101111111
^
get_free_frame()
我目前已经实施了一个没有免费免费的安置malloc ,因为内核使用的所有变量在关闭势之前都不需要释放。
Heap Allocation
-----------------------------------------------
Allocated |
Memory | Free.......until the end of memory
|
-----------------------------------------------
因为我很懒惰,所以我移植了一个名为liballoc的第三方内存分配器,它在我的操作系统中只需要很少的功能。
该项目使用GNU制作来构建。因此,构建方法是键入make ,如果在构建过程中发生任何问题,请在make之前键入make dep 。如果仍然陷入困境,请打开一个问题。
如果您不使用Linux或WSL(用于Linux的Windows子系统),则需要从此处下载交叉编译器。然后在config.mk中修改CC和LD 。