代码大佬的【Linux内核开发笔记】分享,前人栽树后人乘凉!

一,前言

刚开始学内核的时候,不要执着于一个方面, 不要专注于- -个子系统就一头扎到实际的代码行中去,因为这样的话,牵涉的面会很广,会碰到很多困难,容易产生挫败感,-个函数体中(假设刚开始的时候正在学习某个方面的某个具体的功能函数)很可能掺杂着其他各个子系统方面设计理念(多是大量相关的数据结构或者全局变量,于支撑该子系统的管理工作)下相应的代码实现, 这个时候看到这些东西,纷繁芜杂,是没有头绪而且很不理解的,会产生很多很多的疑问,(这 个时候如果对这些疑问纠缠不清,刨根问底,那么事实上就是在学习当前子系统的过程中频繁的去涉足其他子系统,这时候注意力就分散了),而事实上等了解了各个子系统后再回头看这些东西的话,就简单多了,而且思路也会比较清晰。所以,要避免”只见树木, 不见森林”,不要急于深入到底层代码中去,不要过早研究底层代码。

我在大学的时候刚开始接触内核,就犯了这个错误,头扎到内存管理里头,去看非常底层的实现代码,虽然也是建立在内存管理的设计思想的基础上,但是相对来说,比较孤立,因为此时并没有学习其它子系统,应该说无论是视野还是思想,都比较狭隘,所以代码中牵涉到的其它子系统的实现我都直接跳过了,这-点还算聪明,当然也是追不得已的。

在我们学习Linux内核之前,我们首先需要掌握以下几点:

(一),如何高效阅读Linux内核源码

(二),Linux内核系统由哪些部分组成的

(三),一文了解Linux内核源码分析办法

(四),最后依据我为大家提供的的学习资料,开启我们的Linux内核学习之旅。

二,学习资料

2.1操作系统专题

浅谈操作系统一:了解Linux 操作系统!开篇!!!

浅谈操作系统二:不得不看的Linux操作系统基础知识

浅谈操作系统三:小白也能秒懂的Linux零拷贝原理

浅谈操作系统四:时间片---实时操作系统的任务调度

浅谈操作系统五:Linux内核操作系统-分页机制

浅谈操作系统六:Linux内核操作系统-分段机制

浅谈操作系统七:一文了解Linux磁盘缓存机制

浅谈操作系统八:一文看懂Linux内核操作系统-内存分配

浅谈操作系统九:一文讲解解操作系统启动、中断、异常和系统调用

浅谈操作系统十:值得一看的Linux内核实战- 操作系统概览

浅谈操作系统十一:一文看懂Linux内核设计—操作系统工作原理

浅谈操作系统十二:操作系统中文件存储空间的管理

浅谈操作系统十三:操作系统——段式存储管理

浅谈操作系统十四:深入讲解linux内核——操作系统原理磁盘阵列

浅谈操作系统十五:简短介绍操作系统—处理器调度

浅谈操作系统十六:讲解Linux内核操作系统——进程状态与转换

2.2内存管理专项

浅谈内存管理一:Linux内核内存管理之匿名页面生命周期

浅谈内存管理二:linux内核内存管理-缺页异常

浅谈内存管理三:linux内核内存管理-brk系统调用

浅谈内存管理四:Linux内核内存管理之get_page_from_freelist()函数

浅谈内存管理五:linux内存管理之页表映射

浅谈内存管理六:linux内核内存管理之内存模型

浅谈内存管理七:Linux内存管理——页交换

浅谈内存管理八:Linux内核内存管理之CPU地址空间

浅谈内存管理九:深入理解虚拟内存

浅谈内存管理十:学习Linux内核内存管理要看的布局图

浅谈内存管理十一:浅析linux内存管理--用户空间和内核空间

浅谈内存管理十二:了才知道Linux 原来是这么管理内存的

浅谈内存管理十三:10张图带你了解Linux内存管理

浅谈内存管理十四:浅谈Linux mmap内存映射

浅谈内存管理十五:一篇透彻了解Linux内存管理

