如果你想轻松看懂Linux内核源码

400 阅读8分钟

哈喽,我是子牙老师。今天这篇文章是来回答一下最近被问的比较多的问题:如何才能像我一样读懂Linux内核

最近写的三篇关于Linux内核CFS调度器的文章,深受大家欢迎,也获得了微信公众号系统的推荐,阅读量是平时的三倍。瓦特?你还没看过?快去看看《Linux内核如何调度进程》《Linux内核如何调度进程组》《如何精准计算进程CPU时间片》

其实我挺诧异的,这么硬的文章,而且相关的文章市面上有很多,我写的还能被推荐。后面我想明白了,是因为文章角度不同,我选择的角度更符合大家的喜好。市面上的文章,千篇一律的都是给你分析源码,大家抄来抄去,以讹传讹,而我是从抛出问题解决问题的角度,比如Linux内核为什么调度那个进程、那个进程被调度到能获得多少CPU时间片、CFS为什么不公平……看到的人多,问的人就多,那我就来认真回答一下大家这个问题

港真!如果你想轻松愉快读懂Linux内核,需要很多很多功底:

  1. 将汇编、C语言融会贯通
  2. 手写过操作系统
  3. 掌握Linux环境编程与网络编程
  4. 掌握Linux容器化技术
  5. 单步调试Linux内核环境
  6. 有实战Linux内核的能力
  7. 丰富的大型项目阅读源码的经验
  8. 丰富的大型项目调试经验
  9. 熟练使用ChatGPT,知道如何提问
  10. 想到再补充

有人看到第一条,眼睛就开始慢慢睁大。看到第九条,默默放弃了……但是Linux内核,对于程序员,尤其是想通过走技术路线实现人生逆袭的程序员,真的非常非常重要。于科技世界,Linux内核何止半壁江山,占了起码八成江山!

如果你能随意把玩Linux内核,真的是一件非常愉快的事情。 Linux内核是一座宝库,深挖其中不仅能让你写出高质量的代码,还能知道如何分析并解决几乎一切技术问题,更能让你掌握计算机底层的核心技术,洞悉硬件与软件的完美结合。 处处大智慧!

下面我针对上面提到的九点,挨个给大家展开讲讲,顺便给大家推荐一些学习视频跟学习资料。当然,如果你想走捷径,可以学习我做的课程《手写操作系统》《实战Linux内核》。讲真,这玩意自己啃,真不是一般人能啃得出来的,多少还是需要点天赋

关注公众号【硬核子牙】,看计算机底层硬核文章,学计算机底层硬核课程

以下,enjoy~

汇编与C语言

这个就不用说了,Linux内核就是用这两门语言写的,属于基操了

如果你能看懂我讲的汇编与C语言,那你这两门语言就算过关了

关注公众号【硬核子牙】回复【C语言教程】,免费领取视频+笔记

手写操作系统

以我自身的经验来说,你写过一个操作系统去读Linux内核源码,与你没写过就去读,效果天壤之别!没写过就去读,只能大致理解代码,很多本质的东西理解不了

就拿CPU来说,如果你没有写过操作系统,你大概知道:L1L2L3三级缓存、缓存行、伪共享、MESI…应该就这些吧

但是如果你写操作系统,需要对CPU做很多事情:

  1. 激活CPU运行模式。如x64CPU,开机时默认是实模式,你写的操作系统,需要按节奏激活CPU的保护模式、IA32-e兼容模式、64位长模式。知道此,你才能理解Linux内核启动为什么分好几个阶段。实现此,你才能看懂Linux内核的启动代码,才能理解Linux内核代码为何非体系相关跟体系无关
  2. 如果是多核CPU,专业术语分BSP核、AP核,BSP核即启动核,一般是0号核,其他核都是AP核。刚开始运行,只有BSP核在跑,所有AP核都是休眠的,需要先通过BSP核完成基本的内核初始化工作,再写代码激活AP核。因为很多数据是共享的,所以激活AP核的代码与BSP核还有差异。知道此,你才能读懂ACPI、IO APIC、Local APIC、ICR、IPIs相关代码
  3. Linux内核是基于NUMA架构实现的,所以在调度机制中,Linux内核设计了调度域与之对应。对NUMA架构没有概念,你就读不懂新创建的进程或唤醒的进程选择CPU的逻辑,包括CPU负载均衡的逻辑
  4. 你应该听过写时复制、缺页异常、交换空间、虚拟内存、内存映射……这些都是基于CPU提供的内存分页技术实现的,还有随之诞生的页缓存技术TLB。其实很多人对这些技术的理解都非常模糊。如果你写过,你有了具象的认知,感觉会完全不一样
  5. 在x86时代,CPU还有段与门。今天已经过时了,但是如果你想读懂过去的代码,还得了解此
  6. 随着移动设备崛起诞生的异构技术,比如大小核。为了极致的功耗与性能,在Linux内核中也存在着很多相关代码
  7. 想到再补充

来看看激活CPU的代码,让认知具象化

其实核心硬件不止CPU,还有内存条、中断控制芯片、硬盘、网卡……这些硬件如何与软件结合,只有你写一个操作系统,才能得到具象认知。有了这层认知,再去读Linux内核源码,才有一种熟悉的感觉。而非没写过就去硬啃,那种无从下手的感觉

这些,我做的课程《手写操作系统》中全部有,捷径在此,看你选择。课程咨询班主任微信:jvm-anan。文末有二维码

Linux编程

Linux编程包含三部分:环境编程、网络编程、容器化技术

环境编程与网络编程,我给大家推荐一套视频教程。关注公众号【硬核子牙】回复【Linux编程】即可免费领取

容器化技术,这个市面上好像没人教。就是namespaces、cgroups、overlayFS、网络隔离、防火墙隔离、端口映射那一套技术。所以我之前做了一个课程《C语言手写docker》,专门教这个

关注公众号【硬核子牙】回复【手写docker】,免费领取视频+代码

为什么要会这些?你不会这些,你研究Linux内核时看到相关的代码,你都不认识,更别说理解它了。比如cgroups,你都不会用它来限制CPU使用率,你怎么可能理解它在内核中的代码呢?还有,你不会这些,你怎么做实验论证呢?

实战Linux内核

代码光看也不行,你得有能力做实验

那在Linux内核中怎么做实验呢?三种方式:一、直接改Linux内核源码;二、在Linux内核中创建自己的驱动,即内部驱动,在驱动中写代码实战;三、写外部驱动,在驱动中写测试代码,安装到Linux内核中做实验

这个除了我做的课程《实战Linux内核》,外面好像没人教

如果有需要的,可以加班主任微信咨询:jvm-anan(文末有二维码)。有试听课,了解清楚我的技术实力及讲课风格,再觉得要不要报名

课程中还会教你如何搭建单步调试Linux内核环境,如何更换Linux系统的内核版本,如何高效读Linux内核源码,如果有效调试Linux内核源码……带你真正玩透Linux内核,到我这个水平

了解课程

如果对我做的课程《手写操作系统》《实战Linux内核》不感兴趣的小伙伴,后面的内容就不用看了。我前面提到的要看懂Linux内核需要具备的九点,结合我推荐的资料,一点点把基础打好,自己去慢慢啃即可

看下我做这两套课程写的代码

比如硬盘驱动代码

比如文件系统代码

比如手写网络协议栈代码

课程笔记

为了保证课程质量,所有课程都是由我本人亲自打造,亲自授课。课程永久观看权限,永久1V1答疑服务

真心做教育,践行“子牙出品,必属精品”。我的所有课程,性价比超高,可全网比价!感兴趣的小伙伴别错过超大优惠上车哦~