可通过预置命令,实现在终端实现类似shell功能。如下图所示,在终端中输入的命令为 mem
表示获得系统的物理内存空间大小。
该系统主要的代码分为两部分,一部分为内核态代码,另一部分为用户态代码。如下图所示,从0x7c00 到 0x12000为内核态代码范围。用户态代码为0x12000到0x70000。从0x70000 到 0x90000则是内核态的堆空间的范围。其中内核态代码的保护采用的是分页机制中页表只读属性实现对内核态代码保护。内核态的堆空间采用的是分段机制的方式进行保护。
通过TSS和内核态空间保存的寄存器的值,进行任务的切换。每一个任务在内核态中都有一块内存保存任务切换时各个寄存器的值,通过TSS实现栈的切换,实现多个任务之间的切换。目前采用的分时复用的切换策略。在任务互斥模块中将会演示消费者和生产者的代码,将会有任务切换演示。
实现了互斥锁的功能,用户要加锁,可通过系统调用,陷入内核,完成对锁的持有。释放锁采用的发布订阅模式,会把因为这把锁而等待的任务全部进行唤醒,进入就绪队列当中。
采用定长和动长想结合的策略进行分配,若能分配空间,最少分配32k的大小。有点内存碎片了,后续再改。
外部中断设置,8259A的设置。级联的方式,键盘的中断向量是 0x21 ,系统功能调用是 0x80 ,时间中断是 0x20 。
Ubuntu 10.10
gcc 4.4.5
NASM version 2.08.01
bochs 2.4.5