浅谈内存管理十六:Linux上如何清理内存缓存、缓冲与交换空间?

2.4网络协议栈专项

浅谈网络协议栈一:如何学习 Linux 内核网络协议栈

浅谈网络协议栈二:了解系统网络协议栈初始化及数据传输通道建立过程

浅谈网络协议栈三:轻松看懂网络栈主要结构介绍(socket、sock、sk_buff,etc)

浅谈网络协议栈四:一文了解Linux内核网络数据包处理流程

浅谈网络协议栈五:浅析Linux Socket编程(不限Linux)

浅谈网络协议栈六:动静结合Linux网络新技术基石 |​eBPF and XDP

浅谈网络协议栈七:一文了解linux netlink机制介绍与实例

浅谈网络协议栈八:深入理解 netfilter 和 iptables

浅谈网络协议栈九:深入理解linux内核网络收包过程—硬中断与软中断

浅谈网络协议栈十:一文介绍Linux内核中Netfilter

浅谈网络协议栈十一:一文了解Linux上TCP的几个内核参数调优

浅谈网络协议栈十二:一文讲解Linux 内核网络协议栈-数据从接收到ip层

浅谈网络协议栈十三:值得一看!网络协议栈测试神器 - packetdrill

浅谈网络协议栈十四:值得收藏的accept 函数剖析

浅谈网络协议栈十五:一文看懂Linux 内核网络协议栈 -sk_buff 结构体 以及 完全解释

浅谈网络协议栈十六:万字长文浅析:Epoll的那些事儿

2.5设备驱动专项

浅谈设备驱动专项一:详细讲解有关于Linux设备模型的基本概念

浅谈设备驱动专项二:深度解剖Linux内核【网卡设备驱动】

浅谈设备驱动专项三:linux内核 设备驱动之块设备整理

浅谈设备驱动专项四:linux内核设备驱动之字符设备

浅谈设备驱动专项五:一篇文章然你读懂pcl总线原理(图例解析)

浅谈设备驱动专项六:概述Linux内核驱动之GPIO子系统API接口

2.6面试题/经验

【金三银四】2022年大厂秋招—嵌入式开发必备笔试面试经典题型大赏

【纯干货!】Linux 内核经典面试题

2022最新死锁面试题(什么是死锁,产生死锁的原因及必要条件)

【金三银四】Linux内核面试题(2022最新版)

2.7内核书籍

《深入了解Linux内核》

《Linux就该这么学》

《Linux内核完全注释V3.0书签版》

《Linux命令行大全 - 绍茨 (william E.shotts)》

《Linux命令速查手册》

《Linux性能优化大师》

《Linux环境编程:从应用到内核》

《Linux集群和自动化运维 余洪春》

《Linux驱动程序开发实例(第2版)》

《Linux高级程序设计(第3版)》

《构建高可用Linux服务器(第4版)》

书籍免费领取地址:Linux内核源码技术学习路线+视频教程代码资料+内核书籍

三,内核学习路线

Linux内核学习分为四个阶段。首先,了解操作系统基本概念。其次,了解Linux内核机制。其次,研读内核源码。最后,确定个人的发展方向:驱动开发方向;网络开发方向;Linux应用开发方向。任何东西认真学习都能学会的,看你恒心和毅力了。另外,不要走弯路,直接学你要学的东西。不要看市面上讲什么Linux_v0.11内核那些书。

一、了解操作系统的基本知识:

推荐书籍:

1、《操作系统:设计与实现》,作者:Andrew.S.Tanenbaum

二、了解Linux内核的机制

推荐书籍:

1、《Linux内核设计与实现》,作者:Robert Love

三、研究内核源码:

推荐书籍:

1、《深入理解Linux内核》,作者: Daniel.D.Bovet

四、个人的发展方向

1、内核的驱动开发方向:

推荐书籍:

A:《Linux设备驱动程序》,出版社:O'Reilly

B:《精通Linux内核驱动程序开发》

2、内核的网络开发方向:

推荐书籍:

A:《深入理解Linux网络技术内幕》

