您的位置:首页 > 理论基础

关于自学计算机以来,一年历程的感想,加上近期在看《一个操作系统的实现》源码的一些分析

2016-05-26 10:50 453 查看
2015-5-23开始c语言。用的教程是浙江大学翁凯老师的c语言程序设计,C语言程序设计

2015-8-13现在数据结构刚学完二叉堆。这个教程用的是浙江大学陈越姥姥的数据结构数据结构_中国大学MOOC(慕课),教材我用书《数据结构与算法分析c语言版》.这门课码过前面一直到平衡二叉树删除的代码。图部分的代码码的比较少,以在纸上推导为主。

算法设计课程用的是哈尔滨大学的算法分析与设计课程。算法设计与分析之入门篇,算法设计与分析之进阶篇,这个课程的教材是《算法导论》里面的几章。

2015-10-28开始计算机组成原理。计算机组成原理之机器,计算机组成原理之数字,计算机组成原理之CPU。这门课使用的教材是《计算机组成原理》,就是考研要用的那本,我是在淘宝淘二手书淘的。

2015-12-18号开始8086汇编。从这里开始自己看书学习,用的教材是王爽的《汇编语言》

2016-1-25,马上要开始操作系统了,跟的是哈尔滨李治军老师的操作系统。操作系统之基础,操作系统之内存管理,操作系统之进程与线程,操作系统之外设与文件系统。这门课用到的教材是《linux内核完全注释》,还可以加一本理论书籍《现代操作系统》。


突然想去夜跑,坚持一个星期试试,跑完再去吃晚饭。

2016-3-24号-,最近开始一星期跑三到四次五公里。今天晚上把x86实模式保护模式的16章一些部分拿下了,开心源自于进步,加油,自己!

2016-4-5,终于在清明放假的时候看完了李忠的《x86汇编语言:从实模式到保护模式》包括这本书的源代码,发现了这个代码中的两个bug。

2016-4-10,花了五天的时间装好了于渊《一个操作系统的实现》这本书需要的环境,在ubuntu中安装了gcc、nasm、vim、可以debug的bochs。自己动手写操作系统(这个是一个知友的博客,知乎号“归灵”,这个博客有关于于渊一个操作系统实现的系列文章)

2016-5-19 ,越来越喜欢看代码了,马上就要满一年了,对于这一年我很满意,就这样,我不急,慢慢来,我一定会在规定的时间内完成我的目标


2016-5-22日,经过编译证明在《一个操作系统的实现》的第五章lib文件夹中klib.c文件中函数itoa这个函数有一个bug。

还有在编译klib.c文件是要用的指令是gcc -c -fno-builtin -fno-stack-protector -o klib.o klib.c(一定要加上-fno-stack-protector,否则编译链接时会出现_stack_chk_fail未定义的引用

2016-5-23,庆祝一下,学习计算一周年。并且开始《一个操作系统的实现》的第六章,代码已经看到多进程。代码实现还未开始第六章,不过我会按照书上的内容,一个函数一个函数写过去的。

2016-5-24,晚上差不多快看完《一个操作系统的实现》的第六章,基本的代码浏览下来还是比较顺畅,中间稍有阻碍的是其中一个点关于中断重入。

代码如下:
osfs06/kernel.asm at master · yyu/osfs06 · GitHub中的save函数
<img src="https://pic4.zhimg.com/7b1d89e75b901d22b1c30d585727d2d3_b.png"
data-rawwidth="582&quo
8970
t; data-rawheight="409" class="origin_image zh-lightbox-thumb" width="582" data-original="https://pic4.zhimg.com/7b1d89e75b901d22b1c30d585727d2d3_r.png">


有异议的地方已经圈住了。

为什么说如果发生中断重入的话,已经在内核栈,不需要切换。


<img src="https://pic4.zhimg.com/9d6b366d4a8c7bafcc0713d66dea4b57_b.png" data-rawwidth="493" data-rawheight="315" class="origin_image zh-lightbox-thumb" width="493" data-original="https://pic4.zhimg.com/9d6b366d4a8c7bafcc0713d66dea4b57_r.png">

看这段代码就能明白了,因为调用save这个函数,在sti(打开中断)之前,也就是说如果发生中断的话,也就是在sti到cli之间,而切换到内核栈(这里为什么是内核栈,内核栈不是在切换特权级就切换了么?这个是另外一个问题,感兴趣可以读下源码)是发生在save函数中,也就是说发生在sti之前,如果检测到发生中断重入的时候,其实已经切换到内核栈了。

2016-5-25,看完了《一个操作系统的实现》第六章的源码最后一块,关于进程调度。

在时钟中断中,增加时间片和优先级,一个进程,如果分配给他的时间片没有用完,就会一直在这个进程中,知道时间片用完为止。

顺便翻译一下schedule()这个函数,这个进程这一章的代码中,走到schedule()的前提是没有中断重入,和分配给该进程的时间片用完,然后再schedule函数中,会寻找时间片最多的那个进程进行切换,如果所有的进程分配的时间片都已经用完,就按照优先级重新分配时间片。
<img src="https://pic2.zhimg.com/09b90867e866e803b097cf9c77a32a09_b.png" data-rawwidth="563" data-rawheight="355" class="origin_image zh-lightbox-thumb" width="563" data-original="https://pic2.zhimg.com/09b90867e866e803b097cf9c77a32a09_r.png">


另外有一个难点在延迟函数的地方。关于这个延迟函数,在逻辑上一定要注意。

<img src="https://pic4.zhimg.com/93e3746546b68649dd63d5de776cbb2b_b.png" data-rawwidth="491" data-rawheight="125" class="origin_image zh-lightbox-thumb" width="491" data-original="https://pic4.zhimg.com/93e3746546b68649dd63d5de776cbb2b_r.png">
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: