目录一、前景回顾二、初识中断三、中断分类四、中断号五、可编程中断控制器8259A六、中断描述符表IDT 一、前景回顾 上一回我们简单地讲解了特权级的原理,这一块其实我当时也是啃的云里雾里,看了好大一会儿才明白。如果实在不怎么理解特权级检查也没关系,因为后面的代码中也不会涉及到手写特权级检查,这些都是CPU自己来完成。总之只需要对特权级检查有概念即可。本回我们来讲讲比较重要的中断。二、初识中断 我们知道,整个操作系统其实是处于一个死循环的,为什么这么说呢?因为CPU总是不知疲倦的取指令,译指令,执行指令。如果我们不让操作系统处于死循环的情况下,CPU就可能会将指令后面的数据给解码为某个指令来
目录一、前景回顾二、什么是特权级检查三、门四、如何进行特权级检查五、调用门的跳转执行流程六、调用门的跳转权限检查 一、前景回顾 我们在前面讲过保护模式较之于实模式的三大特点:分页机制、特权级和分时机制。现在分页机制的坑已经填好了,接下来我们开始填特权级的坑。二、什么是特权级检查 首先我们来看看什么是特权级,CPU为了计算机的安全,将程序拥有的权力划分为了4个等级,也就是特权级,特权级按照权力大小划分为了0、1、2、3级,数字越小,权力越大。我们操作系统内核所占的特权级就是0级,处于至高无上的地位,而用户的应用程序处于3级,最低特权级。不过在Linux中,实际只用上了0级和3级,即我们常说的
目录一、前景回顾二、什么是特权级检查三、门四、如何进行特权级检查五、调用门的跳转执行流程六、调用门的跳转权限检查 一、前景回顾 我们在前面讲过保护模式较之于实模式的三大特点:分页机制、特权级和分时机制。现在分页机制的坑已经填好了,接下来我们开始填特权级的坑。二、什么是特权级检查 首先我们来看看什么是特权级,CPU为了计算机的安全,将程序拥有的权力划分为了4个等级,也就是特权级,特权级按照权力大小划分为了0、1、2、3级,数字越小,权力越大。我们操作系统内核所占的特权级就是0级,处于至高无上的地位,而用户的应用程序处于3级,最低特权级。不过在Linux中,实际只用上了0级和3级,即我们常说的
目录一、前景回顾二、锁的实现三、使用锁实现console函数四、运行测试 一、前景回顾 上回我们实现了多线程,并且最后做了一个小小的实验,不过有一点小瑕疵。 可以看到黄色部分的字符不连续,按道理应该是“argBMain”,这是为什么呢?其实仔细思考一下还是很好得出结论。我们的字符打印函数是put_str,实际上是调用的put_char函数。所以打印一个字符串需要多次调用put_char函数来打印一个个字符,如果我们当前线程刚好打印完了arg,正准备打印下一个字符B时,这时发生了调度,那么就造成了上面的这种情况。 由此引申出来了公共资源、临界区和互斥的概念: 公共资源:可以是公共内
目录一、前景回顾二、锁的实现三、使用锁实现console函数四、运行测试 一、前景回顾 上回我们实现了多线程,并且最后做了一个小小的实验,不过有一点小瑕疵。 可以看到黄色部分的字符不连续,按道理应该是“argBMain”,这是为什么呢?其实仔细思考一下还是很好得出结论。我们的字符打印函数是put_str,实际上是调用的put_char函数。所以打印一个字符串需要多次调用put_char函数来打印一个个字符,如果我们当前线程刚好打印完了arg,正准备打印下一个字符B时,这时发生了调度,那么就造成了上面的这种情况。 由此引申出来了公共资源、临界区和互斥的概念: 公共资源:可以是公共内
目录一、前景回顾二、位图bitmap及函数实现三、内存池划分四、运行 一、前景回顾 前面我们已经花了一个回合来完善了一下我们的系统,包括增加了makefile,ASSERT以及一些常见的字符串操作函数。关于makefile,还是我以前学习Linux系统编程的时候学了一点点,很久没用导致就几乎都忘了,还是花了一下午时间去补了一下。看来知识这个东西,还是得温故而知新。 随时还是要回过头来总结一下我们的工作,上面是目前为止的工作,其实我们可以看到,现在我们的主要工作就是不停地往init_all()里面去填充一系列初始化函数,本回合也不例外,今天我们开始进入内存管理系统。二、位图bitmap
目录一、前景回顾二、位图bitmap及函数实现三、内存池划分四、运行 一、前景回顾 前面我们已经花了一个回合来完善了一下我们的系统,包括增加了makefile,ASSERT以及一些常见的字符串操作函数。关于makefile,还是我以前学习Linux系统编程的时候学了一点点,很久没用导致就几乎都忘了,还是花了一下午时间去补了一下。看来知识这个东西,还是得温故而知新。 随时还是要回过头来总结一下我们的工作,上面是目前为止的工作,其实我们可以看到,现在我们的主要工作就是不停地往init_all()里面去填充一系列初始化函数,本回合也不例外,今天我们开始进入内存管理系统。二、位图bitmap
目录一、前景回顾二、编写makefile三、实现Assert断言四、实现字符串操作函数五、测试 一、前景回顾 上一回我们详细地讲解了整个系统的中断工作流程,整个中断系统比较难的地方在于中断的执行流程,我开始学的时候对这一块也是比较模糊的,感觉不知从何入手。现在已经很清楚整个流程了,这里可以给读者一个建议,想象自己是CPU,当接收到中断信号后,根据中断的处理流程去看代码,应该很快就能看懂代码,不要单独去看某一块代码,这样代入性不强。这一回先暂停主线任务,先腾出手来把一些准备工作给完善了。二、编写makefile 这里为什么要插入makefile呢?在前面的代码中,如果读者都编译运行过的话,会
目录一、前景回顾二、编写makefile三、实现Assert断言四、实现字符串操作函数五、测试 一、前景回顾 上一回我们详细地讲解了整个系统的中断工作流程,整个中断系统比较难的地方在于中断的执行流程,我开始学的时候对这一块也是比较模糊的,感觉不知从何入手。现在已经很清楚整个流程了,这里可以给读者一个建议,想象自己是CPU,当接收到中断信号后,根据中断的处理流程去看代码,应该很快就能看懂代码,不要单独去看某一块代码,这样代入性不强。这一回先暂停主线任务,先腾出手来把一些准备工作给完善了。二、编写makefile 这里为什么要插入makefile呢?在前面的代码中,如果读者都编译运行过的话,会
目录一、前景回顾二、线程的实现三、线程的切换四、运行测试 一、前景回顾 上一回我们实现了内存管理系统,说实话代码还是比较多,看起来还是比较头疼的,不过为了知识这都是小事。这一节终于可以来实现我们的线程了,以前学操作系统的时候,听到的最多的就是什么线程,进程等,这一回我们来自己动手实现一下,加深对线程的理解。二、线程的实现 我相信能认真去看这篇博客的同学,不会是零基础。所以我也就不再深入地去讲解进程和线程的区别。这里我引入书中的话: 线程是什么?具有能动性、执行力、独立的代码块。 进程是什么?进程=线程+资源。 先贴上代码,在project/kernel目录下新建list.c、list