ustcanycall / OS

0 stars 0 forks source link

寒假总结 #16

Open ustcanycall opened 10 years ago

ustcanycall commented 10 years ago

寒假总结

前言

这个寒假我主要把《30天自制操作系统》这本书完完全全看了一遍,并且把书上的代码从头到尾手打了一遍。主要的收获有两点:第一,我对操作系统的总体架构有了更深层次的认识。第二,上万行的代码量让我的写代码的速度与能力也有了一定程度的提高。 下面,我将这本书的总体架构以及部分内容实现细节整理了一下。 tips:这本书中操作系统的名字叫做"纸娃娃操作系统".

纸娃娃操作系统的整体架构

2

纸娃娃操作系统总体上可以分为五层:

  1. 由boot,bios,ipl组成的操作系统启动层,用于将操作系统从软盘中读取到内存并完成加载
  2. 由中断,fifo缓冲区以及内存管理形成的基本功能层,主要是为实现多任务调度提供一系列的操作接口 3.有多任务调度,图形化界面,命令行窗口形成的高级管理层,主要通过调用基本功能层的一些操作接口,实现多任务的调度,图形化的界面以及命令行窗口这三个功能 4.api接口层,主要为应用程序提供系统调用 5.应用程序层,通过api提供的接口编写一些应用程序。

由于应用程序的出现,操作系统被分为用户层与内核层,此时若应用程序随意更改内核数据,将导致操作系统奔溃;同时,不同应用程序之间如果对同一块内存空间进行读写则会发生应用程序的奔溃。因此,纸娃娃操作系统也进行了安全性的防护,来保护应用程序与操作系统。

部分细节内容的实现

内存管理

纸娃娃操作系统对于内存的管理采用如下两个数据结构来实现

struct FREEINFO {   
    unsigned int addr, size;
};
struct MEMMAN {     
    int frees, maxfrees, lostsize, losts;
    struct FREEINFO free[MEMMAN_FREES];
};
  1. _FREEINFO_这个数据结构中有两个成员,addr表示一段空闲内存的起始地址,size表示这段空闲内存的大小
  2. _MEMMAN_这个数据结构由一个或者多个_FREEINFO_组成,表示这个一块内存由多个空闲内存块所组成

举例说明: step1. 一开始0x00400000共有124M空闲内存,则_MEMMAN_中free[0].addr=0x00400000,free[0].size=124MB step2. 接着申请1M的内存空间后,_MEMMAN_中的free[0].addr=0x00500000,free[0].size=123MB step3. 然后再申请2M的内容空间后,_MEMMAN_中的free[0].addr=0x00700000,free[0].size=121MB step4. 然后释放1M的内存空间后,_MEMMAN_中的free[0].addr=0x00400000,free[0].size=1M,free[1].addr=0x00700000,free[0].size=121MB

图层叠加处理

由于涉计了图形化界面,那么多个图层的叠加处理就变得尤为重要。“纸娃娃操作系统”采取如下的方式进行图层的叠加处理 10 map其实就是内存空间,这段内存空间用来表示画面上的点是哪个图层的像素,所以它就是相当于图层的地图。当刷新画面1时,如果一边看着这个map一边刷新,就不必担心图层2和图层3被覆盖了

多任务系统

操作系统的多任务调度功能是一个非常重要的功能,“纸娃娃操作系统”才用基于优先级的调度算法,同优先级下进行时间片的轮转,架构如下 3 这种架构的工作原理是,最上层的LEVEL0只要存在哪怕一个任务,则完全忽略LEVEL1和LEVEL2的任务,只在LEVEL0的任务中进行切换。当LEVEL0的任务全部完成或者休眠,或者全部降到下层LEVEL时,接下来开始LEVEL1的任务,最后轮到LEVEL2.

纸娃娃操作系统的演变

4 咦,坑爹呢,怎么啥都没有?其实那时只是完成了boot以及bios的功能,加载完了操作系统,然后操作系统进行HLT操作,自然啥都没有。

5 完成了图形界面,其实只有一个桌面罢了

6 此时完成了鼠标与键盘中断,定时中断以及内存管理,看起来像操作系统了

7 此时完成了多任务以及命令行

8 这是一些应用程序的合集,就这样了。那个文本阅读器里面的是日文,因为此时纸娃娃操作系统只加载了日文字库,因此可以显示日文。当然,别怀疑我的日语能力,这点日语我还是看的懂得。