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

news2025/7/14 3:22:15

代码中自由颜如玉!

代码中自有黄金屋!

那么Linux内核代码到底有多少行?

我们需要多久能读完呢?

一、内核行数

Linux内核分为CPU调度、内存管理、网络和存储四大子系统,针对硬件的驱动成百上千。代码的数量更是大的惊人。

先说说最早的内核linux 0.11,下面这本书可以说很多驱动工程师都学习过,我花了大概1个半月,勉强看了一遍。

再来看看内核代码量的统计。

【文章福利】小编在群文件上传了一些个人觉得比较好得学习书籍、视频资料,有需要的可以进群【977878001】领取!!!额外赠送一份价值699的内核资料包(含视频教程、电子书、实战项目及代码)

内核资料直通车:Linux内核源码技术学习路线+视频教程代码资料

学习直通车(腾讯课堂免费报名):Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈

2020年1月1日,Linux内核Git源码树中的代码达到了2780万行。

phoronix网站统计了Linux内核在进入2020年时的一些源码数据并作了总结。

从统计数据来看,Linux内核源码树共有:

27852148行(包括文档、Kconfig文件、树中的用户空间实用程序等)、

887925次commit

21074位不同的作者

2780万行代码分布在66492个文件中。

Linux内核从最初的10000行代码到现在的2780万行代码就是全球精英共同贡献的结果。

按照一天一万行的速度,也需要2700天,也需要7年多。

这还是建立在所有单次都认识,

所有代码逻辑看了的都懂,

而且都不忘记的基础上。

实际上即使我们真的看完了,

几年后内核又会有非常大的变化,

可以说一辈子都看不完Linux内核的代码。

Linux内核Git源码树中的代码达到了2780万行,核心代码只有2%是由李纳斯•托瓦兹自己编写的,其他均是其他个人和组织贡献的,李纳斯•托瓦兹公开了Linux但保留了选择新代码和需要合并的新方法的最终裁定权。

除了Linus Torvalds,对内核贡献最多的是David S.Miller、 Mark Brown、Takashi Iwai、Arnd Bergmann、Al Viro和Mauro Carvalho Chehab。

而参与贡献的公司,从域名统计来看,谷歌、Intel与Red Hat排在了最前列。

二、内核目录文件大小

然而,现在的内核已经膨胀的不成样子了,以还不算最新的linux-4.1.15为例:

这些目录任意一个目录想完全看明白都非常不容易。

三、内核子系统

什么是内核:

在计算机科学中是一个用来管理软件发出的数据I/O(输入与输出)要求的计算机程序,将这些要求转译为数据处理的指令并交由中央处理器(CPU)及计算机中其他电子组件进行处理,是现代操作系统中最基本的部分。

它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并由内核决定一个程序在什么时候对某部分硬件操作多长时间。

linux内核代码涉及知识点包括汇编指令、c语言、硬件组成原理、操作系统、数据结构和算法、各种外设总线、驱动、网络协议栈。

直接对硬件操作是非常复杂的。所以内核通常提供一种硬件抽象的方法,来完成这些操作。

通过进程间通信机制及系统调用,应用进程可间接控制所需的硬件资源(特别是处理器及IO设备)。

最上面是用户(或应用程序)空间。这是用户应用程序执行的地方。用户空间之下是内核空间,Linux 内核正是位于这里。

GNU C Library (glibc)也在这里。它提供了连接内核的系统调用接口,还提供了在用户空间应用程序和内核之间进行转换的机制。

内核和用户空间的应用程序使用的是不同的保护地址空间。

每个用户空间的进程都使用自己的虚拟地址空间,而内核则占用单独的地址空间。

Linux 内核可以进一步划分成 3 层。最上面是系统调用接口,它实现了一些基本的功能,例如 read 和 write。

系统调用接口之下是内核代码,可以更精确地定义为独立于体系结构的内核代码。这些代码是 Linux 所支持的所有处理器体系结构所通用的。

在这些代码之下是依赖于体系结构的代码,构成了通常称为 BSP(Board Support Package)的部分。这些代码用作给定体系结构的处理器和特定于平台的代码。

内核主要系统包括:SCI:系统调用接口 PM:进程管理 VFS:虚拟文件系统 MM:内存管理 Network Stack:内核协议栈 Arch:体系架构 DD:设备驱动

1 系统调用接口

