Skip to content

Files

Latest commit

author
lishuhuakai
Sep 29, 2016
b6ec345 · Sep 29, 2016

History

History

ucore

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Sep 28, 2016
Sep 28, 2016
Sep 28, 2016
Sep 28, 2016
Sep 28, 2016
Sep 28, 2016
Sep 28, 2016
Sep 28, 2016
Sep 29, 2016
Sep 29, 2016

readme.md

我推荐的这个lab,名字叫做ucore,这个lab来自清华大学的操作系统课程,首先要说明一下,这确实是非常好的一个lab,想入门linux内核的同学可以读一读这个lab所涉及的ucore的源码。

书籍推荐

其实只要大家认认真真做下去,收获肯定会非常的大。虽然这么说,但是,这个lab 对大家的基础要求稍微有一点高,你至少要懂一点汇编,懂一点C。代码里面很多都是汇编,C交替着写,我推荐几本书,给大家补一下基础,大家可以参考一下。

第一本是王爽的汇编语言,这本书适合入门,但是只涉及到了8086的一点东西。书讲的浅显易懂。

汇编语言

另外一本书是《x86汇编语言--从实模式到保护模式》,这本书算是一本进阶的书籍,同时也是80386汇编入门的书籍。这本书里大部分的知识,这个lab都用得到,所以强烈推荐大家阅读。

x86汇编语言--从实模式到保护模式

还有一本需要参考一下的是《程序员的自我修养--链接、装载与库》,因为这个lab还涉及到了elf格式的可执行程序.

程序员的自我修养--链接、装载与库

当然,最好的话,能附带这么一本《orange's 一个操作系统的实现》,作为参考是最好不过啦。这本书的话,汇编有点多,其实很多汇编都可以用C来代替。不过里面有一些点,这个lab也涉及到了,所以推荐读一下。

orange's 一个操作系统的实现

上面的几本书里应该涉及到了这个lab所需要的大部分的硬件以及汇编的知识,其余的,你可以去google或者baidu

做这个lab,你可能会遇到非常多的困难,比如说,调试异常困难,代码半天读不懂,没事,这都是很正常的情况。要是觉得困难实在太大,我建议你从这个玩具内核入手 -- hurley,这个内核非常简单,适合积累一些最基本的知识。

关于代码的阅读

linux上面读ucore将近1 M的源文件真心费力,生活其实可以简单一点,你可以使用宇宙最强的ide--visual stdio来进行代码的阅读,像我这样:

代码演示
是不是很爽,告诉你,爽翻了。特别是遇到一堆不知从哪里冒出来的宏,一堆不知名的函数的时候,`VS`可以实现十万分方便的跳转。

我推荐两个插件,一个叫做visual assistant,这个用来增强自动补全以及跳转操作,一个叫做visualGDB,是一个帮助你在window上面写linux程序的插件。自己去搜索安装吧,网上教程一大堆。我就懒得写了。

当然,你不可能用vs来编译代码,但是,vs会给你阅读代码,修改代码带来非常大的方便性。

收获

实在做不出也没有什么关系,因为很少有人会真正去做一个操作系统吧。但是读懂源码,我觉得还是非常有必要的,我稍微讲一下,我个人读完了这个lab源码之后的感受吧。

  • 以前学c的时候,我总是很好奇,printf之类的函数究竟是如何实现在屏幕上打印出字符的,从来没有老师讲过这些东西,现在,我懂了,原来我们只要将字符写在内存中的某个区域,然后驱动程序会自动帮我们实现字符在屏幕上的输出。

  • 为什么cpu可以实现进程的切换?一切都是因为中断,一旦发生中断,计算机要立马切换到中断处理程序中去,利用这个特性,操作系统设定好时钟频率,让时钟每多少毫秒触发中断,内核就可以获得控制权,从而实现进程的切换。

  • 一切的进程,只是一堆数据而已,只要你保存好这段数据,cpu先去干点别的事情,一段时间后再恢复这些数据,进程又活了。由于cpu的速度太快了,所以你会一直觉得进程还活着,其实它已经切换了几十次了。

  • 内存的分段,分页机制真是漂亮的抽象,逻辑上连续的页,实际在内存中可能相隔十万八千里,可是这并没有关系。因为我们已经 屏蔽了它,上层的应用是永远也感觉不到差别的。

  • 所谓的程序文件,加载到内存里,操作系统要对其进行重定向处理,在每个用户进程的眼里,它自己是独一无二的,分段分页机制完美地实现了进程的隔离。

  • ... ...

对于我来说,收获特别大。我懂了很多以前我自认为懂了的东西,当然至于这些东西我是不是真的懂了,我也不知道,因为人的认知总是在向前推进的嘛。

但是说实话,我对写一个内核什么的,没有多么大的兴趣,所以,我不会继续钻研地太深。所以,对于这个lab,我也只是玩一下的。

不过,读完这个lab,实验完这个lab,加上我以前学的编译器,硬件,汇编等一系列的东西,从硬件到软件这个层次发生的事情,我现在算是比较清楚了。

如果你要问,学这些玩意对你找工作有什么益处的话,我可以说,短时间内可能还真没有什么益处,不过这些玩意,算得上是一个编程爱好者的基本修养吧。就这样吧!

至少在现在,写一个玩具性质的操作系统并不是一件很难的事情,关键是你不熟练,写操作系统也没有很高深的技巧,它也不需要你有很高的智慧,它的理论基础在几十年前就已经成熟了,已经有无数人写了无数的操作系统,就如同编译器一样,我相信,只要你足够熟练的话,花点时间,参照各式各样的教程,你也能够写出一个操作系统,对于社会,这可能没什么卵用,但是对于你自己,你可以从中掌握到很多底层的细节.当然,这也可能没有什么卵用.

如果感到代码层层叠叠,数据结构花样翻新的话,可以参考一下我的注释版lab:cs-ucore

学了这么久的计算机,我突然感觉学海无涯,每一个点扩展出去,都是无穷无尽的,真心有点累,不行了,我要休息一段时间了。