选择语言:

www.58058.com

您的位置:www.5648.com > www.58058.com >

只剩下阿谁时候开辟的全体印象

时间:2019-11-23 点击:

  不难,会C言语,学过操做系统道理,本人慢慢试探,总能写出来的……暗示大二下的时候,旁听计较机的嵌入式操做系统课,然后写过一个基于优先级安排的RTOS,跑正在STM32上,没发觉了什么bug,可是问题正在于并没什么卵用,只是为了好玩罢了。其时若是实的深切进去,花大时间去写个跑正在x86上的,估量也是行的,可是仍是没什么卵用……这些写操做系统的也仅仅是为了练练手,熟悉熟悉理论罢了,花的时间多,还没意义。你要晓得,嵌入式RTOS四处都有,freeRTOS,ucos等等,完美的一比,要你写的干嘛?像linux如许强大的,还要你写的系统?有时间去学学java,web,找份互联网的工做比正在那花时间写操做系统这类扯淡的现实正在成心义的多……

  做操做系统,最环节的是,要正在大的功能上均有所实现,正在人少力量弱的环境下,小功能不要逃求完整。只需可以或许支持下个功能的实现就行了。例如,实现内核模块动态链接功能,至多需要正在文件系统方面实现文件读取,能读取文件才能支撑后面临elf格局阐发,沉定位等一堆功能实现。可是这并不料味着你需要正在百忙中逃求文件系统中长文件名的读取这类只要用户才介意的功能。

  信号量,动静同步以及中缀屏障的学问。这一部门会让你愈加清晰地领会到Linux单内核的NB之处。

  再后来大师感觉光有使命安排的代码还不敷。最好内存办理也能简单点。还有存储设备,一个劲儿的对一个块读完了擦,擦完了写,特定的块会挂掉。诸如斯类的需求不竭呈现。于是就有了内存办理和设备驱动。

  随后认识了有一种更新的(当然现正在不新了,对其时对我),微内核,发觉内核OS,本来还能有另一种(非Linux宏内核的)设想,我们看的良多教程,几多天写操做系统,包罗前面的JamesMs kernel development tutorials,都是类unix实现,素质上设想的思和框架都雷同。微内核则是把良多本来集成到kernel的模块,通过IPC的体例,变成一个个services跑正在用户模式下面,如许大大加强了可扩展性和内核的不变性。

  大概若是是现正在的我,更情愿让其时的我去买个按小时付费的云办事器,看一下linux入门,学着搭个小网坐,grep下日记,vim,诊断东西,git什么的学一学,也还容易找工做。

  最初若是你正在读那本书,请必然要看第18页,不要去买软盘(我当初就TM没细看,去买了软盘还有软盘读盘的那种古董级此外工具,成果看到第18页了,葵花宝典:第一页:“欲练此功 必先自宫”,或人狠下心,咔,第二页“若不自宫,也能成功”,连想艹都不克不及)。。。

  硬件遵照摩尔定律成长了一阵儿之后一根筋的法式里面就得弄一大堆中缀响应。也就是说法式施行的过程中,需要让CPU停下来干此外更主要的事儿的环境多了起来。慢慢的法式布局复杂了起来,人们感觉需要做点根本工做让写代码的时候不必关心多中缀安排啥的。还有就是一次要干的事儿多了,几个事儿不克不及光靠外部中缀进行切换,得让它们有个内正在的次序。于是就有了使命安排。

  Intel 汇编或者AT&T 汇编或者嵌入汇编。这里面需要利用到int中缀,简单的算术操做指令,跳转指令,开关中缀指令(你只需要晓得一点点,完全不消看intel手稿)

  第二版正在硬件机制上没有添加几多工具(简单的忙期待的IDE驱动,简单的键盘驱动),次要是策略上和代码上做了一点点优化,参考了Linux内核的一些定名和代码(好比2.6内核的伙伴算法简化后添加进来)。

  当然若是你要从头起头写代码的话,可能不是按照这个挨次来实现的,以至我感觉可能需要几个模块交叉来写。小我感受总体来解了概念就能够写了,可是debug的过程很是的疾苦,特别是VM这一块,由于好比起头的时候映照过程的代码有bug,可能不会报错的,只要后面起头施行instruction了,才会发觉哦本来我的data segment没有映照准确。。。。

  最根基的有几个部门:1 bootloader, 你是用个现成的grub仍是本人写,良多人就倒正在这一步了。2 内存办理3 历程办理4 中缀和系统挪用5 文件系统

  Linus Torvalds认为他本人若何若何了? 链接中人有说到 “一个好一点儿的计较机硕士结业的学生。 写一个操做系统的内核绝对是该当办到并且必定能够办到的事儿。” 是如许的吗?若是实的要去写一个操做系统的内核,大要能够分成几个使命?大要是怎样做的呢? (能够请用只懂计较机根基道理,懂一点点硬件和一点点软件的人能看懂的程度注释)

  可是这些人能够本人用几个月的时间写个内核,成立正在当下相关材料出格丰硕,并且虚拟机调试出格便利的根本上的.用bochs(虽然我本人从来都没有整好过),qemu,能够轻松进行汇编级调试,qemu还能够操纵gdb remote debug来进行源码级调试.

  5. 实现VM,感受这个是最复杂的一块了,也就是实现物理内存和虚拟内存的一个映照,把这一部门实现完,那么就能够支撑user processes了,也就说根基能够实现OS的功能,对使用法式供给硬件资本的笼统。

  2. VFS, 也就是virtual file system,这一部门次要实现一些和文件相关的API,然后就是完成历程对文件操做和利用的笼统。

  若是题从更多的是为了积累经验便利当前工做,则只需要稍微领会系统道理,多沉视若何利用现有API。由于人们对这类经验看中的是你学没学会一种思惟,能不克不及晓得商用系统中怎样操纵,很少有需要你本人沉制轮子的。

  我只但愿,有人可以或许去踏结壮实地去看点书,去写点代码,而不是看了知乎的“写一个操做系统内核有多灾”之后,记住几个名词然后归去吹法螺,我但愿,他们可以或许本人起头脱手去看,去跟着写,去发觉,去收成。

  有人还说这些工具不牛x,我措辞这简直不牛x,这篇文章也并非炫耀。只是解答这小我的问题而已。但愿更多人可以或许达到本人要达到的山岳。

  后来发觉了FreeNOS,用C++写的基于微内核的操做系统,通过进修这个项目,又对操做系统,软件设想,设想模式等等大开脑洞。

  以至有些人说操做系统里边没啥算法,若是是玩具操做系统,那么可能简直不需要什么算法,由于算法本来就是为了满脚机能,效率等需求而发生的。可是,贸易的操做系统里边,必定是有良多算法的,别说内存分派,历程安排,或者文件系统了。就算是最根基的自旋锁,都有好几种算法。

  1. 历程和线程,楼上说的boot的过程本身就是做一些初始化(e.g. 加载kernel image, 初始化线程的安排器)然后运转idleprocess and initprocess。

  本书的某些代码简直不算完满,有些处所以至比力老练,做者为了照应初学者,会居心不消某些高级的成熟的开辟技巧。。。这是本书的错误谬误,也是本书的长处。由于本书的定位就是那些没啥根本却又勤学的新手。

  回到正题。操做系统是为领会决计较机科学手艺成长中碰到的现实问题。分几个步调,要看题从想处理几个问题,也就是有什么样的方针。

  要记住的是,一般没人会只由于你做了一个操做系统就给你工做。这也是我忘了操做系统只是乐趣后,才体验到的教训…但愿能帮上一些人的忙…

  所以,写一个操做系统并没有良多人说的那么简单,当然如许的说法有点了一些说比力简单的大神们,还请包容。

  操做系统包含的功能面多,对于我们而言,不成能一起头就学完所需要的各个学问,各类尺度规范和谈,现实上大大都环境下,你需要边进修,边自创,边设想,边研发。正在这个环境下,你需要清晰的晓得本人需要完成哪些功能,对于这些功能,你要有清晰的领会,然后以这些功能实现为从线,博览群书,看看平易近间的方案,linux和Windows的方案,然后再设想本人的方案。我接触过的良多人,边看30天便宜操做系统边做,或者Orangs 一个操做系统的实现 ,哪怕是一些愈加专业的册本,也会有一些不脚和局限,若是对本人做的功能不领会,只能于这些书的坑。

  当你从尝试前进到简略单纯适用(只是简略单纯罢了,临时还不包罗收集资本办理,这一部门涉及到TCP/IP和谈栈,愈加复杂)的时候,你需要考虑:

  PDF 文档以及对应的 Latex 源文件(那会只是刚起头学着用Latex,不规范的处所请见谅)也正在git仓库里一并供给(可免得费复制,请不要用于贸易用处)。git仓库里以至按照章节的形式供给了每章节竣事儿女码的样子(文档里不是全数代码都贴),以供参考。

  若是题从的目标是为了乐趣,那么有不少教程能够读一读,例如于渊的《本人脱手编写操做系统》就是我入门时看的…然而大部门书只能带你入门,之后要学工具靠得是尝试和读手册(例如Intel IA-32 Software Developer Manual)

  3. 实现一个 real file system, 这个有良多分歧的实现,但无非就是对磁盘空间的办理,实现个最简单的S5FS该当就能够了,而对于crash resiliency当前有空再说。

  我的文章受众是普通俗通的计较机专业的本科生(我也是计较机本科生结业)(列位研究生大大们,见谅)。。。但愿哪怕有一小我可以或许通过这本书,起头写一点代码。我读大学的时候见过太多人,张口杜口比尔盖茨,扎克伯格,却不知他们的偶像还写过不少代码。。。他们没工作会去看“烫烫烫,屯屯屯”的由来,也不情愿去写几行C言语代码。他们会去看各类Linux的花边故事,也不情愿本人看看操做系统的根基布局。。。学校里也是,你还没弄个网坐就有一堆传授跟你说:三大框架,并发优化,仿佛一起头弄,就要弄到尺度,弄到一个程度。。。

  一般计较机的本科生(大一的会点C言语,有点耐心,3个月)就能够了。。。有一本日本人写的书叫《30天便宜操做系统》一步一步带你写出一个操做系统内核(能够写到光盘上,从光盘启动,第一节就叫你若何实现一个“hello,world”),一般计较机的本科生(就是会一点点C言语的那种理工科生),有点耐心的线小时,三个月根基可以或许看完,跟着撸出一个操做系统内核。底子不需要什么硕士程度。不需要前面说的各类文档。现实上做者的方针以至是中学生也能看得懂,感受根基做到了(最初也就几十k的代码)。写完之后会很有成绩感。我的第一本计较机厚书就是《30天便宜操做系统》。写出来有什么鼠标键盘输入,汉字显示(书中是日文显示,因为日文中有汉字,所以其实能够算汉字显示),多历程(多使命),段页式内存办理,各类驱动,按时器,文件系统(读硬盘,文件目次和内容读取等),窗口,音乐播放,内核,api,小,图片播放,包罗万象。。。若是大学可以或许跟着写完,绝对,结业面试的时候能一下。。。当然里面的c言语编译器不是本人写的(编译器工做量实不小)。。。我当初就是国内那些书正在那里拆比,没有实正的拿得出手的科研,然后正在那里拆比的各类著做。然后人家这本,哈哈,实的就可以或许跟着撸出一个操做系统内核,并且,绝对是效率不错,布局能够的工具。。。并且人家通俗易懂,很有诚意,比起那些复制粘贴拆B的书不晓得要强几多倍。。。跟着做完内核和api的话,还能加深理解。我的意义是,你完全能够本人欢愉地把一个操做系统内核给读懂,正在半参取的形态下做出来,玩一玩,不消一起头就想的那么高深和崇高。。最初跟着一路写api,玩,理论+实践,轻松+高兴。。当前若是有乐趣能够去读linux的工具,去搞点其他的。。。高兴的成长而不是一本厚书接着一本厚书地啃,啃了半年也看不到一个hello,world和桌面,最初感慨一句放弃。那样很无趣,很苦逼。

  当你大白了理论上的代码要求,你能够起头揣摩写一个简单的操做系统内核。至于你说要分为那几步。我的高见是,正在你脱手写之前,你又必需给本人一个规划,这个规划就是:从实模式到模式一步一步的推进,从微内核到单内核的推进,从尝试到简略单纯适用的推进…

  其时2013、2014年完成了一些手艺攻关,2014、2015年一曲到广东省科技立异大赛前根基都还正在做,金亚州。省赛不测失利后就没继续做了,所以到写这些工具的时候,曾经过去了快要一年,每个功能具体入微的实现、其时对其他系统的研究、一些设备的支撑啥的这些细节都曾经忘得差不多了,只剩下阿谁时候开辟的全体印象。所以这篇文章没有给大师带来更多的学问实是欠好意义。

  Exokernel微内核的焦点概念是:只需内核还供给对系统资本的笼统,就不克不及实现机能的最大优化 -- 内核该当支撑一个最小的、高度优化的原语集,而不是供给对系统资本的笼统。从这个概念上来说,IPC也是一个太高级的笼统因此不克不及达到最高的机能。Exokernel微内核的焦点是支撑一个高度优化的原语名叫节制转移(protected control transfer, PCT)。PCT是一个不带参数的跨地址空间的过程挪用,其功能雷同于一个硬件中缀。正在PCT的根本上,能够实现高级的IPC笼统如RPC。正在MIPS R3000处置器上,一个基于PCT的RPC实现了仅10µs的开销,而正在统一硬件上运转的Mach RPC为95µs。

  这块精妙的设想,当我后来看到 erlang中的actor 模子的时候,想到就是microkernel的设想,如斯类似。

  慢慢的成长下来大师感觉这部门代码常主要的。要区别于它们所办事的代码。就有了内核和使用的区分。晚期的使用和内核是正在一路编译的,后来有了可施行文件如许的设想,就能够分隔了。

  厚脸皮保举本人基于《JamesMs kernel development tutorials》写的中文文档,若是你只要根基的C言语和汇编根本以及一点点操做系统理论的话,这是起点很低的入门读物了。项目地址:lex-doc

  OrangeS:一个操做系统的实现 (豆瓣)能够参考,只是有良多部门其实能够不消汇编写了。James的阿谁教程仍是入门最好的。

  除了是一个操做系统的实现,别的从中也能很好的进修到OOP的设想体例,整个代码气概出格好,完全基于面相对象,还有一些常见的设想模式,正在接触了这个开源项目之后,才领会,代码气概,正文,doxygen,scons,设想模式。

  有人说PS的,我也暗示理解,终究就一个图放正在这,喜好搞大旧事的人也蛮多。这里就放一个视频暗示实正在性吧。

  就说这么多吧,我的,小我网坐胡文杰的略坐,时间不早了,还有80多天就高考了,但愿这篇文章能给大师申明一些工作。还有,对于985 211院校,凭着操做系统加入自从招生容不容易一本线登科?

  总而言之,对我如许的不是研究系统架构的人来说,写一个操做系统内核也并不是一个很是简单的工作(虽然我们正在大二的时候就曾经写过了)。我仍然需要花良多的时间查材料,看文章,仍然可以或许从中进修到良多良多以前没有进修到的学问。

  这个不难。写个小内核的,仅有无限的使命安排功能的操做系统,读完CS专业大学三年级的课程即可。方针平台能够是实正在的,也能够运转正在Windows Console下。这种操做系统有良多,好比ucOS,rex,FREERTOS,等等。

  比来有人点赞,然后回头看本人四年前的回覆,看着实是应了那句话“好为人师”,本人都没搞大白,然后还热血。

  这个工具很难被称为“内核”,以至说它是“玩具内核”都是缪赞了。这只是一个看起来能运转的道理示范性质的小法式。不外不成否定,按照文档来,你能够写出一个看起来挺好玩的工具并学到一些根本学问。

  DS,ES,SS,BS,SI,DI,AX,BX等等寄放器的利用和工做道理,这是实模式下独一需要领会的一点点微机道理学问。

  系统挪用,历程切换,内存分派,磁盘拜候结构,文件系统。系统挪用包罗read,write,fork,exec,wait,exit这些最根基的系统挪用(以至不消去看dup,dup2,wait2等等临时无用的),历程切换领会pcb办理,内存就领会最简单的分派体例,文件系统就是inode节点布局(以至不需要考虑超等块等等)。

  正在接触Linux的时候,已经看到的相关Linus和Minix做者关于微内核和宏内核的辩论,让我起首接触到Minix,可是程度不敷,读起来比力费劲。

  大学的时候,二心热血,想着写个本人的简单操做系统,刚起头也是一脸茫然,起首接触的也是这份文档《JamesMs kernel development tutorials》JamesMs kernel development tutorials,对着做者的blog,出格成心思,良多概念都不是很清晰,慢慢查,正在进修完之后,对操做系统简单的有了轮廓,bootload, T IDT, 内存办理,文件系统等等。

  这是一个用C++实现的微内核的操做系统,各类宏内核中的办事做为一个的services正在微内核中,基于动静的通信体例,这点其实跟Mac内核中的mach那部门机制类似。

  虽然一个实正的内核很难很复杂,可是一个简单的Demo并不是高不可攀。即便有乐趣,进修的过程中也需要乐趣和不竭获得的成绩感,不是吗?

  我的是能够本人花些时间做一个简单的 OS,哪怕是出来也好,就是为了体味一下编程的石器时代,尔后仍是选择本人感乐趣的模块,看当作熟的操做系统是若何做的,终究人的精神和时间是无限的。

  至于有人说阿谁按钮的单词打错了,这个仿佛其时也有人说过,健忘改了……其时我的英语程度方才从不合格到合格,这种错误犯了不止一次,包罗正在一些函数中。

  我很想回覆这个问题。 我是一个高中生,自初中起头就想做一个操做系统,并付诸于步履。 我们制做的操做系统 鬼鸟操做系统,利用本人实现的 摸索者操做系统内核,曾经完成了根基的功能,外加一个不错的图形用户界面。

  雷同如许的根基功必不成少,我能够用汇编实现整套操做系统,可是考虑到可移植性,后续,我们到后期仍是用了汇编和C混编的方案。除此之外,由于操做系统运转和使用法式运转实正在分歧,这些根基功对于我们进行操做系统设想,调试都是极其主要的。

  -------------------------------------------汗青朋分-------------------------------------

  有的完成度仍是比力高的,好比klange/toaruos总共花了六年时间才做出一个根基可用的有图形界面和收集的 OS。redox-os/redox是一个 Rust 写的微内核的 OS。

  当然能够的良多,但最好仍是先把这些弄出来,才可称之为一个操做系统。材料都有,你能够参考:

  这个图就是我们操做系统正在VMware虚拟机里面的运转截图。 其实说来做操做系统,你需要起首控制一些根基功,我正在初中的时候已习了x86的汇编言语,正在高中的时候,正在正式做系统内核前,我完成了两三次每次2-3000行的汇编手艺验证代码,对汇编言语,函数思维,良多设备的特征和诸如参数传送这类浩繁小手艺细节都有了较为细致的理解。

  正在写操做系统之前,你就清晰地大白操做系统是要干什么用的。操做系统对使用法式供给了硬件层面的笼统;担任办理包罗CPU,内存,磁盘,IO等硬件资本,以及历程表,文件打开表,页表等软件资本;担任供给使用法式可用的API和系统挪用;担任硬件资本和软件资本的拜候平安和隔离性;以及供给多用户支撑等等功能。那么正在写一个操做系统之前,你就得你所写的操做系统满脚必需满脚的要求:鲁棒性,可扩展性,高效性,丰硕性,平安性。先不说后几条要求,仅仅鲁棒性一点要求,都能把一个法式员好久(呃,我这个菜鸟法式猿就被了好久)。

  可是倒退到Linus阿谁时代,一小我写内核的,绝对是绝顶高手,由于当初没有什么相关材料,大要就几本书能够参考,MINIX那本,UNIX内核设想取实现等.并且调试很是未便,只能靠本人把代码写对,很是很是的不容易.

  4. Drivers, 可能要实现一些驱动,这个就看你要实现几多了,根基上实现个Terminal Device Driver, Disk Device Driver就能够了

  除此之外,终究操做系统是个大工程,正在做这个工具的时候,我们力量小,这时就需要我们有伶俐的开辟策略。打个例如,现正在贸易级操做系统的文件系统部门所占代码量可能就曾经超越浩繁小型操做系统总代码量了,小我或者小集体开辟的操做系统,实的不克不及过多关心单一的功能,人家的工具是按贸易化考虑的,你就按照实现的角度考虑就行了,哪怕你的一些做能不会像人家那么好,一些优化算法不如人家那么无效,可是到实正的需要你考虑其效能问题的时候,你们的操做系统曾经很是大了,那时候进行贸易性的设想,比现正在的更便利。

  现正在不少人都正在通过本人写内核来进修操做系统,网上还有特地的课程(6.828 / Fall 2011 / Schedule),按照这个课程,几个月就能够完成一个功能还算完整的内核.

  最后法式员们都是纸带机啥的写点0和1。后来写写汇编,都是针对硬件间接编程。也不区分什么内核使用什么的,都是一个线串下来。

  虽然良多人说写一个操做系统内核是比力简单地工作,可是,若是你只要一点点软件和一点点硬件根本,那么我能够安心地告诉你,这绝对不是一件很简单的事。除非你指的操做系统就是一个稍微能节制一下资本或者稍微能运转几个历程的简单工具罢了。



友情链接:

Copyright 2019-2022 http://www.ysdzcctv.cn 版权所有 未经协议授权禁止转载