SCI 层提供了某些机制执行从用户空间到内核的函数调用。这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。

SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。

在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。

2 进程管理

进程管理的重点是进程的执行。

在内核中,这些进程称为线程,代表了单独的处理器虚拟化(线程代码、数据、堆栈和 CPU 寄存器)。

在用户空间,通常使用进程 这个术语,不过 Linux 实现并没有区分这两个概念(进程和线程)。

内核通过 SCI 提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec 或 Portable Operating System Interface [POSIX] 函数),停止进程(kill、exit),并在它们之间进行通信和同步(signal 或者 POSIX 机制)。

3 内存管理

内核所管理的另外一个重要资源是内存。为了提高效率,如果由硬件管理虚拟内存,内存是按照所谓的内存页方式进行管理的(对于大部分体系结构来说都是 4KB)。

Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。

4 虚拟文件系统

虚拟文件系统(VFS)是 Linux 内核中非常有用的一个方面,因为它为文件系统提供了一个通用的接口抽象。VFS 在 SCI 和内核所支持的文件系统之间提供了一个交换层。

在 VFS 上面,是对诸如 open、close、read 和 write 之类的函数的一个通用 API 抽象。在 VFS 下面是文件系统抽象,它定义了上层函数的实现方式。

它们是给定文件系统(超过 50 个)的插件。文件系统的源代码可以在 ./linux/fs 中找到。

文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。

这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便在需要是就可用)优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,它实现了特定物理设备的接口。

5 网络堆栈

网络堆栈在设计上遵循模拟协议本身的分层体系结构。

回想一下,Internet Protocol (IP) 是传输协议(通常称为传输控制协议或 TCP)下面的核心网络层协议。TCP 上面是 socket 层,它是通过 SCI 进行调用的。

socket 层是网络子系统的标准 API,它为各种网络协议提供了一个用户接口。

从原始帧访问到 IP 协议数据单元(PDU),再到 TCP 和 User Datagram Protocol (UDP),socket 层提供了一种标准化的方法来管理连接,并在各个终点之间移动数据。内核中网络源代码可以在 ./linux/net 中找到。

6 设备驱动程序

Linux 内核中有大量代码都在设备驱动程序中,它们能够运转特定的硬件设备。

Linux 源码树提供了一个驱动程序子目录,这个目录又进一步划分为各种支持设备,例如 Bluetooth、I2C、serial 等。设备驱动程序的代码可以在 ./linux/drivers 中找到。

下面这个图形象的讲解了Linux内核都有哪些东西!

四、如何学习内核?

1. 学习主线

linux内核源码大而全,一个人,即使再聪明、再有精力,也不可能完全看完、看懂所有的linux内核源码。

一口君建议按照以下主线进行深入研究:

linux驱动架构
linux网络子系统

linux内核启动过程
linux内存管理机制
linux调度器
linux进程管理
linux虚拟机制(kvm)
linux内核实时化技术

沿着某一个主线,深入进去,在研究清楚这个主线的同时,向其他的主线扩展、渗透和学习。

此处之所以将驱动列为学习内核的入口,是因为内核为很多外设驱动实现了架构, 比如I2C、SPI、UART、PCIE、字符设备、网络设备、块设备, 我们可以从最基本的字符设备学起, 学习如何编写一个简单的模块 学习如何如何为一些简单的设备比如LED、KEY、ADC等编写驱动 可以说驱动是我们学习内核最简单的入口,

由点到线、由线到面、由面到体,层层深入、不断精进,是学习linux内核源码的一个有效的方法。

2. 代码阅读工具

对于代码阅读方法从两个角度来介绍,一个方面是需要选择一个比较有效阅读代码的工具。

一口君强烈推荐:source insight这款阅读代码神器!

也可以使用vscode或者vim+ctags的组合。

不过一口君十几年的从业经验,

99%以上的开发人员都选择SI阅读内核代码。

代码并不是写给人看的,而是交给机器运行的。

所以我们去理解别人的代码时,并不能像看小说一样去通篇的阅读代码,而应该是像研究化石一样去调查它,解密它。

有时我们往往也需要把对方的一段代码亲手的实现一遍,然后自己举一反三看自己会怎么去实现它,才能真正的理解。

3. 学习的内核版本

有些人推荐先阅读一些低版本的内核,比如0.01版的,总代码量才1万行左右。

