一、在搜索rtos相关资料时候,无意中在知乎论坛上看到一片“写一个操作系统内核有多难?大概的内容、步骤是什么?”的文章,感触颇深。自己现有的技术远远不能达到这种水平,欠缺的技术甚多,需要弥补的比较多。为深入研究Linux内核系统或是rtos系统做下准备工作,在此mark下,整理下相关的技术文档参考,以便后续研究分析。
详细的内容可以参见知呼论坛:http://www.zhihu.com/question/22463820
内核不难,但要让大厂商为你的内核写驱动比登天还难。
二、最基本的有几个部分:
1 bootloader, 你是用个现成的grub还是自己写,很多人就倒在这一步了。
2 内存管理
3 进程管理
4 中断和系统调用
5 文件系统,
当然可以折腾的很多,但最好还是先把这些弄出来,才可称之为一个操作系统。
三、下面是简要的总结下可能用到的资源:
0.JamesM's kernel development tutorials
James的那个教程还是入门最好的。
1.
项目地址:Hurlex-doc by hurley25
基于《JamesM's kernel development tutorials》写的中文文档
2.
基于 Bochs 的操作系统内核实现
写个玩具内核参考:基于 Bochs 的操作系统内核实现
3.
(1)zero to one
《JamesM's kernel development tutorials》JamesM's kernel development tutorials,在学习完之后,对操作系统简单的有了轮廓,bootload, GDT IDT, 内存管理,文件系统等等。
(2)microkernel vs monolithic
我们看的很多教程,多少天写操作系统,包括前面的JamesM's kernel development tutorials,都是类unix实现,本质上设计的思路和框架都类似。
微内核,发现内核OS,原来还能有另一种(非Linux宏内核的)设计, 微内核则是把很多原来集成到kernel的模块,通过IPC的方式,变成一个个services跑在用户模式下面,这样大大增强了可扩展性和内核的稳定性。
(3).后来发现了FreeNOS,用C++写的基于微内核的操作系统,通过学习这个项目,又对操作系统,软件设计,设计模式等等大开脑洞。
FreeNOS
lordsergioinspa/FreeNOS · GitHub
这是一个用C++实现的微内核的操作系统,各种宏内核中的服务作为一个独立的services在微内核中,基于消息的通信方式,这点其实跟Mac内核中的mach那部分机制相似。
除了是一个操作系统的实现,另外从中也能很好的学习到OOP的设计方式,整个代码风格特别好,完全基于面相对象,还有一些常见的设计模式,在接触了这个开源项目之后,才了解,代码风格,注释,doxygen,scons,设计模式。
不仅涵盖了所有的操作系统的设计,学习,更接地气的包括了各种优美设计。
(4).Exokernel微内核
http://pdos.csail.mit.edu/6.828/2005/readings/engler95exokernel.pdf
新一代的微内核,MIT出品。
Exokernel 微内核的核心观点是:只要内核还提供对系统资源的抽象,就不能实现性能的最大优化 -- 内核应该支持一个最小的、高度优化的原语集,而不是提供对系统资源的抽象。从这个观点上来说,IPC 也是一个太高级的抽象因而不能达到最高的性能。Exokerne l微内核的核心是支持一个高度优化的原语名叫保护控制转移(protected control transfer, PCT)。PCT是一个不带参数的跨地址空间的过程调用,其功能类似于一个硬件中断。在PCT的基础上,可以实现高级的IPC抽象如RPC。在MIPS R3000处理器上,一个基于PCT的RPC实现了仅10µs的开销,而在同一硬件上运行的Mach RPC为95µs。对磁盘的处理,跟微内核的比较
4.
有一本日本人写的书叫《30天自制操作系统》一步一步带你写出一个操作系统内核(可以写到光盘上,从光盘启动,第一节就叫你如何实现一个“hello,world”),一般计算机的本科生(就是会一点点C语言的那种理工科生),有点耐心的话,每天2~3小时,三个月基本能够看完,跟着撸出一个操作系统内核。
要是急于写出来的话,去看《30天自制操作系统》,跟着敲代码就好。
用汇编和C语言 一个月内写出一个操作系统,这个操作系统包含:
5.
《Orange'S:一个操作系统的实现》与《自己动手写操作系统》
Orange'S:一个操作系统的实现 (豆瓣)
http://blog.csdn.NET/iefswang/article/details/8455170
http://book.51cto.com/art/200907/133029.htm
6.MIT 操作系统课程(xv6不到1万行代码。)
2011年操作系统课程:http://pdos.csail.mit.edu/6.828/2011/
2014年操作系统课程:http://pdos.csail.mit.edu/6.828/2014/
按照这个课程,几个月就可以完成一个功能还算完备的内核.
但是这些人可以自己用几个月的时间写个内核,建立在当下相关资料特别丰富,而且虚拟机调试特别方便的基础上的.用bochs(虽然我自己从来都没有整好过),qemu,可以轻松进行汇编级调试,qemu 还可以利用gdb remote debug来进行源码级调试.
7.来自:bhuztez
于是我就照着MIT 6.828,以及JamesM's kernel development tutorials,James Molloy's Tutorial Known Bugs开始学写操作系统内核了。决定用QEMU,因为QEMU用-kernel参数,可以直接启动一个elf格式的支持multiboot的内核,这样直接就跳过了bootloader。也不用像用grub之类的bootloader那样得先生成一个磁盘/光盘镜像。直接写串口而不是像JamesM那样写到屏幕上。写屏幕上难度大不了多少。但问题是看输出还不如串口方便,一上来就折腾那玩意儿干啥呢?能输出Hello, world!之后,从JOS里抄来了printf函数。此时碰到了一个问题,从osdev wiki上那个meaty skeleton里抄来的kernel.ld有问题,内核根本不能启动。后来发现在最前面出现了一个奇怪的.note.gnu.build-id,4K对齐之后,multiboot header都到第二页去了,根本就找不到multiboot magic嘛。读取multiboot info里的内容,把从-initrd参数传进来的文本文件print出来。打开paging,给第一个用户态进程建一个page directory,sysexit进入用户态,再sysenter回来。
xx.其他系统
https://github.com/griwes/ReaverOS
Expanded Main Page。
JamesM's kernel development tutorials
xv6的代码也不错,文档齐全,Xv6, a simple Unix-like teaching operating system
在GitHub无数个人在折腾自己的操作系统,SamyPesse/How-to-Make-a-Computer-Operating-System 路 GitHub。
OSDEV Expanded Main Page
玩具内核的 http://wiki.osdev.org/Main_Page
SamyPesse/How-to-Make-a-Computer-Operating-System 路 GitHub
linus大学期间写的linux0.11源代码版本,也对比过现在的linux2.6.5以后的区别,虽然差别很大,但是一些思想还是想通的,至少我个人认为作为一个优秀的本科确实应该能够写出一个linux0.11那样的内核,更不要说是一个硕士。虽然可能运行不会很好,采用的算法不是很高级(早期的linux版本貌似算法确实不是很高级,都是大家想的到的),但是这本身也是一种学以致用的途径,不断修改,相信总有一天能完善,我想这样的学习才能被称为学习吧!
同济大学主持的,高可用操作系统HD-Elastos,Overview - HA-Elastos