这个坑想了很久,但是一直没时间填,今天抽出一个周六,把之前的草稿完成!
我们知道在linux中如果用户程序发生错误,kernel会终止程序运行,并发出segment fault错误。
这种实现其实就是在用户空间实现了异常栈的操作。
下面我来说一下JOS的用户空间的异常栈设计。
这个坑想了很久,但是一直没时间填,今天抽出一个周六,把之前的草稿完成!
我们知道在linux中如果用户程序发生错误,kernel会终止程序运行,并发出segment fault错误。
这种实现其实就是在用户空间实现了异常栈的操作。
下面我来说一下JOS的用户空间的异常栈设计。
JOS在一开始实现的是简单的RR算法,没有优先级调度。
下面我实现了具有Priority的RR调度算法。首先我们需要增加一个sys_env_set_priority()的系统调用。
» Read more: 在JOS上实现基于Priority的RR_sched
之前我们建立了基本的物理页,下面我们建立系统的虚拟地址系统,也就是二级页表。
对于所有对内存的访问,地址都被解释成虚拟地址,并由MMU 执行过程。程序员的工作是设置和维护页目录和页表。
实现虚拟页表的关键在于页目录,页表中存的是物理地址,而页目录项,页表项本身地址是虚拟地址。
» Read more: JOS虚拟页表的实现
最近将JOS的启动流程学习了一遍,细化了系统从real mode到32-bit的转变。
但是在系统真正要接管内存,分配真正页表之前,要有一个简单的页表将kernel code载入到内存中。
我们先使用一个static void i386_detect_memory(void) 函数来探测物理内存一共有多少pages,一个page为4K.
另外我们看一下JOS的memery map就可以发现我们做的工作,写这部分一定要有好的大局观。知道每部分初始化位于内存的哪个位置。
最近在做JOS的系统实现,遇到一个小小的问题在于%.*s的用法。
» Read more: 打印Frame Info值