3、Linux应用编程方向(非Linux内核):

推荐书籍(按照次序读书):

A:《Unix环境高级编程》

B:《Linux系统编程》

C:《Unix网络编程·卷1·套接字联网api》(Linux网络编程)

我的学习方法

刚开始,我认为主要的问题在于你知道不知道,而不是理解不理解,某个子系统的实现采用了某种策略、方法,而你在学习中需要做的就是知道有这么一回事儿, 然后才是理解所描述的策略或者方法。根据自己的学习经验,刚开始学习内核的时候,我认为要做的是在自己的脑海中建立起内核的大体框架,理解各个子系统的设计理念和构建思想,这些理念和思想会从宏观上呈献给你清晰的脉络,就像一个去除了枝枝叶叶的大树的主干,一目了然;当然,肯定还会涉及到具体的实现方法、函数,但是此时接触到的函数或者方法位于内核实现的较高的层次,主(要)函数,已经了解到这些函数,针对的是哪些设计思想,实现了什么样的功能,达成了什么样的目的,混个脸熟的说法在这儿也是成立的。至于该主函数所调用的其它的辅助性函数就等同于枝枝叶叶了,不必太早就去深究。此时,也就初步建立起了内核子系统框架和代码实现之间的关联,关联其实很简单,比如一看到某个函数名字,就想起这个函数是针对哪个子系统的,实现了什么功能。

我认为此时要看的就是《Linux Kernel Development 3rd》,这本书算是泛泛而谈,主要就是从概念,设计,大的实现方法上描述各个子系统,而对于具体的相关的函数实现的代码讲解很少涉及(对比于《Understanding the Linux Kernel 3rd》,此书主要就是关于具体函数代码的具体实现的深入分析,当然,你也可以看,但是过早看这本书,会感觉很痛苦,很枯燥无味,基本上都是函数的实现),很少,但不是没有,这就很好,满足我们当前的需求,还避免我们过早深入到实际的代码中去。而且本书在-些重要的点上还给出了写程序时的注意事项,算是指导性建议。主要的子系统包括:内存管理,进程管理和调度,系统调用,中断和异常,内核同步,时间和定时器管理,虚拟文件系统,块I/O层,设备和模块。(这里的先后顺序其实就是《Linux Kernel Development 3rd》的目录的顺序)。

我学习的时候是三本书交叉着看的,先看《Linux Kernel Development 3rd》,专于- -个子系统,主要就是了解设计的原理和思想,当然也会碰到对一些主要函数的介绍,但大多就是该函数基于前面介绍的思想和原理完成了什么样的功能,该书并没有就函数本身的实现进行深入剖析。然后再看《Understanding the Linux Kernel 3rd》和《 Professional Linux Kernel Architecture》上看同样的子系统,但是并不仔细分析底层具体函数的代码,只是粗略地、不求甚解地看,甚至不看。因为,有些时候,在其中-本书的某个点上,卡壳了,不是很理解了,在另外的书上你可能就碰到对同-个问题的不同角度的描述,说不准哪句话就能让你豁然开朗,如醍醐灌顶。我经常碰到这种情况。

并环是说学习过程中对一一些函数体的实现完全就忽略掉,只要自己想彻底了解其代码实现,没有谁会阻止你。我是在反复阅读过程中慢慢深入的。比如VFS中文件打开需要对路径进行分析,需要考虑的细节不少..之类的),但是其代码实现是很好理解的。再比如,CFS调度中根据shedule latency、队列中进程个数及其nice值(使用的是动态优先级)计算出分配给进程的时间片,没理由不看的,这个太重要了,而且也很有意思。

《Understanding the Linux Kernel 3rd》也会有设计原理与思想之类的概括性介绍,基本上都位于某个主题的开篇段落。但是更多的是对支持该原理和思想的主要函数实现的具体分析,同样在首段,-句话综述函数的功能,然后对函数的实现以1、2、3,或者a、b、c步骤的形式进行讲解。我只是有选择性的看,有时候对照着用source insight打开的源码, 确认一下代码大体上确实是按书中所描述的步骤实现的,就当是增加感性认识。由于步骤中掺杂着各种针对不同实现目的安全性、有效性检查,如果不理解就先跳过。这并不妨碍你对函数体功能实现的整体把握。

