大家好,我是记录讲说,今天我们来看一下林诺斯内核开发一百讲里边的第一讲编译六四内核和文件系统,那具体的编译过程的话呢,大家可以参考我的这篇文章啊,那么我们的这个开发环境呢是优奔兔十四点零点四, 呃,六十,内核版本呢是四点九点二二九,呃, bb boss 版本呢是幺点三零点零, 然后呢 qemu 的版本呢是二点零点零,所以大家如果要跟着我一起十座呢,那么你的开发环境和版本号呢,就尽量跟我这边保持一致, 这样的话呢可以避免出现一些其他的问题啊。好,那那个那本节课的话呢,我们就带大家来进行这个前两步就是下 在内核原码,然后呢编译内核原码和第二步编译 b z boss。 在这个过程中呢,我也会给大家介绍一下这个刘斯内核原码的这个目录,以及各个目录的这个功能,还有 b z boss 它的一个实现原理是什么样的? 好,那我们要编译 linus 内盒原码呢?我们首先第一个要先从这个先去下载内盒原码,从哪里去下载 linus 内盒原码呢?从可能点 o r g 内盒官网去下载, 在这里边有一个这个链接,我们点进去,进来以后呢有一个 linux 到这里边,就是这里边就列出了所有版本的内核 元代码,比如说我们是四点差的,那么就进到这个目录里边。好,我搜一下四点九点二二九, 好,那这个就是内核的源代码,我们点击它就可以把它下载到本地。好,这一步完成以后的话呢,我们下到本地,然后把它解压,就得到了我们的这个内核的源代码。 那下来我们来看一下这个内核源代码的这个目录和各个目录的一个大概的一个功能吧。这里边主要的目录呢,就是这些哈 阿克里边是体系相关的一些代码啊,我们知道不同的这个 cpu, 它处于不同的体系啊,当然了,同一个体系呢,它下面也可以有不同的这个 board。 好,我们在这个 ac 目录下面呢,可以看到目前为止内核支持着这个这个 cpu 的这个体系架构,这里边每一个目录里边都是一个具体的这个 cpu 体系相关的代码,比如说 阿姆六四里边是阿姆六四这个 cpu 体系的相关的代码,叉八六呢,是叉八六相关的一些代码,还有这里边的这个阿姆,我们进到叉八六里边来看一下。好,那这里边就是叉八六体系相关的代码,因为不同的这个硬件 体系,那么他底下的某针对某一个内核功能的实现是不一样的啊,首先的差别就体现在不同的体系,他们的会编的代码跟语法是不一样的啊, 所以在叉八六的目录下面,我们可以看到一些体系相关代码啊,那这里边呢就包含了这个启动相关的哈,内存相关的, 网络相关的啊,内核相关的,还有 k、 v、 m 相关的等。所以只要是体系之间有差异的那部分功能的话呢,都是在这个目录下面。 好,那这个是 arc, arc, 所以如果你是做内核移植的,那么你可能改动最多的就是这个 arc 目录下面的代码,你可能会去增加一个体系, 或者说如果内盒里边已经支持了这个体系,那么可能你只是添加一个 board 就 ok 了啊,那总之的话呢,你需要修改这里边的代码 好,然后呢是 document, document 里边是内核里边的这个技术文档啊,所以内核所有内核里边关于内核的参数、配置,特性等说明都在这里边,这里边的文档非常的详细。好,所以是我们开发中参考的第一手的资料。 然后下来是 init, 这个 init 里边呢,它是内核启动相关的代码,我们来看一下梦点 go, 哎,梦点 c, 在梦点 c 里边它有一个 start, ctrl, 好,那 start, ctrl 里边就是内核启动的时候那个 c 元入口的那个函数哈,所以 内核在启动的时候呢,它会先执行一部分绘本代码,然后呢由这个绘本代码呢,通过一个跳转指令跳转到 startconnor。 好,那么从 startconnor 开始的话呢,执行的就是 c 代码,在 startconnor 之前的话呢,都是绘本代码。 好,所以在这里边就会做一些内核的启动相关的一些初始化的一个代码。好, 好工具,这些是一些工具哈,然后 block, block 里边是块设备架构,块设备相关的一些代码,然后下来是一个 driver, 那 driver 里边呢?这个 driver 里边的代码占据了整个内核代码的这个百分之七八十吧,因为现实的这个 社会中,这个外设实在是太多了啊,所以各大社区的开发者都在不断的去充实和往上这个,呃, 内核对外设的支持,所以转弯里边的这个代码量的话呢,就变得比较多啊,那在转弯里边呢,我们看到有很多目录,每类目录都代表一类型的驱动,比如说 iphone, c 啊, a c, p i, 还有 s c, s i, 还有 five, 还有 m, m c 等等,那这些的话,你都是不同类型的驱动, 所以如果你要做驱动移植哈,那么你可以去修改到这个目录里边代码。当然如果你的这个硬件呢,没有找到匹配的驱动,那么你也可以在这里边去寻找一个特性跟你的硬件相似度比较高的这个驱动,然后呢 在上面去做修改跟完善。好,这个是 driver, 然后呢, a, b, c, a, b, c 呢?里边是这个进程相关代码,进程通讯相关的代码。好,这里边是安全相关的代码 好。 net, 里边是协议这样相关的代码。 sun 的里边是声音相关的代码。 f, s 呢是文件系统相关的代码。好,那这里边你可以看到这个 difference to, 这个是我们针对。 net 的一个文件系统。好, 还有这个 c 四 f s, 我们的这个虚拟文件系统,还有 n, t, f, s 等。所以如果你想研究某个文件系统相关的代码,可以在这里边找,比如说这里边还有一 yes t four 好, 好,那 ctrl 里边呢是内核核心相关的代码,那这里边主要就是一些进程管理的,然后呢,进程调度的等。内核核心,内核核心的一些代码, include 是内盒投文件好, m m 呢,是内盒里边的这个内存管理相关的代码。 好,那到现在为止呢,我们就把内核相关的目录呢大概讲了一下,其实关于内核圆满的目录以及它的功能呢,我们后续还有专门的课程来讲,所以的话呢,今天大家只是相应一个大概的了解就 ok 了。 好,下来我们来看怎么来编译内核啊?好,编译内核呢,可以参考这篇文章内核的编, 编译其实非常简单哈,第一步,第二步,第三步,第四步。好,通过四步就可以编译出一个内核好,第一步,想指定硬件的体系结构,第二步,指定我们的 board config, 第三步,配置内核。 第四步,编译内核好。为什么需要?为什么需要前面三步呢?我们要知道内核它支持各种体系结构,各种 board, 所以呢,我们要编译内核,首先,首先我们要告诉内核我们要编译的是哪个体系架构的内核好,之后的话呢,我们需要告诉他,我们是问哪一个部的 这个边翼内核儿,因为不同的 board 它的外设的配置是不一样的啊。第三个配置内核的话呢, 其实是因为内核里边它有很多功能跟特性,那么我们在实际变异的时候呢,我们不可能去选择这些内核所有的功能和特性,因为那样的话呢,第一个会让我们内核很臃肿。第二个的话呢,这让我们在内核启动的时候呢,会占用更多的一些 不必要的资源,所以呢,我们都要去针对性的去做一些配置,只配置那些跟我们的功能相关的一些特性就 ok 了啊, 所以前面三部其实都是配置,那最后一部 mac 才是编译哈,为什么我们可以这样去配置和编译内核,就是因为内核里边有 make file, 那关于 make for 呢,我们后续的课程里边也会讲,所以今天呢,我们只关注这个实操,我们先通过实操对内核边有一个感性的认识, 好,我们先直接第一步 export arc 等于叉八六好,然后呢直接第二步 make 叉八六六四 def config 好,那这样的话呢,我们其实就相当于说是给内核儿生成了一个大概的一个菜单哈, 那生成菜单的作用是什么呢?我们生成一个菜单,也就是 config 文件以后呢,那么内核的编译系统就可以根据这个 config 的配置呢去编译我们的内核了。这有点像是我们去做菜啊,我们做菜的时候呢,需 需要依赖菜单,那么客户他点了什么菜,我们就去做什么菜,那么编内盒也是一样的,那么我们配置了什么体系?我们配置了什么 board? 我们通过 make my new config 配置了哪些细分的特性和功能,那么编音系统就给我们编译出什么样的内盒 好,这是前两步。第三步呢,我们是执行这个 make manue config 去配置内核。 how? 执行 mac manue config 以后呢,就会出来一个菜单,那接着我们就可以通过一个简单的方式对内盒进行一个配置哈,那么怎么来配置呢?那这里边每一个这个选项呢,它里边都有一个那个选择,那么信号呢?表示选中, 然后呢这个空的表示不选中啊,那我们来看一下我们要做哪些调整啊?我们在编的时候呢,我们需要内核支持这个软 disc 驱动,所以呢我们选,我们要选中 内核,我们要让内核能够支持装 disc 的这个驱动,那这个驱动在哪里配置呢啊?第一个我们要需要配置 dreadnell set up 里边的这个这个东西啊,我们来看一下,这里边能找到这个 dreadnell set up, 对吧? 好,进来以后呢,我们来看一下,往下这里边每一项的话呢,我们都可以去配置啊, 好,然后呢找到了这个 insurance ram file system, 好,这里边你可以通过选中呢,你通过点击一个空格呢来决定要 它选中还是不选中好,下来配置一下这个 device driver, 我们选择 device driver, 然后呢选择这个 block device。 好,进来以后呢我们选,我们来找一下。 好,这里边有一个 ram block device sport。 好,这里边我们选中。好,你点一下空格就会选中,这里边 m 呢表示编程驱动好,那么我们今天呢,因为是第一课,所以呢我们再按一下空格 选成芯,选成芯呢就表示呢把这个驱动编到内核里边好,这里边可以把它填成六五五三六。好,然后下来 的话呢,就可以执行 mac 去编译了,好,执行 mac 好,执行 mac 去编译好,我之前呢已经编译过一次,所以的话呢,这次编译非常的快,那么它呢是位于阿克叉八六 boot b z 一面,这里边。好,这个就是我们的内核好,内核编译成功以后呢,我们再来编译文件系统,文件系统的编译呢,也是类似的思路,我们从 bb boss 的原代码呢去下载这个 bb boss 一点幺三点零, 然后呢先解压,然后呢配置,配置的方式呢也是执行 make my new config, 然后呢选中这个选项好,因为我们是因为我们的这个文件系统,它是一个最简单的文件系统,里边是不带 c 库的,所以的话呢,你在编译 bbox 的时候呢,就一定要把它编译成一个静态链接库的形式,那这样的话呢,它就会,它就不会依赖任何的动态链接库了。好,我们来编译一下 how make a menu configure, 然后呢 setting 里边 好把它编成一个静态的一个 binary。 好,那么下来的话呢,就是去编译 make, 然后呢还有这个 make install 好,当执行 make 的时候呢,会把 big boss 编译出来,当执行 make install 的时 呢,会把 b 会把 bbox 以及它相关的一些工具呢,把它安装到原码目录下面的 install 这个目录下面, 那我们进到 install 里边,这个就是编译出来的 billy boss 哈,那有人问了, billy boss 它不是一个 bindery 吗?为什么这里边会有这么多文件呢啊?其实这些文件你仔细看,他们都是 链接文件,他们通过软链接的方式呢,链接到了 baby boss 啊,这些链接文件他们没有任何区别,唯一的区别呢就是链接文件的名字 在 bb box 里边呢,它通过判断这个第一个参数来知道你要执行的是哪个命令,所以如果你执行的是一个 print, 那么 bbox 它就知道你要调用的是一个 printf 的命令,然后呢就会执行相关的函数, 如果你执行的是一个 reset, 那么同样它会知道你的第一个仓数是 reset, 然后呢调用 reset 相关的一些函数啊,所以这个就是 bbos 它的一个 啊,便利之处啊,他可以通过一个 banana 来实现很多种这个工具,而且的话呢,他的这些工具呢,非常的精简,所以很适合我们强势系统。 好,那到现在为止的话呢,我们本节课呢也接近尾声了哈,我们来回顾一下本节课呢,我们主要是编译了这个内核,从原码编译内核,然后呢从原码编译 bbox, 那下节课的话呢,我们 基于我们就基于这两个东西呢,来制作一个最小的跟文件系统啊,并且呢用 q e m u 呢启动编译好的内核跟文件系统。好,那我们本节课内容呢,就到这里,谢谢大家。
粉丝1.3万获赞1.7万

