关于电脑的一些让人很难回答的问题的问题

写一个操作系统内核有多难?大概的内容、步骤是什么?
链接中人有说到“一个好一点儿的计算机硕士毕业的学生。写一个操作系统的内核绝对是应该办到而且肯定可以办到的事儿。”是这样的吗?如果真的要去写一个操作系统的内核,大概可以分成几个任务?大概是怎么做的呢?(可以请用只懂计算机基本原理,懂一点点硬件和一点点软件的人能看懂的水平解释)
按投票排序
厚脸皮推荐自己基于《JamesM's kernel development tutorials》写的中文文档,如果你只有基本的C语言和汇编基础以及一点点操作系统理论的话,这是起点很低的入门读物了。项目地址:------------------------------------------补充一下文档目录:项目概述和开发环境配置计算机启动过程、GRUB 以及 multiboot 标准裸机上运行的 Hello OS Kernel字符模式下的显卡驱动相关库函数和调试打印函数添加全局段描述符表添加中断描述符表完成中断请求和定时器中断物理内存管理的实现虚拟内存管理的实现内核堆管理的实现内核线程的创建与切换接下来如何继续学习------------------------------------------
这个东西很难被称为“内核”,甚至说它是“玩具内核”都是缪赞了。这只是一个看起来能运行的原理示范性质的小程序。不过不可否认,按照文档来,你可以写出一个看起来挺好玩的东西并学到一些基础知识。
虽然一个真正的内核很难很复杂,但是一个简单的Demo并不是遥不可及。即使有兴趣,学习的过程中也需要乐趣和不断获得的成就感,不是吗?
祝你玩的愉快~
“一个好一点儿的计算机硕士毕业的学生。写一个操作系统的内核绝对是应该办到而且肯定可以办到的事儿。” ------这句话我们可以理解为”一个好的计算机硕士掌握的理论知识足够他搭建起一个简单的操作系统框架“。我上操作系统课(大二)的第一天就问我的老师,学完了这门课可以自己实现一个操作系统了吗?老师说:”你可以基本掌握操作系统中要处理的主要问题,但是即使实现最简单的五脏俱全的操作系统还需要掌握很多很多东西,而且前提是你已经有很不错的代码能力。“回到题目上来,我们要实现一个简单的操作系统,最先需要解决的是哪些问题?这个问题我相信翻开任何一本操作系统书都可以得到答案,一般都是操作系统书的前五,六章内容(第一章基本是操作系统概念及发展历史)。包括:进程管理存储管理文件系统输入/输出这些大部分是讨论理论类的书,比如我们上课用的书是西电汤子瀛老师的《计算机操作系统》,后来自己为了深入学习买了Andrew S. Tanenbaum的《Modern Operating Systems》。如果想写个操作系统,除了理论知识外,动手之前最好先看看操作系统源代码,Linux的代码都是开源的,可以先学习学习。不过对于我们这种初学者千万不要看最新的Linux内核代码,因为那是很多人的杰作,可能一辈子都看不完。最好先看看国内同济大学赵炯基于0.11的《Linux完全注释》,即使只看懂30%也至会让自己懂很多之前不知道的东西。理论类的书很少有提到Bootload问题的,就是加电之后从哪里开始执行的部分。仅仅是这个步骤也需要花不少时间去了解CPU知识,汇编语言知识等,相当不容易。不话说回来,这部分如果能处理好之后会发现组成原理,汇编语言,微机原理的知识被自己运用到了,成就感巨大。这部分内容,可以参看MIT的课程6.828 Operating System Engineering的课程,Google一下就能搜到不少大牛关于这门课的博客。如果英语不太好我记得华中科技大学有一个叫32位操作系统实践的课,资料都放到网上了,看起来很不错。过了这一关,用《深入理解计算机系统》加上《现代操作系统》看一下虚拟存储器的内容,这两本书这部分说得都很棒。虚拟存储器的概念贯穿所有,如果能弄懂,对很多方面都有很大的帮助,不仅仅是操作系统这块。有了虚拟存储器概念之后对于链接,加载等知识理解就会深刻许多。 不过,这部分内容也需要对硬件部分有所了解,又是一坑。之后回到进程上来之后,终于可以把工作重心从硬件部分转移过来了。但是我们又将面对进程创建,进程调度,进程通信三大问题,既然是简单实现,就先不考虑线程的事。算法书中会给很多,不过这些算法都是有一定的局限性,比如调度算法,对应的调度算法优劣差异很大,至于如何抉择就看个人需求。不过话说回来,操作系统里的”算法“和ACM里的算法在难度上差很多,还是比较容易实现的。内容太多了,就不完全展开了,后面就看自己“耐力”了,写操作系统是需要坚持很长实践+大量知识积累的。有些问题还涉及到哲学的观点,这里推荐上海交大邹恒明教授的《操作系统之哲学原理》。除了理论方面的书,现在市面上也有直接教如何实现一个操作系统的,比如《Orange'S:一个操作系统的实现》和《30天自制操作系统》(仅有的几本“XX天XX”而不是烂书的书),起步阶段跟着这些书来还是很不错的。总之,实现最最基本的功能也许可以做到。实现功能强大,鲁棒性强的操作系统极难。不过在此过程中学到了很多很多东西。无论最后能否实现属于自己的操作系统,在此过程中收获的知识是一笔宝贵的财富。
不是太难,关键还是需要兴趣,如果你真的想刨根问底,没什么能挡住你。最基本的有几个部分:1 bootloader, 你是用个现成的grub还是自己写,很多人就倒在这一步了。2 内存管理3 进程管理4 中断和系统调用5 文件系统, 当然可以折腾的很多,但最好还是先把这些弄出来,才可称之为一个操作系统。资料都有,你可以参考: 。xv6的代码也不错,文档齐全,在GitHub无数个人在折腾自己的操作系统,。 可以参考,只是有很多部分其实可以不用汇编写了。James的那个教程还是入门最好的。你要做的就是准备好时间,做,看,做,看...
现在不少人都在通过自己写内核来学习操作系统,网上还有专门的课程(),按照这个课程,几个月就可以完成一个功能还算完备的内核.但是这些人可以自己用几个月的时间写个内核,建立在当下相关资料特别丰富,而且虚拟机调试特别方便的基础上的.用bochs(虽然我自己从来都没有整好过),qemu,可以轻松进行汇编级调试,qemu还可以利用gdb remote debug来进行源码级调试.但是倒退到Linus那个时代,一个人写内核的,绝对是绝顶高手,因为当初没有什么相关资料,大概就几本书可以参考,MINIX那本,UNIX内核设计与实现等.而且调试非常不便,只能靠自己把代码写对,非常非常的不容易.
尽管上面很多人说写一个操作系统内核是比较简单地事情,但是,如果你只有一点点软件和一点点硬件基础,那么我可以放心地告诉你,这绝对不是一件很简单的事。除非你指的操作系统就是一个稍微能控制一下资源或者稍微能运行几个进程的简单东西而已。在写操作系统之前,你就清晰地明白操作系统是要干什么用的。操作系统对应用程序提供了硬件层面的抽象;负责管理包括CPU,内存,磁盘,IO等硬件资源,以及进程表,文件打开表,页表等软件资源;负责提供应用程序可用的API和系统调用;负责保护硬件资源和软件资源的访问安全和隔离性;以及提供多用户支持等等功能。那么在写一个操作系统之前,你就得保证你所写的操作系统满足必须满足的要求:鲁棒性,可扩展性,高效性,丰富性,安全性。先不说后几条要求,仅仅鲁棒性一点要求,都能把一个程序员折腾很久(呃,我这个菜鸟程序猿就被折腾了很久)。当你明白了理论上的代码要求,你可以开始琢磨写一个简单的操作系统内核。至于你说要分为那几步。我的拙见是,在你动手写之前,你又必须给自己一个规划,这个规划就是:从实模式到保护模式一步一步的推进,从微内核到单内核的推进,从实验到简易实用的推进…当你开始写实模式的操作系统内核时,你得要会一下这些必须知道的知识:(哪怕一点点)操作系统启动原理,也就是bootloader的作用,包括魔数,MBR等等Intel 汇编或者AT&T 汇编或者嵌入汇编。这里面需要使用到int中断,简单的算术操作指令,跳转指令,开关中断指令(你只需要知道一点点,完全不用看intel手稿)DS,ES,SS,BS,SI,DI,AX,BX等等寄存器的使用和工作原理,这是实模式下唯一需要了解的一点点微机原理知识。信号量,消息同步以及中断屏蔽的知识。这一部分会让你更加清楚地了解到Linux单内核的NB之处。系统调用,进程切换,内存分配,磁盘访问布局,文件系统。系统调用包括read,write,fork,exec,wait,exit这些最基本的系统调用(甚至不用去看dup,dup2,wait2等等暂时无用的),进程切换了解pcb管理,内存就了解最简单的分配方式,文件系统就是inode节点结构(甚至不需要考虑超级块等等)。当你进步到保护模式的时候,你就得额外学习其他的知识了,这些知识包括但不限于:地址转换的概念,段页的概念,页表访问,MMU,TLB等原理。什么是内核模式,什么是用户模式,ring0~3是怎么具体保证的的EAX,EBX,ECX等等通用寄存器以及控制寄存器,GDT,LDT的概念更高级的内存分配模式,例如slab或者懒惰伙伴分配等等。更高级文件系统,ext3,ext4等等。当你又从微内核进步到单内核的时候,你需要考虑:微内核中一些模块如进程分配服务,内存分配服务,文件管理服务,设备驱动服务如何集成到内核,哪些可以集成到内核,哪些不能。自旋锁,信号量,消息同步的有什么区别,如何避免死锁。单内核的系统调用和微内核系统调用的区别等等。当你从实验进步到简易实用(只是简易而已,暂时还不包括网络资源管理,这一部分涉及到TCP/IP协议栈,更加复杂)的时候,你需要考虑:操作系统效率以及安全性问题,这里面涉及到进程调度,内存管理算法,磁盘调度算法等等方面。系统调用的丰富性问题,是不是支持大部分的系统调用。基本应用程序的支持性问题,例如shell,cat,wc,cd,ls这些简单的总要支持。POSIX标准的支持问题,能不能支持编译运行一些原始版本的程序。总而言之,对我这样一个刚刚研一的不是研究系统架构的人来说,写一个操作系统内核也并不是一个非常简单的事情(尽管我们在大二的时候就已经写过了)。我仍然需要花很多的时间查资料,看文章,向我的一直奋战在一线的参与Linux以及KVM内核维护的可爱的bash老师(他在我们的学校bbs上的ID叫bash)请教,我仍然能够从中学习到很多很多以前没有学习到的知识。所以,写一个操作系统并没有很多人说的那么简单,当然这样的说法有点冒犯了上面一些说比较简单的大神们^-^,还请包涵,毕竟我代表的是平均智商,哈哈。当然如果我自己的一点点粗浅的理解能够帮助到lz,那就比较好啦…
写个玩具内核不难,固然学习与理解需要花费比较长的时间,但总体而言本科硕士的知识面已经足够了。关于内容和大体步骤,当时写了一点东西,如果感兴趣可以作为参考:写个玩玩还是挺超值的,对得起上学没处打发的时间。ps:
Linus 可比一般的喷子脑残之流凭他们可怜的想象力所沾到的影子牛逼多了。
借这个问题,正好把自己以前走过的总结下。zero to one大学的时候,一心热血,想着写个自己的简单操作系统,刚开始也是一脸茫然,首先接触的也是这份文档《JamesM's kernel development tutorials》,对着作者的blog,特别有意思,很多概念都不是很清楚,慢慢查,在学习完之后,对操作系统简单的有了轮廓,bootload, GDT IDT, 内存管理,文件系统等等。microkernel vs monolithic随后认识了有一种更新的理念(当然现在不新了,对当时对我),微内核,发现内核OS,原来还能有另一种(非Linux宏内核的)设计,我们看的很多教程,多少天写操作系统,包括前面的JamesM's kernel development tutorials,都是类unix实现,本质上设计的思路和框架都类似。微内核则是把很多原来集成到kernel的模块,通过IPC的方式,变成一个个services跑在用户模式下面,这样大大增强了可扩展性和内核的稳定性。这块精妙的设计,当我后来看到 erlang中的actor 模型的时候,想到就是microkernel的设计,如此相似。这块精妙的设计,当我后来看到 erlang中的actor 模型的时候,想到就是microkernel的设计,如此相似。在接触Linux的时候,曾经看到的有关Linus和Minix作者关于微内核和宏内核的争论,让我首先接触到Minix,但是水平不够,读起来比较吃力。后来发现了FreeNOS,用C++写的基于微内核的操作系统,通过学习这个项目,又对操作系统,软件设计,设计模式等等大开脑洞。FreeNOS这是一个用C++实现的微内核的操作系统,各种宏内核中的服务作为一个独立的services在微内核中,基于消息的通信方式,这点其实跟Mac内核中的mach那部分机制相似。除了是一个操作系统的实现,另外从中也能很好的学习到OOP的设计方式,整个代码风格特别好,完全基于面相对象,还有一些常见的设计模式,在接触了这个开源项目之后,才了解,代码风格,注释,doxygen,scons,设计模式。不仅涵盖了所有的操作系统的设计,学习,更接地气的包括了各种优美设计。Exokernel微内核新一代的微内核,MIT出品。Exokernel微内核的核心观点是:只要内核还提供对系统资源的抽象,就不能实现性能的最大优化 -- 内核应该支持一个最小的、高度优化的原语集,而不是提供对系统资源的抽象。从这个观点上来说,IPC也是一个太高级的抽象因而不能达到最高的性能。Exokernel微内核的核心是支持一个高度优化的原语名叫保护控制转移(protected control transfer, PCT)。PCT是一个不带参数的跨地址空间的过程调用,其功能类似于一个硬件中断。在PCT的基础上,可以实现高级的IPC抽象如RPC。在MIPS R3000处理器上,一个基于PCT的RPC实现了仅10us的开销,而在同一硬件上运行的Mach RPC为95us。对磁盘的处理,跟微内核的比较坚持成长,更多的不在于结果,关乎过程。共勉~
这个不难。写个小内核的,仅有有限的任务调度功能的操作系统,读完CS专业大学三年级的课程即可。目标平台可以是真实的,也可以运行在Windows Console下。这种操作系统有很多,比如ucOS,rex,FREERTOS,等等。最初程序员们都是纸带机啥的上面写点0和1。后来写写汇编,都是针对硬件直接编程。也不区分什么内核应用什么的,都是一个线串下来。硬件遵循摩尔定律发展了一阵儿之后一根筋的程序里面就得弄一大堆中断响应。也就是说程序执行的过程中,需要让CPU停下来干别的更重要的事儿的情况多了起来。慢慢的程序结构复杂了起来,人们觉得需要做点基础工作让写代码的时候不必关注多中断调度啥的。还有就是一次要干的事儿多了,几个事儿不能光靠外部中断进行切换,得让它们有个内在的秩序。于是就有了任务调度。再后来大家觉得光有任务调度的代码还不够。最好内存管理也能简单点。还有存储设备,一个劲儿的对一个块读完了擦,擦完了写,特定的块会挂掉。诸如此类的需求不断出现。于是就有了内存管理和设备驱动。慢慢的发展下来大家觉得这部分代码是非常重要的。要区别于它们所服务的代码。就有了内核和应用的区分。早期的应用和内核是在一起编译的,后来有了可执行文件这样的设计,就可以分开了。上面的例子可能不够准确。大家轻拍。回到正题。操作系统是为了解决计算机科学技术发展中遇到的实际问题。分几个步骤,要看题主想解决几个问题,也就是有什么样的目标。
一般计算机的本科生(大一的会点C语言,有点耐心,3个月)就可以了。。。有一本日本人写的书叫《30天自制操作系统》一步一步带你写出一个操作系统内核(可以写到光盘上,从光盘启动,第一节就叫你如何实现一个“hello,world”),一般计算机的本科生(就是会一点点C语言的那种理工科生),有点耐心的话,每天2~3小时,三个月基本能够看完,跟着撸出一个操作系统内核。根本不需要什么硕士水平。不需要前面说的各种文档。事实上作者的目标甚至是中学生也能看得懂,感觉基本做到了(最后也就几十k的代码)。写完之后会很有成就感。我的第一本计算机厚书就是《30天自制操作系统》。写出来有什么鼠标键盘输入,汉字显示(书中是日文显示,由于日文中有汉字,所以其实可以算汉字显示),多进程(多任务),段页式内存管理,各种驱动,定时器,文件系统(读硬盘,文件目录和内容读取等),窗口,音乐播放,内核保护,api,小游戏,图片播放,应有尽有。。。如果大学能够跟着写完,绝对,毕业面试的时候能吹嘘一下。。。当然里面的c语言编译器不是自己写的(编译器工作量真不小)。。。我当初就是看不惯国内那些书在那里装比,没有真正的拿得出手的科研成果,然后在那里装比的各种著作。然后人家这本,哈哈,真的就能够跟着撸出一个操作系统内核,而且,绝对是效率不错,结构可以的东西。。。而且人家通俗易懂,很有诚意,比起那些复制粘贴强行装B的书不知道要强多少倍。。。跟着做完内核保护和api的话,还能加深理解。
我的意思是,你完全可以自己快乐地把一个操作系统内核给读懂,在半参与的状态下做出来,玩一玩,不用一开始就想的那么高深和神圣。。最后跟着一起写api,玩游戏,理论+实践,轻松+愉快。。以后如果有兴趣可以去读linux的东西,去搞点其他的。。。愉快的成长
而不是一本厚书接着一本厚书地啃,啃了半年也看不到一个hello,world和桌面,最后感叹一句放弃。那样很无趣,很苦逼。----------------------------------------------------补充分割线------------------------------------------------------本书的某些代码的确不算完美,有些地方甚至比较幼稚,作者为了照顾初学者,会故意不用某些高级的成熟的开发技巧。。。这是本书的缺点,也是本书的优点。因为本书的定位就是那些没啥基础却又好学的新手。最后如果你在读那本书,请一定要看第18页,不要去买软盘(我当初就TM没细看,去买了软盘还有软盘读盘的那种古董级别的东西,结果看到第18页吐血了,葵花宝典:第一页:“欲练此功 必先自宫”,某人狠下心,咔,第二页“若不自宫,也能成功”,连想艹都不能)。。。----------------------------------------------------补充分割线------------------------------------------------------我的文章受众是普普通通的计算机专业的本科生(我也是计算机本科生毕业)(各位研究生大大们,见谅)。。。希望哪怕有一个人能够通过这本书,开始写一点代码。我读大学的时候见过太多人,张口闭口比尔盖茨,扎克伯格,却不知他们的偶像还写过不少代码。。。他们没事情会去看“烫烫烫,屯屯屯”的由来,也不愿意去写几行C语言代码。他们会去看各种Linux的花边故事,也不愿意自己看看操作系统的基本结构。。。学校里也是,你还没弄个网站就有一堆教授跟你说:三大框架,并发优化,仿佛一开始弄,就要弄到标准,弄到一个水平。。。我只希望,有人能够去踏踏实实地去看点书,去写点代码,而不是看了知乎的“写一个操作系统内核有多难”之后,记住几个名词然后回去吹牛,我希望,他们能够自己开始动手去看,去跟着写,去发现,去收获。
严格来讲,我们上OS课的每个人都写过。不知道你有没有做过jos lab,那个就是要自己写一个内核(虽然是在既定框架下)。要是急于写出来的话,去看《30天自制操作系统》,跟着敲代码就好。
我认为,某些专业的合格硕士生建造一个
时代的汽车也并不难。但是我不知道这么做有什么实际意义。我还看到有人说:「初学者千万不要看 Linux 代码」「可能一辈子都看不完」。这是最最误导初学者的言论。学汽车难道不去看真正的发动机,去看 Karl Benz 的古董?去看标准模型做的玩具?一个 Audi 的 TFSI 发动机的细节,研究十年不一定能穷尽。但是那不意味着这台发动机的知识是不分层次的。组织合理的话,你在这台发动机上花的实践可以和得到的知识成正比。题外话:拿 Linus 开涮的人我都绕着走 —— 当经理的肯定不是好鸟,做技术的早晚摔跟头。
感觉很难啊。根本就找不到足够好的tutorial。现在连手机都64位了,很多人还一个劲的在写32位的tutorial。32位就32位吧,很多教程还是从bootloader开始讲起的,还得去纠缠各种历史遗留问题。比如,那本自己动手写操作系统就很不好。之前妄图看这本书来学写操作系统,结果死在bootloader上了。我觉得像我这种弱渣首先要端正心态,能绕过的就应该绕过,有的抄的代码就应该抄,而不是自己写。再说了那个MIT 6.828 Lab里的JOS不就是这样的嘛。于是我就照着MIT 6.828,以及,开始学写操作系统内核了。决定用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回来。折腾了一个星期就到这儿了,感觉这部分其实也不是很难嘛。之前看自己动手写操作系统,真是被吓到了,一个星期过去了还在折腾bootloader ...现在可以进入正题了,但是感觉中断,IPC,进程调度和内存管理全是搅在一起的,不知道怎么分开,最好是大部分工作都能丢给用户态去完成。其实我是来求高手带的 ...
反对排名一二三的回答。
这几个回答全都局限于x86的框架。这个世界除了x86以外,还有嵌入式系统。嵌入式系统的操作系统真的不难,连我这个财会专业毕业生,都写过操作系统,freertos核心只有三个文件。嵌入操作系统比桌面应用会和服务器简单太多了。静下心研究开源的freertos,ucos,djyos,应该一学期足够弄个类似的出来。
有人推荐《自己动手编写操作系统》,不过我还是喜欢赵炯的《Linux内核完全注释》,用的是linux-0.11的源码。
写个操作系统不难(许多人在写操作系统,国内也有一些人再写)。有本叫做《30天自制操作系统》的书,用汇编和C语言 一个月内写出一个操作系统,这个操作系统包含:图形界面多任务汉字显示文件压缩听音乐看图片玩游戏...我照着做了一个星期,发现对制作操作系统没有什么兴趣,因为很多时候都是在查BIOS手册;不过这本书本身倒是满有趣的,作者的写的浅显易懂,语言很油墨,我有时候看了笑到肚子疼。--------如果搜索 微型操作系统,还可以发现许多操作系统。--------Linus的牛叉之处,不仅仅是他的技术,就编程技术而言,Linus是个高手,但是还不是当今世界上一流高手。有很多人能够写出优秀的操作系统,能够坚持做下去的就没多少了。Linus的领导能力也是独一无二的,做一帮性格怪异、遍布世界的编程天才的“首领”,不是每个人都能做到的;Linus讨厌冠冕堂皇“办公室文化”,他经常说脏话,还毫不留情地骂自己的“队友”,但不得不承认,他粗鲁的言语确实很有道理;反而现在很多人满口大道理、各种花言巧语,实际上却什么都没说,或者说的都是谎言;
或许可以看看这个, 加上汇编貌似也才几k行代码而已,当然基础知识是必须的
真不难……相信我你需要了解的只是平台相关的一点知识,配合操作系统的原理,写一个简单的能跑起来的内核真的一点都不困难。我大四的时候就自己写了一个……
linus确实非常牛逼,虽然他当年发布的linux最初版本非常简陋,现在的优秀(计算机)硕士对着教材也可以写出来. 但是人家当年没有没有教材,只有很少的参考资料,要写出来就很不容易.何况, 今天能够写出操作系统内核的硕士同学, 如果他(像linus一样)坚持搞操作系统20年,也可以变得很牛逼.
当然未必能有linus牛逼.
想听实话吗?玩具内核中学生受过训练都能写.写代码,的确是世界上最简单的事.写操作系统内核,甚至连高等数学都不需要会,也没有特别难的算法和数据结构,算是最简单的一类程序,仅仅比脚本复杂一点./////////////////////////////////////////分割线//////////////////////////////有人要说了:答主你这么强行xx真的好吗?真的好.下面总结下写一个操作系统内核需要具备的知识:\t1.(知乎这个居然不能加制表符,我手动\t了,你们就当成有制表符看吧吧)一门能操作底层的编程语言,汇编的一点基础必须有(至少得知道代码段数据段栈段这类的,还有函数调用的约定,如果你用C内嵌汇编的话),C语言最好熟练掌握.如果要编写的平台上有成型的C++编译器,也可以利用.但没有new基本上类是废的,就当成有构造函数的结构体就行了....\t2.计算机组成原理的理解.这个只要知道点汇编基础基本上都能有.\t3.操作系统原理的理解,包括操作系统内核的几大功能,还有一些操作系统中用到的数据结构.\t4.程序调试经验.\t5.耐心.////////////////////////////////////////分割线////////////////////////////需求:既然是玩具内核,那就应该忽略一些仅仅靠时间堆砌就能完成的部分.因此文件系统就没必要实现了.嵌入式环境是一个比较理想的环境.要实现基本的任务按优先级调度和优先级内部轮转调度,内存动态分配回收,消息机制,锁机制等等.如果感兴趣可以研究保护模式,分页机制,不过嵌入式环境没这个条件.保护模式的精髓就在于利用分页寄存器实现了地址空间变换,提供了内核空间和用户态空间两套地址空间.那么怎么规划开发流程呢?我的思路是:(可供参考不一定最好)首先要实现高可扩展性,就必须先动态分配和回收内存.因此先造个malloc和free.声明一个大数组,让你的malloc()在这个数组里分配空间给各个进程以供使用.这块内存里构造出内存控制块结构,记录内存的分配和回收情况.这个可以参考UnixV6.然后,要构造出抽象的各个概念的管理结构.进程要被操作系统接管,因此进程控制块(TaskControlBlock,TCB)是一个重要结构.里面至少要记录进程的一些基本信息(已用时间,优先级,资源列表,函数指针,栈区空间等).消息结构也很必要.可以实现简单的邮槽机制,进程接收消息构造成先进先出的队列比较符合一般的思维习惯.定时器结构,里面放一个函数指针之类的,这都是可以的.中断管理块,如果你考虑未来这方面的深入的话.如果你想做的复杂一些,加上一点文件系统和输出之类的,那就还得加上文件控制块结构,并且接触更底层的操作,用中断直接控制处理器与外设交互.这个有资料可以查,但我没实现过.然后就是一些关键的函数.因为C没有类,结构体刚构造出来的时候是一团乱糟糟的东西在里面.因此上面的各个结构都需要有"构造函数".有了malloc,要new也不难.然后就是控制各种结构的行为.比如进程的调度需要上调度器锁,寄存器压栈,栈区空间的切换,寄存器弹栈,优先级更改,时间片计数,卸调度器锁等等操作.这个自由度比较大,有一定发挥的空间.比如可以做成实时操作系统,类似uC_OS2,也可以做成类似linux那种,有个prio和一个nice值在里面,有个红黑树之类的.不过一般嵌入式空间不允许你这么折腾...然后还有定时器调度,进程的启动与终止资源回收之类的.反正有了malloc和free,,这些都是时间问题.为了保证可移植性,最好把和CPU相关的代码单独拿出来放到一个头文件里去.对了,前面忘了说了,这些结构和函数摆放的顺序也是有讲究的,然后呢,不同的编译器对宏的支持和一些细节的语法要求也不太一样,不同的工作环境栈区增长方向不一定一样,这个都得试一试.其实写操作系统真不算难的,这种玩具内核连个复杂点的数据结构都没有.写数据库起码还得有个B树呢,写浏览器还有个http协议,图形,html读取的问题在里面,写编译器有文法分析什么的,相比之下操作系统内核真心不算难了.///////////////////////////////////////最后一个分割线//////////////////////////////////当然了,你要是不做玩具内核,而是做真正能用的商业内核,那可难了.这种难度主要是软件工程方面的.上千万行的代码需要许多人分工协作,开发用的东西比较底层,debug也不是很方便.因此难度很高.有了内核还不算,还要有优良的生态系统.因此与其从头写一个,不如用现成的linux内核,成熟稳定.连嵌入式平台都有用Linux的.
一两句说不清!说到可操作性,去看于渊的书《自己动手写操作系统》《Orange'S:一个操作系统的实现》。}

我要回帖

更多关于 我们很难确定你的电脑 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信