《 Professional Linux Kernel Architecture》介于《Linux Kernel Development 3rd》和《Understanding the Linux Kernel 3rd》之间。我觉得《 Professional Linux Kernel Architecture》的作者(看照片,真- -德国帅小伙,技术如此了得)肯定看过《Understanding the Linux Kernel 3rd》, 无论他的本意还是有意,总之《 Professional Linux Kernel Architecture》还是跟《Understanding the Linux Kernel 3rd》有所不同,对函数的仔细讲解都做补充说明,去掉函数体中边边角角的情况,比如一些特殊情况的处理,有效性检查等,而不妨碍对整个函数体功能的理解,这些他都有所交代,做了声明;而且,就像《Linux Kernel Development 3rd》一样,在某些点上也给出了指导性编程建议。作者们甚至对同-一个主要函数的讲解的着重点都不一样。这样的话,对我们学习的人而言,有助于加深理解。另外,我认为很重要的一点就是《 Professional Linux Kernel Architecture》针对的2.6.24的内核版本,而《Understanding the Linux Kernel 3rd》是2.6.11,《Linux Kernel Development 3rd》是2.6.34。 在某些方面《 Professional Linux Kernel Architecture》比较接近现代的实现。其实作者们之所以分别选择11或者24,都是因为在版本发行树中,这两个版本在某些方面都做了不小的变动,或者说是具有标志性的转折点(这些信息大多是在书中的引言部分介绍的,具体的细节我想不起来了)。

Intel V3,针对X86的CPU,本书自然是系统编程的权威。内核部分实现都可以在本书找到其根源。所以,在读以上三本书某个子系统的时候,不要忘记可以在V3中相应章节找到一些基础性支撑信息。

在读书过程中,会产生相当多的疑问,这一点是确信无疑的。大到搞不明白一个设计思想,小到不理解某行代码的用途。各个方面,各种疑问,你完全可以把不理解的地方都记录下来(不过,我并没有这么做,没有把疑问全部记下来,只标记了很少-部分我认为很关键的几个问题),专门写到一-张纸上,不对,一个本上,我确信会产生这么多的疑问,不然内核相关的论坛早就可以关闭了。其实,大部分的问题(其中很多问题都是你知道不知道有这么一回事的问题)都可以迎刃而解,只要你肯回头再看,书读百遍, 其义自现。多看几遍,前前后后的联系明白个七七八八是没有问题的。我也这么做了,针对某些子系统也看了好几遍,切身体会。

当你按顺序学习这些子系统的时候,前面的章节很可能会引用后面的章节,就像《 Professional Linux Kernel Architecture》的作者说的那样,完全没有向后引用是不可能的,他能做的只是尽量减少这种引用而又不损害你对当前问题的理解。不理解,没关系,跳过就行了。后面的章节同样会有向前章节的引用,不过这个问题就简单-些,你可以再回头去看相应的介绍,当时你不太理解的东西,很可能这个时候就知道了它的设计的目的以及具体的应用。不求甚解只是暂时的。比如说,内核各个子系统之间的交互和引用在代码中的体现就是实现函数穿插调用,比如你在内存管理章节学习了的内存分配和释放的函数,而你是了解内存在先的,在学习驱动或者模块的时候就会碰到这些函数的调用,这样也就比较容易接受,不至于太过茫然;再比如,你了解了系统时间和定时器的管理,再回头看中断和异常中bottom half的调度实现,你对它的理解就会加深-层。

子系统进行管理工作需要大量的数据结构。子系统之间交互的-种方式就是各个子系统各自的主要数据结构通过指针成员相互引用。学习过程中,参考书上在讲解某个子系统的时候会对数据结构中主要成员的用途解释一下,但肯定不会覆盖全部(成员比较多的情况,例如task_ struct) , 对其它子系统基于某个功能实现的引用可能解释了,也可能没做解释,还可能说这个变量在何处会做进一步说明。 所以,不要纠结于-一个不理解的点上,暂且放过,回头还可以看的。之间的联系可以在对各个子系统都有所了解之后再建立起来。其实,我仍然在强调先理解概念和框架的重要性。