阅读这个代码大概一个月应该能比较清晰了。

但是,改代码与现在的代码差异巨大,阅读后可以理解基本思想,但对理解现有代码的帮助不是特别明显。

3.10版本之后的内核都支持设备树!

所以一口君建议是尽量选择3.10版本之后的代码阅读学习。

最好选择一款开发板学习!

开发板的选择一定要选择资料比较全,

售后比较好的品牌!

否则学习中遇到的一个小问题都可能被卡个一两周。

无形中增加了学习的成本,

要知道时间就是金钱!

对于初学者来说,

强烈推荐正点原子的开发板!

4. 学习Linux最重要的是培养自己写代码的能力和对Linux框架结构的了解

Linux内核中绝大部分代码都是由这个地球上顶尖的技术大牛所编写,

这些代码的高内聚低耦合,

其精准度,简洁度、质量都相当的高,

每每看到一段高质量的代码,

一口君都会被那一行行枯燥的代码背后隐藏的设计思想所震撼,所折服!

阅读内核的代码简直就是在欣赏艺术品!

很多粉丝问我如何提高自己的C语言编程水平, 一口君不厌其烦的 重复着同样一句话:看Linux内核!

代码中自由颜如玉!代码中自有黄金屋!

我们一定要像泡妞一样来泡内核!

时刻保持激情,任性和耐性!

耐住寂寞,天天读它,泡她!

从量变到质变!

水滴石穿!

愿各位都能够熟练掌握Linux,

实现从程序员涅槃成为真正的软件大师!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/8595.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kafka详解及集群环境搭建

一、kafka详解 安装包下载地址:https://download.csdn.net/download/weixin_45894220/87020758 1.1Kafka是什么? 1、Kafka是一个开源消息系统,由Scala写成。是由Apache软件基金会开发的一个开源消息系统项目,该项目的目标是为处…

Servlet

1.Servlet是什么 Servlet是java语言编写的运行在服务器端的程序Servlet是javaEE规范之一,规范就是接口Servlet是JavaWeb三大组件之一,三大组件分别是:Servlet,Filter,Listener2.Servlet干什么 Servlet接受客户端发来…

G - Damaged Bicycle 状压+最短路,D-七圣召唤_概率dp

G - Damaged Bicycle 状压最短路 最短路处理出1号节点和带车子的点到n的距离dist[x][n],G可以从节点1直接走到n,也可以从节点1走到带车子的节点再骑到n,如果车子坏了可以走到n,也可以走到下一个车子节点再进行之前的步骤,所以可以…

React源码解读之React Fiber

开始之前,先讲一下该文章能帮你解决哪些问题? facebook为什么要使用重构ReactReact Fiber是什么React Fiber的核心算法 - react是如何中断重启任务的react fiber部分源码简化版 前言 该文章涉及的源码部分基于React v17.0.2 why React Fiber 浏览器…

Go 语言搭建个人博客(qiucode.cn 重构篇 二)

1、MVC模式 MVC模式是一种 WEB 长期累积的总结,但这并不是唯一模式。 对于 MVC 模式,想必有过搭建 WEB 项目的开发者并无陌生。 服务器端负责将客户端发送过来的 HTTP 请求,进行处理(处理器),解析路由(Route),而后把 URL 映射到对应的控制器(Controller)。 MVC …

智慧公路解决方案-最新全套文件

智慧公路解决方案-最新全套文件一、建设背景二、思路架构三、建设方案1、智慧路产管理2、智慧基础设施3、智慧信息服务4、智慧交通管控5、智慧系统平台6、智慧辅助决策四、获取 - 智慧公路全套最新解决方案合集一、建设背景 交通出行主要面临的痛点是安全和拥堵,而…

算法与数据结构 - 散列表

文章目录引言一、散列表概述1.1 哈希函数1.2 散列表二、算法实战2.1 两数之和题目题解1. 暴力破解2. hash表结语点赞再看,养成习惯引言 某日,韩梅梅和李雷来到一家新开的网红图书馆借阅书籍。 韩梅梅: 李雷,快来帮我找下《数据结构从入门到放弃》 李雷看…

测试项目(MSTest)中涉及到读取App.config 操作(.net6)

文章目录环境问题排查过程查看Nuget包是否正确查看配置文件是否正确解决办法(手动)解决办法(自动)为什么是这样的呢?环境 VS2022MSTest项目.Net6版本 问题 在测试过程中发现读取App.config中的连接字符串是null&…

