黑色大蚊子 發表於 2023-12-22 00:00:00

需要多久才能看完Linux内核源码?

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>
                一、内核行数
        </li><li>
                二、内核目录文件大小
        </li><li>
                三、内核子系统
        <ul class="second_class_ul"><li>
                什么是内核:
        </li><li>
                1 系统调用接口
        </li><li>
                2 进程管理
        </li><li>
                3 内存管理
        </li><li>
                4 虚拟文件系统
        </li><li>
                5 网络堆栈
        </li><li>
                6 设备驱动程序
        </li></ul></li><li>
                四、如何学习内核?
        <ul class="second_class_ul"><li>
                1. 学习主线
        </li><li>
                2. 代码阅读工具
        </li><li>
                3. 学习的内核版本
        </li><li>
                4. 学习Linux最重要的是培养自己写代码的能力和对Linux框架结构的了解
        </li></ul></li></ul></div><p>
                <img title="需要多久才能看完Linux内核源码?" alt="需要多久才能看完Linux内核源码?" border="0" src="https://zhuji.jb51.net/uploads/img/202305/a8024b3da38a8a94dc7edadd12109946.jpg"></p>        <p class="maodian"></p><h2>
                一、内核行数
        </h2>
        <p>
                Linux内核分为CPU调度、内存管理、网络和存储四大子系统,针对硬件的驱动成百上千。代码的数量更是大的惊人。
        </p>
        <p>
                先说说最早的内核linux 0.11,下面这本书可以说很多驱动工程师都学习过,我花了大概1个半月,勉强看了一遍。
        </p>
        <p>
                <img title="需要多久才能看完Linux内核源码?" alt="需要多久才能看完Linux内核源码?" border="0" src="https://zhuji.jb51.net/uploads/img/202305/fc8c0acf04fb8d26d10ca828eabd66ec.jpg"></p>
        <p>
                再来看看内核代码量的统计。
        </p>
        <p>
                <img title="需要多久才能看完Linux内核源码?" alt="需要多久才能看完Linux内核源码?" border="0" src="https://zhuji.jb51.net/uploads/img/202305/03c5d3e2da75c7a8d1dc9e26cab3b5a3.jpg"></p>
        <p>
                <img title="需要多久才能看完Linux内核源码?" alt="需要多久才能看完Linux内核源码?" border="0" src="https://zhuji.jb51.net/uploads/img/202305/89af2e8347e0dafba794b39151f0259b.jpg"></p>
        <p>
                2020年1月1日,Linux内核Git源码树中的代码达到了2780万行。
        </p>
        <p>
                phoronix网站统计了Linux内核在进入2020年时的一些源码数据并作了总结。
        </p>
        <p>
                从统计数据来看,Linux内核源码树共有:
        </p>
        <p>
                27852148行(包括文档、Kconfig文件、树中的用户空间实用程序等)、
        </p>
        <p>
                887925次commit
        </p>
        <p>
                21074位不同的作者
        </p>
        <p>
                2780万行代码分布在66492个文件中。
        </p>
        <p>
                Linux内核从最初的10000行代码到现在的2780万行代码就是全球精英共同贡献的结果。
        </p>
        <p>
                按照一天一万行的速度,也需要2700天,也需要7年多。
        </p>
        <p>
                这还是建立在所有单次都认识,
        </p>
        <p>
                所有代码逻辑看了的都懂,
        </p>
        <p>
                而且都不忘记的基础上。
        </p>
        <p>
                实际上即使我们真的看完了,
        </p>
        <p>
                几年后内核又会有非常大的变化,
        </p>
        <p>
                可以说一辈子都看不完Linux内核的代码。
        </p>
        <p>
                <img title="需要多久才能看完Linux内核源码?" alt="需要多久才能看完Linux内核源码?" border="0" src="https://zhuji.jb51.net/uploads/img/202305/04a256611b1d7d83ab29876acd8462ae.jpg"></p>
        <p>
                Linux内核Git源码树中的代码达到了2780万行,核心代码只有2%是由李纳斯•托瓦兹自己编写的,其他均是其他个人和组织贡献的,李纳斯•托瓦兹公开了Linux但保留了选择新代码和需要合并的新方法的最终裁定权。
        </p>
        <p>
                除了Linus Torvalds,对内核贡献最多的是David S.Miller、 Mark Brown、Takashi Iwai、Arnd Bergmann、Al Viro和Mauro Carvalho Chehab。
        </p>
        <p>
                而参与贡献的公司,从域名统计来看,谷歌、Intel与Red Hat排在了最前列。
        </p>
        <p class="maodian"></p><h2>
                二、内核目录文件大小
        </h2>
        <p>
                然而,现在的内核已经膨胀的不成样子了,以还不算最新的linux-4.1.15为例:
        </p>
        <p>
                整个内核源码一共约 793M:
        </p>
        <p>
                <img title="需要多久才能看完Linux内核源码?" alt="需要多久才能看完Linux内核源码?" border="0" src="https://zhuji.jb51.net/uploads/img/202305/d1ac67a926b9fcf5f5755cbabf376a24.jpg"></p>
        <p>
                驱动代码占了大概一半,大约380M:
        </p>
        <p>
                <img title="需要多久才能看完Linux内核源码?" alt="需要多久才能看完Linux内核源码?" border="0" src="https://zhuji.jb51.net/uploads/img/202305/a30e03ff44699aa806600699b34ca522.jpg"></p>
        <p>
                体系相关的代码大约134M:
        </p>
        <p>
                <img title="需要多久才能看完Linux内核源码?" alt="需要多久才能看完Linux内核源码?" border="0" src="https://zhuji.jb51.net/uploads/img/202305/eba27f604299bd129d3650b053122706.jpg"></p>
        <p>
                网路子系统相关的代码26M:
        </p>
        <p>
                <img title="需要多久才能看完Linux内核源码?" alt="需要多久才能看完Linux内核源码?" border="0" src="https://zhuji.jb51.net/uploads/img/202305/397eae9757be8b8d32d727bf673d5ac6.jpg"></p>
        <p>
                文件系统相关的代码37M:
        </p>
        <p>
                <img title="需要多久才能看完Linux内核源码?" alt="需要多久才能看完Linux内核源码?" border="0" src="https://zhuji.jb51.net/uploads/img/202305/eae20159016f41deaec15ab6731e8570.jpg"></p>
        <p>
                linux内核核心代码大约6.8M:
        </p>
        <p>
                <img title="需要多久才能看完Linux内核源码?" alt="需要多久才能看完Linux内核源码?" border="0" src="https://zhuji.jb51.net/uploads/img/202305/864ffc5a0634b39434776dc8bf5c9630.jpg"></p>
        <p>
                这些目录任意一个目录想完全看明白都非常不容易。
        </p>
        <p class="maodian"></p><h2>
                三、内核子系统
        </h2>
        <p class="maodian"></p><h3>
                什么是内核:
        </h3>
        <p>
                在计算机科学中是一个用来管理软件发出的数据I/O(输入与输出)要求的计算机程序,将这些要求转译为数据处理的指令并交由中央处理器(CPU)及计算机中其他电子组件进行处理,是现代操作系统中最基本的部分。
        </p>
        <p>
                <img title="需要多久才能看完Linux内核源码?" alt="需要多久才能看完Linux内核源码?" border="0" src="https://zhuji.jb51.net/uploads/img/202305/99308f91e74490053c2a68f71720cf40.jpg"></p>
        <p>
                它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并由内核决定一个程序在什么时候对某部分硬件操作多长时间。
        </p>
        <p>
                linux内核代码涉及知识点包括汇编指令、c语言、硬件组成原理、操作系统、数据结构和算法、各种外设总线、驱动、网络协议栈。
        </p>
        <p>
                直接对硬件操作是非常复杂的。所以内核通常提供一种硬件抽象的方法,来完成这些操作。
        </p>
        <p>
                通过进程间通信机制及系统调用,应用进程可间接控制所需的硬件资源(特别是处理器及IO设备)。
        </p>
        <p>
                <img title="需要多久才能看完Linux内核源码?" alt="需要多久才能看完Linux内核源码?" border="0" src="https://zhuji.jb51.net/uploads/img/202305/52c508247b97391a9c65769a12c4ff9c.jpg"></p>
        <p>
                最上面是用户(或应用程序)空间。这是用户应用程序执行的地方。用户空间之下是内核空间,Linux 内核正是位于这里。
        </p>
        <p>
                GNU C Library (glibc)也在这里。它提供了连接内核的系统调用接口,还提供了在用户空间应用程序和内核之间进行转换的机制。
        </p>
        <p>
                内核和用户空间的应用程序使用的是不同的保护地址空间。
        </p>
        <p>
                每个用户空间的进程都使用自己的虚拟地址空间,而内核则占用单独的地址空间。
        </p>
        <p>
                Linux 内核可以进一步划分成 3 层。最上面是系统调用接口,它实现了一些基本的功能,例如 read 和 write。
        </p>
        <p>
                系统调用接口之下是内核代码,可以更精确地定义为独立于体系结构的内核代码。这些代码是 Linux 所支持的所有处理器体系结构所通用的。
        </p>
        <p>
                在这些代码之下是依赖于体系结构的代码,构成了通常称为 BSP(Board Support Package)的部分。这些代码用作给定体系结构的处理器和特定于平台的代码。
        </p>
        <p>
                <img title="需要多久才能看完Linux内核源码?" alt="需要多久才能看完Linux内核源码?" border="0" src="https://zhuji.jb51.net/uploads/img/202305/1e053a6785ed079728b7fcfd583bdc6e.jpg"></p>
        <p>
                内核主要系统包括:SCI:系统调用接口 PM:进程管理 VFS:虚拟文件系统 MM:内存管理 Network Stack:内核协议栈 Arch:体系架构 DD:设备驱动
        </p>
        <p class="maodian"></p><h3>
                1 系统调用接口
        </h3>
        <p>
                SCI 层提供了某些机制执行从用户空间到内核的函数调用。这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。
        </p>
        <p>
                SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。
        </p>
        <p>
                在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。
        </p>
        <p class="maodian"></p><h3>
                2 进程管理
        </h3>
        <p>
                进程管理的重点是进程的执行。
        </p>
        <p>
                在内核中,这些进程称为线程,代表了单独的处理器虚拟化(线程代码、数据、堆栈和 CPU 寄存器)。
        </p>
        <p>
                在用户空间,通常使用进程 这个术语,不过 Linux 实现并没有区分这两个概念(进程和线程)。
        </p>
        <p>
                内核通过 SCI 提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec 或 Portable Operating System Interface 函数),停止进程(kill、exit),并在它们之间进行通信和同步(signal 或者 POSIX 机制)。
        </p>
        <p class="maodian"></p><h3>
                3 内存管理
        </h3>
        <p>
                内核所管理的另外一个重要资源是内存。为了提高效率,如果由硬件管理虚拟内存,内存是按照所谓的内存页方式进行管理的(对于大部分体系结构来说都是 4KB)。
        </p>
        <p>
                Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。
        </p>
        <p class="maodian"></p><h3>
                4 虚拟文件系统
        </h3>
        <p>
                虚拟文件系统(VFS)是 Linux 内核中非常有用的一个方面,因为它为文件系统提供了一个通用的接口抽象。VFS 在 SCI 和内核所支持的文件系统之间提供了一个交换层。
        </p>
        <p>
                <img title="需要多久才能看完Linux内核源码?" alt="需要多久才能看完Linux内核源码?" border="0" src="https://zhuji.jb51.net/uploads/img/202305/5ee2700f1c130d2b8dc8937b3ff24e3a.jpg"></p>
        <p>
                在 VFS 上面,是对诸如 open、close、read 和 write 之类的函数的一个通用 API 抽象。在 VFS 下面是文件系统抽象,它定义了上层函数的实现方式。
        </p>
        <p>
                它们是给定文件系统(超过 50 个)的插件。文件系统的源代码可以在 ./linux/fs 中找到。
        </p>
        <p>
                文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。
        </p>
        <p>
                这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便在需要是就可用)优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,它实现了特定物理设备的接口。
        </p>
        <p class="maodian"></p><h3>
                5 网络堆栈
        </h3>
        <p>
                网络堆栈在设计上遵循模拟协议本身的分层体系结构。
        </p>
        <p>
                回想一下,Internet Protocol (IP) 是传输协议(通常称为传输控制协议或 TCP)下面的核心网络层协议。TCP 上面是 socket 层,它是通过 SCI 进行调用的。
        </p>
        <p>
                socket 层是网络子系统的标准 API,它为各种网络协议提供了一个用户接口。
        </p>
        <p>
                从原始帧访问到 IP 协议数据单元(PDU),再到 TCP 和 User Datagram Protocol (UDP),socket 层提供了一种标准化的方法来管理连接,并在各个终点之间移动数据。内核中网络源代码可以在 ./linux/net 中找到。
        </p>
        <p class="maodian"></p><h3>
                6 设备驱动程序
        </h3>
        <p>
                Linux 内核中有大量代码都在设备驱动程序中,它们能够运转特定的硬件设备。
        </p>
        <p>
                Linux 源码树提供了一个驱动程序子目录,这个目录又进一步划分为各种支持设备,例如 Bluetooth、I2C、serial 等。设备驱动程序的代码可以在 ./linux/drivers 中找到。
        </p>
        <p>
                下面这个图形象的讲解了Linux内核都有哪些东西!
        </p>
        <p>
                <img title="需要多久才能看完Linux内核源码?" alt="需要多久才能看完Linux内核源码?" border="0" src="https://zhuji.jb51.net/uploads/img/202305/b40d3bb1d29b5ec25babbff1e0c26d33.jpg"></p>
        <p class="maodian"></p><h2>
                四、如何学习内核?
        </h2>
        <p class="maodian"></p><h3>
                1. 学习主线
        </h3>
        <p>
                linux内核源码大而全,一个人,即使再聪明、再有精力,也不可能完全看完、看懂所有的linux内核源码。
        </p>
        <p>
                一口君建议按照以下主线进行深入研究:
        </p>
        <ul>