大家好,今天我们来开始讲快设备启动程序。 快设备启动程序提供了面向快设备的访问,这种设备以随机访问的方式传输数据,并且数据总是具有固定大小的。快快设备和支付设备的区别是什么呢?快设备可以通过 mont 文件系统,而支付设备是不可以的。 数据经过快设备。相比操作制服设备呢,需要多经历一个数据缓冲机制。如图所示。 这里我们给这个快设备的模型。那么如图呢,是类似中快设备模型的示意图。英语程序有两种方式仿一个快设备,一种呢是通过第一目录, 一种呢,是文件系统的挂载点。前者呢,和支付设备一样,通常用于配置,后者就是我们忙着之后通过文件系统直接放入一个快设备。 比如说 red 一个系统调用。最终呢,他会调用一个适当的 v f s 函数 red。 接着呢,就是 sys red。 然后呢,就到 vfs red, 将文件描述符 fd 呢或文件类的偏一辆奥弗赛车呢,传递给他。 vf s 会判断这个系统调用的处理方式。如果访问的内容已经被缓存在缓冲区中呢,就直接访问。否则呢,从磁盘中读取。 第三层呢,为了从物理磁盘中读取呢,内核就依赖影射层慢拼内而成。也就是上图中的磁盘。文件系统 确定该文件所在文件系统块的大小,并根据文件块的大小计算所请求数据的长度。这步从本质上来说呢,就是文件被 被拆成很多的块。因此呢,内核需要确定所请求的数据所在的块。 影射层呢,调用一个具体的文件系统的函数,这个层的函数呢,会访问文件的词盘节点,然后根据逻辑快号确定说 请求的数据在瓷盘上的位置。立合。利用通用快层启动 ro 操作来传达所请求的数据。 通常呢,一个阿屋操作是针对瓷盘上一组连续的快。第五步呢,阿屋调度程序根据预定意的内核策略,将带处理的阿屋进行重新排列和合并。 最后呢,快设备启动程序,向磁盘控制器硬件接口发送适当的指令,进行实际的数据操作。下面我们来说一下 l 调度。 l 调度器的总体目标呢,就是希望让磁头 总能往一个方向移动,移动到底了以后呢,再往反方向走。这恰恰就是我们现实生活中电梯模型。 所以阿屋调度器也被叫做电梯调度。而相应的算法呢,也被调做电梯调度算法。我们知道磁盘的读写是通过机械性的移动磁头来实现的。 移动上呢,磁盘设备满足快设备的随机读写要求,但是处于节约磁盘,提高效率的考虑呢。我们希望当磁炉处于母浴位置的时候, 一起讲最近需要写在附近的数据呢,都写入,而不是这写一下,那写一下,然后再回来。而 欧吊赌就是将上层发来的阿欧请求的顺序呢,进行诚心的排序,以及对多个请求呢进行合并。这样就可以实现上述的提高效率,节约磁盘的目的。 离合中提供了下面的几种电梯调度算法来实现 l 调度。第一种 调度算法呢,叫做先来先服务算法,他是实现了点单的飞佛是进行最简单的合并,比较适合基于 flins 的存储。 第二种调度算法,就预测调度算法,他推出而无请求,大约能推出几个毫卯,以期待能对他们进行排序或 获得更高的效率。第三种调度算法叫最后期限调度算法,试图把每次请求的延迟呢降到最低,同时呢,也会对 bro 重新排序, 特别适用于读取较多数据的场合,比如说数据库的场合。最后一种呢,叫公平调度算法,他为系统内所有的人物分配均匀的凹带宽,提供一个公平的工作环境。 这种呢,一般用在多媒体环境中,能够保证应视频以及从词盘中读取数据。是当前类和默认的调度算法。 那么如何指定或者改变角度算法呢?有两种方式,一种 呢,就是内核传餐的方式来指定使用的调度算法。一种呢,通过命令呢来改变内核的调度算法。那么下面 我们再说一下啊,快和善区这个概念。前面已经说了啊,快是文件系统读写的基本单位,那么一个快的大小台是二的 n 次方个善区。 比如说啊, ust 文件系统,它的块的缺损的大小是四看。那么块呢,是 vfs 或文件系统传输数据的基本单位。 那么山区呢?是磁盘读写的基本单位。我们说山区是硬盘上最小的操作单位,是文件系统和设备之间传送数据的单位。 一般一个山区的大小是五百一十二字节。但是也有特殊的情况,比如说 ssd 就是四零九六个字节。那么当一个山区 大小超过五幺二字节的时候呢,只需要将多个离合扇区对应一个设备扇区就可以了。 下面我们来给出快设备启动的几个主要的核心结构。那么第一个呢就是磁盘描述服务。第一 disco, 他是 对一个物理磁盘或者分区的描述。调数结构呢,就不 low 对吧? 他是描述磁盘的操作方法及与发啊不瑞生死呢,比较类似。第三个数据结构就铝胯索盔,是针对一个磁盘对象所有请求的一个队列, 是相应的瓷盘对象的一个玉。第四个数据结果 reapus, 表示经过凹角度之后,针对一个 直盘的一个请求是 recousturit 的一个节点,多个 recoust 就构成了一个 recousk。 第五个数据结构 blo, 他表示应 用程序对一个磁牌原始的访问请求一个 bro 由多个 browx 组成。多个 bro 经过嗷调度和合并之后呢,就会形成一个锐跨。 第七个数结构呢,标外,可他描述的是应用层整壁读写一个词牌时需要使用的类从业的一部分,也就是段这个名词。 多个 browic 和 beit 呢,就形成了一个 bro。 那么最后一个数据结构是 bwik fut, 用于记录当前 browikb 处理的情况,用于便利 bro。 前面我们对这些数据结构进行介绍以后呢,那么怎么样来描述他们之间的关系呢?这里给出了一张图来描述了这些 核心数据结构之间的关系,比较清晰的表达出了他们之间是怎么样一个排列组合。核心 数据结构和核心方法。更详细的内容在此不进行描述,你在网上看到一篇非常详尽的快设备启动成型相关知识的介绍,大家可以去看。 上面我们所讲的内容大部分来自本片,因此呢,建议大家仔细阅读并动手实践快设备编程基本就可以入门。 最后呢,我们对课外设备启动程序给一个小节。从这张图呢,我们可以看出,从文件系统呢一直打通到了启动程序。 那么最上层是 vfs 层。 vfs 是对各种具体文件系统的一种封装,是用户程序访问文件提供的统一的接口。 第二层呢,是缓冲层。就是当用户发起文件访问请求的时候,首先回的磁盘缓冲中 进行文件的查找,看是否被缓存了。如果在缓存中,则直接从缓存中读取。如果数据不再缓存中,则必须要到具体的文件系统中读取数。 第三层是影射层。影射层分为两部分,首先确定文件系统的快大小,然后计算所请求的数据 包含多少个块。第二步呢,调用具体文件系统的函数来访问文件的所以节点,确定所请求的数据在磁盘上的地址。第四步骤呢,就是通用快层。 那是为何把快设备看作是由若干山区组成的数据空间,上层的读写请求,在通用快层呢,就被构成一个或者多 多个的标结构。第五层呢,就是凹调度层。凹调度层呢,负责采用五种算法, 比如说刚才讲的电梯较度算法,将凹操作呢进行排序。最底层呢,就是快设备启动层, 由快设备启动,根据排序好的请求呢,对硬件进行数据的访问。最后我们给出参考文献, 依然是类似启动开发。同时呢,网上有大量详尽的快启动开发的资料,读者可以自行查阅。在这里我们给大家推荐一篇。 那么文真的大多数的图片呢?来自于谷歌的搜索,版权归原作者所有。最后,大家带着疑问上路,从虚拟文件系统到硬件,为什么要对快 设备进行分层管理?

