如何实现一个最简单的操作系统
这里为了简单,就不考虑可移植性开求,不从BOOT部分来接收参数,也不对硬件进行检测, 也不需要进行DATA段,代码段的重定位。我只是读了LINUX内核相关部分,并未自己去实现 一个操作系统,所以我以下所说的只是概念性的东西:
1.接管系统的中断处理,由于BOOT部分的代码决定了那个中断向量表,从而决定了系统中断 之后进入的内存位置,但BOOT并不知道操作系统的中断处理函数位置所在啊,怎么办呢? 有几种方法,其一是:如果你的板子可以重映射地址,也就是可以将内存条所在的位置 重映射成0x0开始,那么在链接内核的时候,就将操作系统自己的中断向量表定位在0x0处 并且在BOOTLOADER引导结束时就完成映射操作,并让CPU跳转到0x0处执行;如果没有重映 射功能,我就不晓得怎么办了,不过我想到一个折衷的办法,就是在BOOTLOADER启动完成 时(也就是将CPU控制权交给操作系统内核时),重新改写FLASH的0x0区域,就是将操作 系统的内核的中断向量表写入FLASH区的0x0处,比如,当一个IRQ发生时,CPU决定了会 跳入0x18(假设这里FLASH占用地址总线0x0至0x0fffffff,内存占用0x20000000至0x2fffffff) ,而BOOTLOADER在最后将0x18处的代码修改成了0x20000000加上0x18的地址处的代码,而这个 地址就是内核的中断向量表中的相关跳转指令,就相当于跳转进了内核所关联的IRQ处理函数 的地址上去执行中断处理函数了,而这样的不好之处在于:当系统重新上电之后,BOOT的 中断向量表已经被修改,除非BOOT本身不使用中断,呵,在这样简单的系统中,BOOT是不 需要中断功能的
2.这里为了简单,所以没有使用分页内存管理,就不需要建立页表等操作,直接进行操作 系统的堆栈设置,同BOOT一样的设置过程一样,接着就进行BSS段清零操作,这里的BSS段 是指操作系统自身的BSS段,与BOOT的BSS段是同一个含义只是用在了不同的地方了,接着 就跳入了MAIN函数
3.为了最大可能的简单,采用静态建立任务结构数组,比如只建立十个任务,那么首先要 为这十个任务结构分配段内存,可以在堆上分配(这个分配的内存直到操作系统结束才会 被释放,当然也可以指定一片操作系统的其它地方都用不到的内存区域,不过这样写的话 就有点外行的味道了,而符务结构数组的指针却是全局变量,存放在BSS段或者DATA段), 由于在上一步中已经分配了一个系统堆栈,那么我们这十个任务就分享这总体的堆栈区域 这里的重点就是如果定义每个任务结构数组里面的结构,可以参照LINUX的相关部分设计 |