jintongxu / simpleOS

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

simpleOS

simpleOS项目是一个简单版的32位操作系统,支持8个终端页面,实现了一下简单的系统调用命令(ls,echo等等)。项目通过qemu来模拟32位操作系统运行所需要的硬件环境。本项目用作学习使用。

一、最终成果展示

进程管理相关的接口实现了9个,文件系统相关的接口实现了13个。

二,项目部署

项目部署请看这里

三、项目介绍

3.1、设计结构

boot只占据第0个扇区,大小只有512字节。让系统支持多进程,同时并发去运行。开启了分页机制,将进程与进程之间进行隔离。

3.2、中断管理

利用了CPU的IDT表进行管理,外部硬件用两块8259芯片,对键盘的事件进行相关的处理。

3.3、多进程

使用TSS进行进程切换。

给每个进程定义了一个task_t的结构,在里面增加了一个TSS的描述符,用TSS进行进程切换。

展示了如何手动切换进程。

保存相关寄存器到当前任务的栈,然后通过栈切换实现手动切换进程。

允许系统中同时存在许多进程,不同进程间采用时间片调试算法进行管理。

定义一个链表,将进行按先进先出的方式插入到链表中,每100ms切换进程运行。

3.4、进程同步

使用计数信号量解决行为同步的问题。对于多个进程访问共享资源,我们用互斥锁保证同一时间只有一个进程访问临界区。

3.5、内存管理

操作系统开启了分页机制,应用访问的线性内存需要通过转换表转换成对应的物理地址。(注意: 内核空间的内存不进行分页

利用分页机制,让操作系统占用0x80000000以下的区域(内核空间空间),进程则占用以上的区域(用户空间)。通过让每个进程都拥有自己的页表实现进程隔离。(事实上,实际32位操作系统是将高的1G作为内核空间,低的4G作为用户空间)

实际上,程序员只能使用虚拟地址。系统中每个进程有各自的私有用户空间(0~3G),这个空间对系统中的其他进程是不可见的,而内核空间则是各个进程共享的。

3.6、权限管理

操作系统运行于特权级0,应用进程运行于特权级3。还通过分页机制对某些页做了特权处理,应用程序不能运行于特权级0的地址空间。

3.7、系统调用

使用调用门提供相应的系统调用接口来给应用程序使用。

3.8、ELF文件加载

解析ELF头,再解析表,提取出对应的数据拷贝到相对应的进程地址空间。

3.9、设备管理

设备管理层定义统一的设备操作接口,方便上层使用。

将所有不同的设备统一抽象成统一的接口,使操作系统内核只需要统一的操作接口就能实现设备的访问。

3.10、文件系统

3.11、shell

Shell俗称壳,即命令行解释器,它允许用户交互式的输入命令并解释执行,并且可以调用出相应的应用程序运行,从而让用户能够使用内核的功能去操作计算机。

Shell支持应用从磁盘中加载程序进行运行。

四、不足和展望

不足

  • 本项目只是demo级别的32位操作系统,许多接口和功能的实现非常简单,并且有安全漏洞。

  • 进程调度只是很简单的时间片轮转。

展望

  • 多加几个系统调用接口。

  • 增加命令的功能,例如让ls命令可以列出子目录的文件。

  • 提高某些功能的实现方式,例如将进程调度的时间片轮转调度切换成多级反馈队列调度,或者由多个调度算法进行进程的调度。

  • 增加TCP/IP网络协议栈

  • 可以支持用户多线程

About


Languages

Language:C 94.2%Language:C++ 3.5%Language:CMake 1.0%Language:Assembly 0.8%Language:Shell 0.3%Language:Batchfile 0.2%