*******************************************************************************
MiniOS v1.2.6  Date:18/12/28
**************
版本描述:
调整和完善了原有的异常处理方式。修复了一些bug。
**************
加入的新特性:
--实现了异常处理流程的框架化。
--使得异常处理方式更完善，进程内发生异常后，系统不会停机，而是会暂停出现异常的程序
  的运行，其它进程和OS本身的运行不受影响。
--支持异常处理程序执行期间发生中断。
**************
修复的bug：
--修改了用于进程切换的sched()子程序中开关中断的时机。
--将文件系统代码中用到的全局fsbuf缓冲区修改为局部缓冲区，以避免内核可抢占（内核可
  重入）情况下可能出现的多进程对fsbuf缓冲区的读写冲突问题。
--在文件系统代码中，修复了do_open()、do_rdwt()等函数中使用的进行参数传递的结构体
  中部分参数未初始化的问题。
--在文件系统代码中，对do_open()函数里的在全局文件描述符表f_desc_table[]中寻找空
  描述符的代码进行了调整，以减少内核可抢占情况下能发生的数据冲突。

*******************************************************************************
MiniOS v1.2  Date:18/8/29
**************
版本描述:
移植了文件系统，加入了IDE硬盘设备。对系统进行了一些改进。
**************
加入的新特性:
--向MiniOS中移植了原于渊在Orange's中实现的扁平文件系统，但从微内核改为了宏内核。
--通过read/write系统调用读写硬盘设备时，在等待硬盘设备的数据时使用了之前实现的主动
  放弃CPU特性，无需忙等待。
--加入了内核和init用户程序二进制文件的内存映射图kerne.map和init.map，可以为调试
  程序提供参考。
--修改了内核在内存中的部署位置。
--添加了脚本文件，支持通过Qemu+gdb在C源码级调试MiniOS。
**************
修复的bug：
--

*******************************************************************************
MiniOS v1.1.1  Date:18/4/27
**************
版本描述:
修复了系统中的一些bug并进行了改进。
**************
加入的新特性:
--在系统调用返回前进行调度，增加进行进程切换的时机。
--在调度程序（sched()和schedule()）中加入进程指针p_proc_next指向新选中的进程，
  之前只使用了进程指针p_proc_current。
--添加了新源文件ktest.c，其中包含了多组测试代码，用于在对系统进行改动后对已有的
  特性或新特性进行测试。
**************
修复的bug：
--修复了系统调用yield()的实现函数中的一个bug，当前进程调用yield()时，分配的ticks
  值应该置0，而非自减1。

*******************************************************************************
MiniOS v1.1  Date:18/4/21
**************
版本描述：
通过加入内核态上下文context将中断处理和主动放弃CPU的实现方式在进程切换部分进行了
统一，使得进程切换部分的处理逻辑更清晰。
**************
加入的新特性：
--加入了内核态上下文context，在进行进程切换时，会先在内核栈中保存内核态上下文，
  然后选中新的进程，再恢复新进程的内核态上下文。
--sched()
  sched()是一个汇编子程序段，位于kernel/kernel.asm。sched()是进程切换的入口点，
  只能在内核空间中调用。
--schedule()
  schedule()是一个C函数，位于proc.c。它是系统事实上的调度函数，用于选中新的进程
  投入运行。
--通过对系统调用fork()和pthread()的内核实现函数进行必要的修改，使得它们能兼容新
  引入的内核态context并正常工作。
--全局变量k_reenter当前用于处理中断嵌套，只有中断发生时它的值才会变化。
**************
修复的bug：
--通过对分配给各进程的初始ticks进行修改，使得实际投入运行的第一个进程是PCB表内的第
  一个进程，之前实际运行的第一个进程是PCB表内的第二个进程。

*******************************************************************************
MiniOS v1.0  Date:18/3/18
**************
版本描述：
加入了进程主动放弃CPU的功能以及新的系统调用。
**************
加入的新特性：
--加入了主动放弃CPU的功能，使得像read这样的函数，在等待设备的数据时，无需忙等待，
  可以让出CPU资源给其它进程使用，提高CPU利用率。
--加入了yield()系统调用。进程调用yield()时，会释放占用的CPU让下一个进程运行。
--加入了sleep()系统调用。sleep()含有一个整型参数n，进程调用sleep(n)后会睡眠n个
  ticks，期间不继续往下运行。
**************
修复的bug：
--

*******************************************************************************
MiniOS v0.9  Date:17/12/13
**************
版本描述：
加入内核可重入（内核抢占）功能，使用了新的进程内核栈结构。实现了内核重入后，一个
系统调用不必执行完才能选中新的进程运行，即系统调用执行期间可以被中断，且被中断期间
可以运行其它进程。
**************
加入的新特性：
--使用了新的进程内核栈结构，当前内核栈和进程PCB共用一段8KB的内存空间，进程PCB位于
  低地址处，内核栈的栈底位于8KB的最高地址处（压栈方向为高地址向低地址）。
--在进程PCB中加入了新的字段以支持内核可重入。
**************
修复的bug：
--对系统调用fork()和pthread()的内核实现函数进行必要的修改，以支持内核重入，并能
  正常工作。

*******************************************************************************
