自己写操作系统?
2017-01-14 22:52
381 查看
一、在搜索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语言 一个月内写出一个操作系统,这个操作系统包含:
图形界面
多任务
汉字显示
文件压缩
听音乐
看图片
玩游戏
...
照着做了一个星期,很多时候都是在查BIOS手册;不过这本书本身倒是满有趣的,作者的写的浅显易懂
5.
《Orange'S:一个操作系统的实现》与《自己动手写操作系统》
Orange'S:一个操作系统的实现
(豆瓣)
http://blog.csdn href="http://lib.csdn.net/base/dotnet" target=_blank>.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
详细的内容可以参见知呼论坛: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语言 一个月内写出一个操作系统,这个操作系统包含:
图形界面
多任务
汉字显示
文件压缩
听音乐
看图片
玩游戏
...
照着做了一个星期,很多时候都是在查BIOS手册;不过这本书本身倒是满有趣的,作者的写的浅显易懂
5.
《Orange'S:一个操作系统的实现》与《自己动手写操作系统》
Orange'S:一个操作系统的实现
(豆瓣)
http://blog.csdn href="http://lib.csdn.net/base/dotnet" target=_blank>.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
相关文章推荐
- Linux Kernel 4.0 RC5 发布!
- 应用领航:盘点那些年我们一起追过的OS
- 无奇不有!盘点各国自己开发的操作系统
- 页面缓存:内存和文件之间的那些事
- Lua的内存管理浅析
- 可自定义oem的萝卜家园 Ghost XP 新春装机版 V200801 下载
- C#实现判断操作系统是否为Win8以上版本
- Docker 容器文件系统详细介绍(图文)
- 跟我学习JScript的Bug与内存管理
- js获取本机操作系统类型的两种方法
- 跟我学习javascript的垃圾回收机制与内存管理
- Linux操作系统添加新硬盘方法
- Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码
- java如何获取本地操作系统进程列表
- Linux rdesktop操作系统下远程登录Windows XP桌面
- 32位操作系统认出超出4G内存的方法
- Linux rpm tar 操作系统下软件的安装与卸载方法
- 文件系统变为raw 无法访问的解决方法
- PHP 文件系统详解
- JavaScript 获取用户客户端操作系统版本