《临汾》信息网:【<自制>操作系统11】(中场休息之细节)是魔鬼

admin 5个月前 (04-24) 科技 45 1
Java中HashSet({的})重复性与判等运算重载

‘如果你有幸看到这〖一〗’章,『那么恭』喜你,你已经完成<{<了>}>整个操作(系统({的})〖一〗多半)<{<了>}>, 而[且如果你前面({的})东西都完全掌握<{<了>}>,{那后面无非就是顺水}推《舟》({的})事情<{<了>}>。本章不做继续({的})讲解, 而[是将之前({的})知识进行回顾,并把相似({的})知识点做对<比>。同时我也将到目前 为[止最大({的})感悟 【细节是魔鬼】 分享给大家。

〖一〗、到目前 为[止({的})程序流程图

《 为[<{<了>}>让》大家清楚目前({的})程序进度,画<{<了>}>到目前 为[止({的})程序流程图,如下。其实就是截至到内存管理这〖一〗<块>

 二、回顾〖一〗下我们都做<{<了>}>些『什么』

 这里列出整个系列到目前 为[止({的})目录,刚好也可以作 为[索引方便大家阅读<{<了>}>

  • 【{自制操作系}统01】「硬」核讲解计算{机}({的})启动过程
  • 【{自制操作系}统02】环境准备与启动区实现
  • 【{自制操作系}统03】{读取硬盘中}({的})数据
  • 【{自制操作系}统04】从实模式到保护模式
  • 【{自制操作系}统05】『开』启内存分页{机}制
  • 【{自制操作系}统06】终于开始用 C <语言><{<了>}>,{‘《《第》》’}〖一〗行内核代码!
  • 【{自制操作系}统07】深入浅出特权级
  • 【{自制操作系}统08】【中断】
  • 【{自制操作系}统09】【中断】({的})代码实现
  • 【{自制操作系}统10】内存管理系统

  {‘《《第》》’} 01 和 02 部分没有实质性({的})代码,但却是学习〖一〗个新东西({的})必要开始,【也就是解除困惑】,梳理流程。〖它告诉〗<{<了>}>我们 计算{机}({的})启动过程,也就是计算{机}按下开{机}《键之后》,《初始》({的})程序计数器 IP ({的})值指向<{<了>}>哪里,初始执行({的}) BIOS 中写死({的})程序做<{<了>}>『什么』,又「跳转」到<{<了>}>哪里。这让我们至少拥有<{<了>}>能够写出〖一〗个让电脑按下开{机}《键之后》不报错并成‘功「跳转」到我们所’写({的})代{码}({的})程序。之后({的})代码,就是在这两部分所创造({的})基本框架中添油加醋完成({的})。

  {‘《《第》》’} 03 《部分》是 {读取硬盘中}({的})数据。我们所写({的})程序肯定是放在硬盘里({的}),《需》要‘加载’到内存中才能【被】 CPU 〖一〗条〖一〗条取指令并执行。 虽然[ BIOS 帮我们完成<{<了>}>启动区({的})‘加载’任务,但这只是很小({的})〖一〗部分,我们不能及期望于将操作系统所有代码都写到启动区这 512 字节中,所以启动区里({的})代码需 要实现把更多在[硬盘中({的})程序‘加载’到内存中,这样〖一〗个关键任务。

  {‘《《第》》’} 04 《部分》是 实模式到保护模式,这也是{‘《《第》》’}〖一〗次 CPU 「厂商和操作系」统 打配合。我们只需要按照 CPU 要求({的}),「<比>如」 写好段描述符结构、‘加载’ gdt、将 cr0 ({的}) pe 『位置』 1 等,就可以顺利开启 CPU ({的})保护模式,利用其保护模式({的})特征<{<了>}>。

  {‘《《第》》’} 05 《部分》是 『开』启内存分页{机}制,这又是〖一〗次 CPU 「厂商和操作系」统打配合({的})案例,也是按照 CPU 要求({的})步骤,把该有({的})数据结构(页目录表和页表)写好,就可以〖开启分页〗{机}制,利用其提供({的})分页特征<{<了>}>,由于打配合({的})案例越来《越多》,〖一〗会我单独总结。

  {‘《《第》》’} 06 《部分》是我们 {‘《《第》》’}〖一〗次使用 C <语言> 来做事,也可以看出,之前用汇编<语言>把那些 ‘杂事’ 都处理干净<{<了>}>,真正写内核主代码时,再把 C <语言>请过来。我们学高级<语言>({的})人,(包括我自)己,都是认 为[越底层({的})<语言>越高端。不过从我们这个系列({的})角度看,汇编做({的})都是‘杂事’,或者 C <语言>不屑于做({的})事情, 而[ C <语言>做({的}),才是“「高大」上”({的})事。所以学习这个系列,(包括我自)己写这个系列,也是让我从两个角度来审视这个问题<{<了>}>,也再也不会去争论到底高级<语言>高级,还是低级<语言>高级({的})事情<{<了>}>。

  {‘《《第》》’} 07 《部分》是 深入浅出特权级,这部分也是没有代码。这部分就提到<{<了>}>我们常说({的}) 内核态、『用户态』,只不过是从细节入手,讲述<{<了>}>特权级是怎么进行 保护、以及怎么进行 「跳转」 ({的})。(至于保护),自然有〖一〗套公式规则来判断,至于「跳转」,也是有〖一〗套「跳转」规则,也就是『什么』特权级,在『什么』情况下,能跳到『什么』特权级下。当然这只是简单({的})描述,实际情况要复杂得多。

  {‘《《第》》’} 08 和 09 《部分》是 【中断】,从硬件讲到<{<了>}>软件,同时也指出<{<了>}>〖一〗个重要({的})思想,就是 操作系统是个死循环,是靠【中断】驱动 ({的}),我们({的})操作系统就是随〖时等待着各种中〗断进来,然后执行相应({的})【中断】处理程序, 为[整个操作系统({的})运行方式做<{<了>}>个思想准备。

  {‘《《第》》’} 10 《部分》是 内存管理系统,我们实现<{<了>}>简单({的})四个 《内存池》 ({的})管理,并最终实现<{<了>}>〖一〗个 申请内[核内存空间 ({的})函数,该函数自动在内核({的})虚拟《内存池》中和物理《内存池》中找到可用({的})内存页,{并将其映射到页表}中。『这让我们对内存管』理有<{<了>}>个初步({的})认识。这<块>就不再需要更多({的}) CPU 配合操作系统({的})部分<{<了>}>(当然基础({的})都是需要({的}),我是说不再需要额外({的})),有点 纯软件设计 ({的})感觉<{<了>}>,之前({的})部分或多或少都有跟硬件打交道({的})部分。我们慢慢地,将与硬件打交道({的})部分「完善好」,最后便只剩下软件({的})天下<{<了>}>,也是我们软件工程师越来越熟悉({的})部分。

  这也慢慢地,与我们({的})已有({的})知识接轨,『什么』时候全串起来<{<了>}>,你就是高手<{<了>}>。技术领域({的})高手,不是看({的})高望得远, 而[是基础扎实,但要扎实到随便把自己已有({的})知识进行关联,就能得出〖一〗个很深刻({的})结论。

『三』、CPU 与操作系统打配合

我们不只〖一〗次提到<{<了>}> CPU 与操作系统打配合({的})地方,现在我们就〖一〗起来串〖一〗串,把之前这种配合写在〖一〗起对<比>〖一〗下。 

配合项 操作步骤1 操作步骤2 操作步骤3
开启保护模式  打开 A20 ‘加载’ gdt 将 cr0 ({的}) pe 『位置』 1
‘加载’ gdt 内存某『位置』初始化全局<描述符表> gdt lgdt 〖指令〗将 GDT 起始地‘址’存入 gdtr 寄存器 将 cr0 ({的}) pe 『位置』 1
〖开启分页〗 内存某『位置』初始化页表 pde、pte <将页>目录起始地‘址’存入 cr3 寄存器 将 cr0 ({的}) pg 『位置』 1
开启【中断】 内存某『位置』初始化【中断】<描述符表> idt,并初始化 pic lidt 〖指令〗将 idt 起始地‘址’存入 idtr 寄存器  
特权级      

请自己默默体会其中({的})相似之处。

步骤相似,必然也存在着结构相似,下面我把到目前 为[止用到({的})结构列出

实现原创指令集({的})虚拟{机}

  至于后面({的})内存管理池({的})结构,那是我们软件自己定义({的}), 而[上面列出({的})这些,是硬件定义({的}),也就是说作 为[程序员({的})我们,《必须接受》。

四、谈谈自己({的})理解与感悟

  这里我没有说谈谈自己对操作系统({的})理解,因 为[我觉得这里谈({的})可能超出<{<了>}>操作系统范畴。另外,我所谈({的})真({的})是 到目前 为[止 ({的})理解与感悟,并不是我已经把后面({的})知识学完<{<了>}>再来补({的}),可能都学完<{<了>}>再回忆自己在这个时候({的})感悟,已经不准确<{<了>}>。

  高级<语言>与低级<语言>没有高下之分。「我们普遍有个印象」,就是外行人认 为[高级<语言>更高级,低级<语言>更低级, 而[内行人则相反。但我现在到觉得,它们根本没有高下之分,只是不同角度罢<{<了>}>。<如果从功能上>说,低级<语言>能完成高级<语言>做不<{<了>}>({的})事情,也可以解释高级<语言>无法解释({的})原理,从这点看,低级<语言>显得更高级。但如果从实际做({的})事情『来』看呢?本操作系统中,低级<语言>(也就是汇编)只是做<{<了>}>〖一〗些进入内核之前({的})‘杂事’(当然〖一〗部分原因也是因 为[ c <语言>做不<{<了>}>),〖一〗旦进入内核,只要能用 c <语言>完成({的}),就绝对不用汇编<{<了>}>。从这个角度看,高级<语言>做({的})事情又<比>低级<语言>更高端〖一〗些。所以我({的})感悟就是,再也不去争论谁高谁低<{<了>}>, 而[只是说『什么』事情更适合『什么』<语言>来做 而[已。我觉得就单单是这个感悟,对我目前({的}) Java <语言>帮助就很大,我不再觉得 Java <比> C <语言>或是汇编<语言>更 low <{<了>}>。

  【细节是魔鬼】。这真({的})是我最大({的})感悟,没有之〖一〗。我起初学习操作系统({的})时候,总是想尽快,想着有些东西只要理解就可以<{<了>}>,没必要去扣太多({的})细节。其实这是错误({的}),正确({的})做法是,先把细节扣得死死({的}),之后回过头看({的})时候就再也不看细节<{<了>}>,开始注重总结与理解。 而[不是先就不扣细节,“想”着总结与理解。{‘《《第》》’}〖一〗点是因 为[,细节掌握得足够<{<了>}>,你会发现其他({的})好多知识点是通用({的}),根本不用看就可以理解<{<了>}>,「<比>如」 ‘加载’ gdt‘加载’ idt以及‘加载’分页,如果你不是在看‘加载’ gdt 这个部分时把细节吃透,后面两个知识点你每个都要重新理解〖一〗遍, 而[且理解得还不〖一〗定透彻,所花({的})总时间,{还不如}你去花大量时间把{‘《《第》》’}〖一〗个吃透, 而[后面两个非常快速地就可以理解到很深入({的})地步。

  越简单越透彻,越透彻越简单。这里({的})每〖一〗个知识点,我〖一〗开始都觉得<比>天都难, 而[在真正理解之后,(却变)得很简单,甚至有点无聊。你可能觉得这是废话,但有({的})时候,有些知识点我理解({的})糊里糊涂,理解得也很复杂,跟别人也说不明白,当时我觉得是知识点就很复杂,给【被】人讲肯定是讲不明白({的}),得人家自己去理解。但后来我发现,无论多复杂({的})事,“只要”你真正掌握并且抓到本质<{<了>}>,是真({的})很简单,甚至你可以给〖一〗个不搞技术({的})人讲明白(这个明白当然不是真正({的})懂哈)。就「<比>如」说内存管理这〖一〗<块>,我看({的})时候甚至〖一〗度要“放弃”,但后来经过对每〖一〗行代码,每〖一〗个结构都扣出来剖析之后,我竟然觉得这<块>简单得不要不要({的}),无非就是取〖一〗个虚拟地‘址’,取〖一〗个物理地‘址’,再把它们加到页表中对应起来。不过这<块>也同时说明<{<了>}> 【细节是魔鬼】。倘若你〖一〗开始就看到这句话,「<比>如」从某个〖一〗分钟搞懂操作系统({的})软文,你({的})理解就是“取〖一〗个虚拟地‘址’,取〖一〗个物理地‘址’,再把它们加到页表中对应起来”,和我扣完细节之后({的})理解〖一〗样,但你觉得这是真正({的})〖一〗样么?所以,不是因 为[它简单所以你理解({的})透彻, 而[是因 为[你理解({的})透彻,它就变得简单起来<{<了>}>。

   所以,细节真({的})是魔鬼,千万不要企图〖一〗篇文章就搞懂操作系统这种事,我也可以把这篇文章改编成〖一〗个类似({的})文章,但如果你不去花时间扣细节,你今后〖一〗定会把更多({的})时间耽误在这里({的}),这个账总会有〖一〗天找到你({的})头上。

写在最后:开源项目和课程规划

如果你对自制〖一〗个操作〖系统感兴趣〗,不妨跟随这个系列课程 看下去[,甚至加入我们,〖一〗起来开发。

参考书籍

《操作系统真相还原》这本书真({的})赞!强烈推荐

项目开源

项目开源地‘址’:https://gitee.com/sunym1993/flashos

<当你看到该文>章时,代码可能已经<比>文章中({的})又多写<{<了>}>〖一〗些部分<{<了>}>。你可以通过提交记录历史来查看历史({的})代码,我会慢慢梳理提交历史「以及项目说明文档」,争取给每〖一〗课都准备〖一〗个可执行({的})代码。当然文章中({的})代码也是全({的}),采用复制粘贴({的})方式也是完全可以({的})。

如果你有兴趣加入这个{自制操作系}统({的})大军,也可以在留言区留下您({的})联系方式,或者在 gitee 私信我您({的})联系方式。

课程规划

本课程打算出系列课程,我写到哪觉得可以写成〖一〗篇文章<{<了>}>就写出来分享给大家,最终会完成〖一〗个功能全面({的})操作系统,我觉得这是最好({的})学习操作系统({的})方式<{<了>}>。所以中间遇到({的})各种坎也会写进去,如果你能持续跟进,跟着我〖一〗<块>写,必然会有很好({的})收货。{即使没有},交个朋友也是好({的})哈哈。

目前({的})系列包括

  • 【{自制操作系}统01】「硬」核讲解计算{机}({的})启动过程
  • 【{自制操作系}统02】环境准备与启动区实现
  • 【{自制操作系}统03】{读取硬盘中}({的})数据
  • 【{自制操作系}统04】从实模式到保护模式
  • 【{自制操作系}统05】『开』启内存分页{机}制
  • 【{自制操作系}统06】终于开始用 C <语言><{<了>}>,{‘《《第》》’}〖一〗行内核代码!
  • 【{自制操作系}统07】深入浅出特权级
  • 【{自制操作系}统08】【中断】
  • 【{自制操作系}统09】【中断】({的})代码实现
  • 【{自制操作系}统10】内存管理系统

 微信公众号

  我要去阿里(woyaoquali)

,

sunbet

Sunbet www.Lfstncnynmzyhzs.com信誉来源于每〖一〗位客户({的})口碑,Sunbet({的})服务在sunbet行业是出名({的})顶尖, 广西禄[福生态农业开发有限责任公司欢迎新老<会员>、代理({的})加入。

欧博开户声明:该文看法仅代表作者自己,与本平台无关。转载请注明:《临汾》信息网:【<自制>操作系统11】(中场休息之细节)是魔鬼

网友评论

  • (*)

最新评论

  • 新皇冠会员登录线路 2020-04-24 01:20:31 回复

    诚信企业在线企业邮局诚信企业在线企业邮局(现:阳光在线官网)现已开放诚信在线手机版、诚信在线电脑客户端下载。诚信在线娱乐游戏公平、公开、公正,用实力赢取信誉。夜里独自看,巴适

    1

文章归档

站点信息

  • 文章总数:441
  • 页面总数:0
  • 分类总数:8
  • 标签总数:929
  • 评论总数:127
  • 浏览总数:4557