比如这个物理对称使用使用率过高,一般我们来解决方案是怎么做呢?第一, 安装啊,安装多一个内存,多一条物理内存条,但是这种是最快的啊,最快的解决办法, 那么本来你是两级,我再加一级变成三级内存了,本来原来我是四级内存,加一条,四级变成八级,是不是?所以这直接解决这种方式,那么但是如果你安装之后 他内存还是什么呢?还使用过高,那么你看的应用程序是不是有问题?是不是这第一种方法,第二种方法是什么呢?安装一些内存整理软件,他可以什么?再运行一些大型程序,先运行内存整理这个软件, 对内存进行整理,为什么呢?主要是缓解我们这个内存使用率过高这个问题。第三是什么呢?第三的话就是说屋里内存使用率过高。那么还有一个方法,就说我们设置更大的一个虚拟内存, 新内存的设置必须是实际内存的一个什么一点五倍, 这个大家可以根据需要啊进行来操作。但是我们作为程序员还要有一个什么呢?良好的这个杀毒习惯对不对?并且对一些开启的一些项目做一些相应调整,要减少不必要的启动程序, 清理一些插件啊,或者一些服务啊。通过刚才我所讲的一个方法,我们可以很容易来解决物理内存使用率过高的问题,一般问了就这些问题知道。