颜色杂项笔记

面向用户的HSV颜色模型的三个属性 面向用户的颜色模型HSV,有如下几个属性 Hue(色度、色调、色相):描述具体颜色,比如红、蓝、黄、绿等,可以理解为color的专业说法。 Saturation(饱和度&#xff…

红帽8使用nfs共享本地镜像

实验环境 FFF-server 192.168.80.100 SSS-client 192.168.80.254 实验前提关闭selinux和防火墙 第一步在开始之前我们可以先看一下nfs-server本地上的一个镜像挂载情况。如图1. 可以看到本地镜像已经被挂载上去。 第二步我们继续看一下server的yum仓库是否已经成功配置。如…

公布一小时下载量达10W:京东T5级架构师出品高并发核心编程手册

高并发有多重要? 高并发面试已经成了各大厂面试必问的题目,尤其是阿里、京东这样的大厂,面试的时候会往深了去问,可以说是你能回答出多少,你拿到大厂offer的概率就有多大! 因高并发的问题回答不上来的案例…

采购软件能否降低企业采购成本?如何实现的?

在如今的疫情影响下,降低成本一直是企业决策者的主要目标之一,在采购领域尤其如此。而很多企业在销售业绩下滑时,纷纷通过采购软件来降低采购成本从而提升利润,达到了不可思议的效果。那么采购软件能否降低企业采购成本&#xff1…

ELK日志实时分析

项目实训报告:ELK日志实时分析 任务目标 使用filebeat采集日志数据,通过kafka将数据传输给logstash进行过滤,最后输出到Elasticsearch绘制数据图表。 数据说明 实施步骤 将数据上传到家目录(/home/hadoop)&#…

CentOS7.5虚拟机扩展xfs文件系统

1.目标 虚拟机xfs文件系统挂载点根目录(也就是/dev/sda3)扩展空间 2.软件版本 Vmware WorkStation 16pro CentOS7.5 3.外部硬盘增加空间 硬盘空间只能增大,不能缩小,最大磁盘大小必须大于现在的size,否则扩展按钮置灰…

JSON 学习(FastJson和Jackson)

JSON 学习 文章目录JSON 学习1. Json数据格式1.1 Json 数据格式1.2 Json 对象格式1.3 数组对象相互嵌套格式1.3.1 数组中的元素是对象1.3.2 对象中的值是数组1.3.3 你中有我,我中有你2. 使用场景3. java里面操作json有哪些技术4. Fastjson4.1 FastJson的优点4.2 Fas…

Spring Security认证之基本认证

本文内容来自王松老师的《深入浅出Spring Security》,自己在学习的时候为了加深理解顺手抄录的,有时候还会写一些自己的想法。 快速入门 在Spring Boot项目中使用Spring Security非常方便,创建一个新的Spring Boot项目我们只要引入Web和Spri…

java项目:前后端分离SpringBoot+Vue+Element的校内跑腿平台

收藏点赞不迷路 关注作者有好处 项目编号:BS-XX-155 一,项目简介 近年来,随着国内都市化的发展,生产生活节奏变快、各种往来频繁。经济的高速发展催生出“懒人经济”。不想走出家门,饭菜可以送上门;不方便交水、电、…

Java中restTemplate的使用

原文链接 代码地址 本文介绍restTemplate基础用法。 Java中get和post的用法请参考:https://mp.weixin.qq.com/s/mC0D1nuCqIori5bWtLorWQ 1 提供get/post接口 1.1 Controller RestController RequestMapping("/homepage") public class MyController…

电脑如何清理重复文件,查找电脑重复文件的软件

在电脑上面,不论是我们可以保存的,还是自动缓存的,都会有大量的重复文件,可能我们自己并没有发现,占据着电脑大量的空间,长此以往下去,会让电脑变得卡顿,我们就需要来清理一下这些不…

低代码维格云甘特视图入门教程

功能简介 低代码维格云甘特图主要通过条状图来显示某些时间相关的活动(任务、阶段、项目等)随着时间进展的情况,以便管理者直观地查看活动进度,把控全局。又称为时间视图、横道图、条状图(Bar chart)。 低代码维格云甘特图适用场景 项目管理生产管理其他领域:建筑、IT软件…