<li>
                        linux驱动架构
                </li>
                <li>
                        linux网络子系统
                </li>
        </ul>
<p>
                linux内核启动过程
        </p>
        <ul>
<li>
                        linux内存管理机制
                </li>
                <li>
                        linux调度器
                </li>
                <li>
                        linux进程管理
                </li>
                <li>
                        linux虚拟机制(kvm)
                </li>
                <li>
                        linux内核实时化技术
                </li>
        </ul>
<p>
                沿着某一个主线,深入进去,在研究清楚这个主线的同时,向其他的主线扩展、渗透和学习。
        </p>
        <p>
                此处之所以将驱动列为学习内核的入口,是因为内核为很多外设驱动实现了架构, 比如I2C、SPI、UART、PCIE、字符设备、网络设备、块设备, 我们可以从最基本的字符设备学起, 学习如何编写一个简单的模块 学习如何如何为一些简单的设备比如LED、KEY、ADC等编写驱动 可以说驱动是我们学习内核最简单的入口,
        </p>
        <p>
                由点到线、由线到面、由面到体,层层深入、不断精进,是学习linux内核源码的一个有效的方法。
        </p>
        <p class="maodian"></p><h3>
                2. 代码阅读工具
        </h3>
        <p>
                对于代码阅读方法从两个角度来介绍,一个方面是需要选择一个比较有效阅读代码的工具。
        </p>
        <p>
                一口君强烈推荐:source insight这款阅读代码神器!
        </p>
        <p>
                <img title="需要多久才能看完Linux内核源码?" alt="需要多久才能看完Linux内核源码?" border="0" src="https://zhuji.jb51.net/uploads/img/202305/c995b3def44742b17217415ac8cabcd4.jpg"></p>
        <p>
                也可以使用vscode或者vim+ctags的组合。
        </p>
        <p>
                不过一口君十几年的从业经验,
        </p>
        <p>
                99%以上的开发人员都选择SI阅读内核代码。
        </p>
        <p>
                代码并不是写给人看的,而是交给机器运行的。
        </p>
        <p>
                所以我们去理解别人的代码时,并不能像看小说一样去通篇的阅读代码,而应该是像研究化石一样去调查它,解密它。
        </p>
        <p>
                有时我们往往也需要把对方的一段代码亲手的实现一遍,然后自己举一反三看自己会怎么去实现它,才能真正的理解。
        </p>
        <p class="maodian"></p><h3>
                3. 学习的内核版本
        </h3>
        <p>
                有些人推荐先阅读一些低版本的内核,比如0.01版的,总代码量才1万行左右。
        </p>
        <p>
                阅读这个代码大概一个月应该能比较清晰了。
        </p>
        <p>
                但是,改代码与现在的代码差异巨大,阅读后可以理解基本思想,但对理解现有代码的帮助不是特别明显。
        </p>
        <p>
                3.10版本之后的内核都支持设备树!
        </p>
        <p>
                所以一口君建议是尽量选择3.10版本之后的代码阅读学习。
        </p>
        <p>
                最好选择一款开发板学习!
        </p>
        <p>
                开发板的选择一定要选择资料比较全,
        </p>
        <p>
                售后比较好的品牌!
        </p>
        <p>
                否则学习中遇到的一个小问题都可能被卡个一两周。
        </p>
        <p>
                无形中增加了学习的成本,
        </p>
        <p>
                要知道时间就是金钱!
        </p>
        <p>
                对于初学者来说,
        </p>
        <p>
                强烈推荐正点原子的开发板!
        </p>
        <p class="maodian"></p><h3>
                4. 学习Linux最重要的是培养自己写代码的能力和对Linux框架结构的了解
        </h3>
        <p>
                Linux内核中绝大部分代码都是由这个地球上顶尖的技术大牛所编写,
        </p>
        <p>
                这些代码的高内聚低耦合,
        </p>
        <p>
                其精准度,简洁度、质量都相当的高,
        </p>
        <p>
                每每看到一段高质量的代码,
        </p>
        <p>
                一口君都会被那一行行枯燥的代码背后隐藏的设计思想所震撼,所折服!
        </p>
        <p>
                阅读内核的代码简直就是在欣赏艺术品!
        </p>
        <p>
                很多粉丝问我如何提高自己的C语言编程水平, 一口君不厌其烦的 重复着同样一句话:看Linux内核!
        </p>
        <p>
                代码中自由颜如玉!代码中自有黄金屋!
        </p>
        <p>
                我们一定要像泡妞一样来泡内核!
        </p>
        <p>
                时刻保持激情,任性和耐性!
        </p>
        <p>
                耐住寂寞,天天读它,泡她!
        </p>
        <p>
                从量变到质变!
        </p>
        <p>
                水滴石穿!
        </p>
        <p>
                愿各位都能够熟练掌握Linux
        </p>
        <p>
                本文转载自微信公众号「一口Linux」
        </p>
        <p>
                <img title="需要多久才能看完Linux内核源码?" alt="需要多久才能看完Linux内核源码?" border="0" src="https://zhuji.jb51.net/uploads/img/202305/5c849dadb96edbc7a69708586981587e.jpg"></p>
        <p>
                原文链接:https://mp.weixin.qq.com/s/K_Ix6C9d_03cb1Hfpz461g
        </p>
頁: [1]
查看完整版本: 需要多久才能看完Linux内核源码?