等我们完成了建立框架这一步,就可以选择一个比较感兴趣的子系统, 比如驱动、网络,或者文件系统之类的。这个时候你再去深入了解底层代码实现,相较于-开始就钻研代码,更容易- -些,而且碰到了不解之处,或者忘记了某个方面的实现,此时你完全可以找到相应的子系统,因为你知道在哪去找,查漏补缺,不仅完成了对当前函数的钻研,而且可以回顾、温习以前的内容,融会贯通的时机就在这里了。

《深入理解linux虚拟内存》(2.4内核版本),《 Linux Device Driver 3rd》,《深入理 解linux网络技术内幕》,几乎每一-个子系统都需要一本书的容量去讲解,所以说,刚开始学习不宜对某个模块太过深入,等对各个子系统都有所了解了,再有针对性的去学习一个特定的子系统。这时候对其它系统的援弓|都可以让我们不再感到茫然、复杂,不知所云。

比如,《 Linux Device Driver 3rd》中的以下所列章节:构造和运行模块,并发和竞态,时间、延迟及延缓操作,分配内存,中断处理等,都属于驱动开发的支撑性子系统,虽说本书对这些子系统都专门开辟一个章 节进行讲解,但是详细程度怎么能比得上《 Professional Linux Kernel Architecture》, 《Understanding the Linux Kernel 3rd》,《Linux Kernel Development 3rd》这三本书,看完这三本书,你会发现读《 Linux Device Driver 3rd》这些章节的时候简直跟喝白开水一样,太随意了,因为《 Linux Device Driver 3rd》的讲解比之《Linux Kernel Development 3rd》更粗略。打好了基础,PCI、 USB、 TTY驱动,块设备驱动,网卡驱动,需要了解和学习的东西就比较有针对性了。这些子系统就重于通用子系统,了解之后, 基于这些子系统的子系统的开发-驱动(需进一步针对硬件特性)和网络(需进一步理解各种协议)一 相对而言,其学习难度大大降低,学习进度大大加快,学习效率大大提升。说着容易做来难。达到这样一种效果的前提就是: 必须得静下心来,认真读书,要看得进去,《 Professional Linux Kernel Architecture》,《Understanding the Linux Kernel 3rd》厚得都跟砖头块儿一样,令人望之生畏,如果没有兴趣,没有热情,没有毅力,无论如何都是不行,因为需要时间,需要很长时间。我并不是说必须打好了基础才可以进行驱动开发,只是说打好了基础的情况下进行开发会更轻松,更有效率,且自己对内核代码的驾驭能力会更强大。这只是我个人见解,我自己的学习方式,仅供参考。

辅助学习,推荐《深入理解LINUX内核》。这本书言简意赅地讲述了主要的内核机制。看完这本书,你会对Linux内核有总体的了解。这本书的内核版本有点老,不过对于了解原理来讲,没有任何问题。

Intel V3 Intel? 64 and IA-32 Architectures Software Developer' s Manual Volume 3 (3A, 3B & 3C):

System Programming Guide

最后提一点非常非常重要的,就是每看一本书一定要做笔记。因为操作系统包含大量的知识,用笔记记录每个知识点的核心,能很方便下次翻阅,因为你必定会回头来翻阅的,你不可能记住每个知识点。如果你没有这种习惯,到时候知识一多就会引发混乱,然后导致放弃。

官方学习地址:Linux内核源码/进程管理/内存管理/网络协议栈/设备驱动程序/文件系统

以上就是linux内核学习路线,关于学习linux内核的建议,希望对小伙伴们有帮助。

代码大佬的【Linux内核开发笔记】分享,前人栽树后人乘凉!_第1张图片

 

你可能感兴趣的:(linux,服务器,java)