Linux内核阅读自学精简教程目录(必读)

学习Linux内核需要一定的计算机基础知识,包括操作系统,计算机网络等。

以下是学习Linux内核的步骤:

  1. 了解Linux内核的基本概念和架构,学习Linux内核源代码的组成和结构。
  2. 学习C语言和汇编语言,这是深入理解Linux内核的必要技能。
  3. 阅读Linux内核源代码,先从简单的模块开始,逐渐深入到较复杂的部分。
  4. 实践代码,写自己的内核模块,理解Linux内核的执行流程和机制。
  5. 参与开源社区,交流学习经验和解决问题。
  6. 参加内核开发相关的培训或者课程,提高自己的技能水平。
  7. 不断探索,深入理解Linux内核的工作原理和设计思想,同时关注最新的内核技术和发展趋势。

一、为什么要学习 Linux 内核

大部分程序员可能永远没有机会开发Linux内核或者驱动Linux,那么我们为什么还需要学习Linux内核呢?Linux的源代码和架构都是开放的,我们可以学到很多操作系统的概念和实现原理。Linux的设计哲学体系继承了UNIX,现在整个设计体系相当稳定和简化,这是大部分服务器使用Linux的重要原因。

那学习Linux内核的原因就在于此。

进一步了解内核的原理,有助于你更好地使用命令和程序设计,让你的面试和开发更上一层楼。但是不建议直接看源代码,因为Linux代码太大,容易丢失。

而最好的办法是,先了解一下Linux内核机制,知道基本的原理与流程。

不过,Linux内核机制也非常复杂,而且其中互相关联。

比如说,进程运行要分配内存,内存映射涉及文件的关联,文件的读写需要经过块设备,从文件中加载代码才能运行起来进程。这些知识点要反复对照,才能理清。

但是一旦攻克!你会发现Linux这个复杂的系统开始透明起来。

二、如何学习Linux内核?

内核的知识就像下面的绳结一样,一环扣一环,我们要解开它们,就必须要先找到线头也就是内核中的函数接口。初学阶段,我们一般不深入的研究内核代码,会使用内核的接口函数就不错了。

下面提供了如何学习这些内核函数的方法,就像解绳子一样

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

(1)如何学习内核,先了解Linux内核由哪些组成?

(2)须知Linux内核源码(下载的链接 )组织结构?

(3)重点需要学习地知识点有哪些?

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

(5)全网最牛Linux内核Makefile系统文件详解(纯文字代码)

(6)全网最详细的Intel CPU体系结构分析(内核源码)

(7)深入理解Linux Kernel内核整体架构(图文详解)

(8)QEMU调试Linux内核环境搭建

(9)网友说Linux驱动讲不彻底,原来这才是Linux驱动

(10)一文让你深度了解Linux内核架构和工作原理

(11)从Linux内核看socket底层的本质(IO)

(12)Linux用户空间与内核空间通信(Netlink通信机制)

二,学习资料

2.1操作系统

官方说明:操作系统(英语:Operating System,缩写:OS)是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件程序。根据运行的环境,操作系统可以分为桌面操作系统,手机操作系统,服务器操作系统,嵌入式操作系统等。

【 强烈推荐阅读】一文带你彻底了解,零拷贝Zero-Copy技术(图解)

Linux操作系统学习——启动

Linux操作系统学习——内核运行

Linux操作系统学习——内核初始化

操作系统原理(一):操作系统原理与概述(流程图)

操作系统原理(二):Linux操作系统基础的常用命令

操作系统原理(三):Linux操作系统I/O机制原理(流程图详解)

操作系统原理(四):内存管理RAID磁盘阵列与配置

操作系统原理(五):内存管理之磁盘高速缓存机制原理

操作系统原理(六):存储管理之页式、段式、段页式存储

系统操作原理(七):进程的状态和转换(五态模型)

操作系统原理(八):进程同步的几种方式及基本原理

操作系统原理(九):处理器调度基本准则和实现原理

系统操作原理(十):多进程,多线程,并发执行中的死锁问题

系统操作原理(十一):操作系统原理:进程同步的几种方式及基本原理

系统操作原理(十二):趣谈操作系统原理,存储管理之页式、段式、段页式存储

系统操作原理(十三):操作系统:通过实战理解CPU上下文切换

汇编语言基础(十一):汇编语言基础知识(图文代码)

汇编语言入门(十二):汇编指令入门级整理,这些你必须要知道

汇编语言指令(十三):汇编语言的所有指令总结,一篇就够了

汇编语言进阶(十四):ARM体系结构处理器机制原理与实现

汇编语言进阶(十五): ARM指令集与汇编语言程序设计

2.2内存管理专题

管理学领域术语:内存管理是指软件运行时对计算机内存资源的分配和使用的技术。其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。一个执行中的程式,譬如网页浏览器在个人电脑或是图灵机(Turing machine)里面,为一个行程将资料转换于真实世界及电脑内存之间,然后将资料存于电脑内存内部(在计算机科学,一个程式是一群指令的集合,一个行程是电脑在执行中的程式)。一个程式结构由以下两部分而成:“本文区段”,也就是指令存放,提供CPU使用及执行; “资料区段”,储存程式内部本身设定的资料,例如常数字串。

【 强烈推荐阅读】尽情阅读,技术进阶,详解mmap原理

内存是什么?一文让你了解内存是怎么实现的

嵌入式开发必备技能,Linux内核源码组织结构

一文了解Linux内存管理,malloc、free 实现原理

内存管理系列(一):Linux操作系统内存管理(思维导图详解)

内存管理系列(二):Linux内存管理原理知识大总结

内存管理系列(三):学完操作系统内存管理,能回答这8个问题吗?

内存管理系列(四):理解 Memory barrier(内存屏障)

内存管理系列(五):内存回收之LRU链表机制原理

内存管理系列(六):虚拟内存和物理内存机制原理

内存管理系列(七):Malloc缺页中断不同情况处理总结及反向映射RMAP

内存管理系列(八):C/C++开发中的Malloc函数的实现原理

内存管理系列(九):深入理解glibc malloc:内存分配器实现原理

内存管理系列(十):操作系统是如何对内存进行管理的,内存与CPU之间的关系

内存管理系列(十一):为什么Linux需要虚拟内存,虚拟内存对操作系统有哪些作用

内存管理系列(十二):用户态内存内存映射函数Mmap的好处

内存管理系列(十三):内存管理:详解虚拟地址空间-MMU

内存管理系列(十四):C语言中的Malloc/free是如何分配内存的

内存管理系列(十五):从虚拟寻址到开源项目,Linux下的内存管理详解

内存管理系列(十六):一文带你了解,虚拟内存、内存分页、分段、段页式内存管理

内存管理系列(十七):Linux应用程序究竟消耗了多少内存

内存管理系列(十八):虚拟地址到物理地址,是什么时候开始映射

内存管理系列(十九):浅析Linux内存管理中SLAB分配器(源码分析)

内存管理系列(二十):基于Linux内存管理的内存分配(伙伴算法和slab算法)

内存管理系列(二十一):探索内存原理的内存映射文件(图文详解)

内存管理系列(二十二):吊打字节面试官,CPU缓存一致性协议MESI

内存管理系列(二十三):深入理解Linux内核页表映射分页机制原理

内存管理系列(二十四):谈谈物理内存与虚拟内存之间的映射(超详细~)

内存管理系列(二十五):内存管理:C/C++开发中的malloc函数的实现原理

内存管理系列(二十六):熬夜肝翻Linux内存管理所有知识点(图解)

1、硬件原理 和 分页管理

2、内存的动态申请和释放

3、进程的内存消耗和泄漏

4、内存与I/O的交换

5、其他工程问题以及调优

6、一文了解,Linux内存管理,malloc、free 实现原理

7、尽情阅读,技术进阶,详解mmap原理

8、浅谈Linux内存管理机制

9、熟读精思,熟读玩味,Linux虚拟内存管理,MMU机制,原来如此也

10、多核心Linux内核路径优化的不二法门之-slab与伙伴系统

11、Linux中的内存管理机制

12、Linux中的内存管理之内存映射

13、Linux中的内存管理之分页

14、浅谈Linux内核之CPU缓存

15、Linux IO 之 IO与网络模型

15、你真的理解Linux中断机制吗

16、Linux内核之系统调用

17、Linux内核之任务空间管理

2.3进程管理专题

计算机术语:进程是正在运行的程序实体,并且包括这个运行的程序中占据的所有系统资源,比如说CPU(寄存器),IO,内存,网络资源等。很多人在回答进程的概念的时候,往往只会说它是一个运行的实体,而会忽略掉进程所占据的资源。比如说,同样一个程序,同一时刻被两次运行了,那么他们就是两个独立的进程。linux下查看系统进程的命令是ps。

进程管理系列(一):Linux进程管理原理详解(代码演示)

进程管理系列(二):十分钟让你像大佬一样快速了解进程状态(二种模型)

进程管理系列(三):作为互联网程序员,应该了解Linux进程六种状态吗?

进程管理系列(四):五分钟让你快速了解Linux进程管理实时调度与SMP

进程管理系列(六):浅析Linux的进程优先级(代码演示)

进程管理系列(七):进程管理|浅析C语言中并发同步与原子操作,锁三者是什么关系

进程管理系列(八):进程管理|深入理解Linux进程述符和进程状态

进程管理系列(九):一文读懂Linux内核中的任务间调度策略

进程管理系列(十):Linux内核之进程和线程的创建和派生

进程管理系列(十一):基于Linux有几种进程状态

进程管理系列(十二):操作系统的几种CPU调度策略

进程管理系列(十二):Linux 进程管理之调度和进程切换

进程管理系列(十三):一文搞懂六大进程通信机制原理(全网最详细)

进程管理系列(十四):超详细的Socket通信原理和实例讲解(白嫖走起~)

进程管理系列(十五):这是一份很全很全的IO基础知识与概念

进程管理系列(十六):深入理解Linux内核进程的管理与调度(全知乎最详细)

1、Linux内核进程、线程、调度(一)

2、Linux内核进程、线程、调度(二)

3、Linux内核进程、线程、调度(三)

4、Linux内核进程、线程、调度(四)

5、一文带你,彻底了解,零拷贝Zero-Copy技术

6、Linux内核进程间通信与管道socket,XSI(System V)

7、Linux内核进程状态总结

8、Linux内核进程的核心——task_truct

9、Linux内核进程、线程的创建和派生

10、Linux内核进程管理任务调度

11、Linux内核进程间通信之管道

12、Linux内核进程间通信之信号

13、Linux内核进程间通信之共享内存和信号量

14、Linux内核进程调度O(1)调度算法

15、Linux内核进程管理原理详解(代码演示)

16、Linux内核进程管理并发同步与原子操作

17、Linux内核进程管理进程优先级

18、Linux内核进程述符和进程状态

19、Linux内核IO基础知识与概念

20、Linux内核Socket通信原理和实例讲解

21、Linux内核进程的管理与调度

22、Linux内核进程管理几种CPU调度策略

23、Linux内核进程管理几种进程状态

24、Linux内核六大进程通信机制原理

2.4网络协议栈专题

官方说明:计算机网络中的一种软件架构,用于实现网络通信的各种协议。它是一种层次化的结构,由多个协议层次组成,每个层次负责不同的功能,从而实现网络通信的各种功能。

【 强烈推荐阅读】嵌入式必备:如何学习Linux内核网络协议栈

趣谈网络协议栈(一):套接字缓冲区原理

趣谈网络协议栈(二):数据包是如何处理的过程

趣谈网络协议栈(三):七层模型下三层数据通信

趣谈网络协议栈(四):传输的Arp报文结构

趣谈网络协议栈(五):Socket编程常用函数的原理及代码实现

趣谈网络协议栈(六):学习select和poll函数的内核实现

趣谈网络协议栈(七):Epoll从用户态到内核态过程分析

趣谈网络协议栈(八):套接字发送网络数据的过程

1、Linux内核网络udp数据包发送(一)

2、Linux内核网络udp数据包发送(二)-UDP协议层分析

3、Linux内核网络UDP数据包发送(三)—IP协议层分析

4、Linux操作系统原理—内核网络协议栈

5、Linux网络栈解剖

6、深入分析Linux操作系统对于TCP IP栈的实现原理与具体过程

7、透过现象看本质,从linux源码角度看epoll

8、驾驭Linux内部网络实现——关键数据结构 sk_buff

9、Linux内核之epoll模型

10、Linux网络源代码学习——整体介绍

11、Linux 中的五种IO模型

2.5设备驱动专题

官方说明:设备驱动是指操作系统和输入输出设备间的粘合剂。

浅谈设备驱动(一):操作系统 I/O 流程详解

浅谈设备驱动(二):Linux操作系统学习之字符设备

浅谈设备驱动(三):结合设备信息集合,探究设备和驱动是如何绑定的

浅谈设备驱动(四):Linux 总线、设备、驱动模型的探究

浅谈设备驱动五):Linux 设备和驱动的相遇

浅谈设备驱动(六):Linux操作系统学习之字符设备

浅谈设备驱动(七):Linux内核设备驱动IO流程详解

浅谈设备驱动(八):Linux内核设备信息集合

浅谈设备驱动(九):Linux内核字符设备Character Device

2.6文件系统

官方说明:文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:文件系统的接口,对对象操纵和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。

1、Linux 操作系统原理-文件系统(一)

2、Linux 操作系统原理-文件系统(二)

3、Linux文件系统详解

4、磁盘IO那些事

5、Linux IO 之 文件系统的架构

6、Linux IO 之 文件系统的实现

7、Linux IO 之 块I/O流程与I/O调度器

8、Linux操作系统学习之虚拟文件系统

9、Linux操作系统学习之文件系统

10、一文让你彻底了解Linux内核文件系统(大总结)

2.7面试题/经验

【 强烈推荐阅读】从事十年嵌入式转内核开发(23K到45K),给兄弟们的一些建议

谈谈Linux内核的学习路线,具体要怎么学?

2022年嵌入式开发想进互联网大厂,你技术过硬吗?

嵌入式Linux内核学习经验总结,一篇让你掌握方法

盘点Linux内核(驱动开发,嵌入式,内核人群)必问的面试题

2022春招大厂-嵌入式开发经典笔试面试题目大整理

面试题一

1、什么是Linux?
2、Unix和Linux有什么区别?
3、什么是 Linux 内核?
4、Linux的基本组件是什么?
5、Linux 的体系结构
6、BASH和DOS之间的基本区别是什么?
7、Linux 开机启动过程?
8、Linux系统缺省的运行级别?
9、Linux 使用的进程间通信方式?
10、Linux 有哪些系统日志文件?
11、Linux系统安装多个桌面环境有帮助吗?
12、什么是交换空间?
13、什么是root帐户?
14、什么是LILO?
15、什么是BASH?
16、什么是CLI?
17、什么是GUI?
18、开源的优势是什么?
19、简单 Linux 文件系统?
20、Linux 的目录结构是怎样的?
21、什么是 inode ?
22、什么是硬链接和软链接?
23、RAID 是什么?
24、一台 Linux 系统初始化环境后需要做一些什么安全工作?
25、什么叫 CC 攻击?什么叫 DDOS 攻击?
26、什么是网站数据库注入?
27、Shell 脚本是什么?
28、可以在 Shell 脚本中使用哪些类型的变量?
29、Shell 脚本中 if 语法如何嵌套?
30、Shell 脚本中 case 语句的语法?
31、Shell 脚本中 for 循环语法?
32、Shell 脚本中 while 循环语法?
33、如何使脚本可执行?
34、在 Shell 脚本如何定义函数呢?
35、判断一文件是不是字符设备文件,如果是将其拷贝到 /dev 目录下?
36、添加一个新组为 class1 ,然后添加属于这个组的 30 个用户,用户名的形式为 stdxx ,其中 xx 从 01 到 30 ?
37、写一个 sed 命令,修改 /tmp/input.txt 文件的内容?
38、用户进程间通信主要哪几种方式?
39、通过伙伴系统申请内核内存的函数有哪些?
40、Linux 虚拟文件系统的关键数据结构有哪些?(至少写出四个)
41、对文件或设备的操作函数保存在那个数据结构中?
42、Linux 中的文件包括哪些?
43、创建进程的系统调用有那些?
44、调用 schedule()进行进程切换的方式有几种?
45、Linux 调度程序是根据进程的动态优先级还是静态优先级来调度进程的?
46、进程调度的核心数据结构是哪个?
47、如何加载、卸载一个模块?
48、模块和应用程序分别运行在什么空间?
49、Linux 中的浮点运算由应用程序实现还是内核实现?
50、模块程序能否使用可链接的库函数?
51、TLB 中缓存的是什么内容?
52、Linux 中有哪几种设备?
53、字符设备驱动程序的关键数据结构是哪个?
54、设备驱动程序包括哪些功能函数?
55、如何唯一标识一个设备?
56、Linux 通过什么方式实现系统调用?
57、Linux 软中断和工作队列的作用是什么?
58、Linux开机启动过程?
59、Linux系统缺省的运行级别
60、Linux系统是由那些部分组成?
61、硬链接和软链接有什么区别?
62、如何规划一台Linux主机,步骤是怎样?
63、查看系统当前进程连接数?
64、如何在/usr目录下找出大小超过10MB的文件?
65、添加一条到192.168.3.0/24的路由,网关为192.168.1.254?
66、如何在/var目录下找出90天之内未被访问过的文件?
67、如何在/home目录下找出120天之前被修改过的文件?
68、在整个目录树下查找文件“core”,如发现则无需提示直接删除它们。
69、有一普通用户想在每周日凌晨零点零分定期备份/user/backup到/tmp目录下,该用户应如何做?
70、每周一下午三点将/tmp/logs目录下面的后缀为*.log的所有文件rsync同步到备份服务器192.168.1.100中同样的目录下面,crontab配置项该如何写?
71、找到/tmp/目录下面的所有名称以"s1.jpg"结尾的普通文件,如果其修改日期在一天内,则将其打包到/tmp/back.tar.gz文件中
72、配置mysql服务器的时候,配置了auto_increment_increment=3,请问这里的3意味着什么?
73、详细说明keepalived的故障切换工作原理
74、什么是系统调用?
75、进程和线程的区别?
76、进程有哪几种状态?
77、进程间的通信方式
78、线程间的同步的方式
79、进程的调度算法
80、操作系统的内存管理主要是做什么?
81、常见的几种内存管理机制
82、快表和多级页表
83、分页机制和分段机制的共同点和区别
84、逻辑(虚拟)地址和物理地址
85、CPU 寻址了解吗?为什么需要虚拟地址空间?
86、什么是虚拟内存(Virtual Memory)?
87、局部性原理
88、虚拟存储器
89、虚拟内存的技术实现
90、页面置换算法

面试题二

1、绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示? 切换目录用什么命令?
2、怎么查看当前进程?怎么执行退出?怎么查看当前路径?
3、怎么清屏?怎么退出当前命令?怎么执行睡眠?怎么查看当前用户 id?查看指定帮助用什么命令?
4、Ls 命令执行什么功能? 可以带哪些参数,有什么区别?
5、建立软链接(快捷方式),以及硬链接的命令。
6、目录创建用什么命令?创建文件用什么命令?复制文件用什么命令?
7、使用哪一个命令可以查看自己文件系统的磁盘空间配额呢?
8、查看文件内容有哪些命令可以使用?
9、随意写文件命令?怎么向屏幕输出带空格的字符串,比如”hello world”?
10、终端是哪个文件夹下的哪个文件?黑洞文件是哪个文件夹下的哪个命令?
11、移动文件用哪个命令?改名用哪个命令?
12、复制文件用哪个命令?如果需要连同文件夹一块复制呢?如果需要有提示功能呢?
13、删除文件用哪个命令?如果需要连目录及目录下文件一块删除呢?删除空文件夹用什么命令?
14、Linux 下命令有哪几种可使用的通配符?分别代表什么含义?
15、用什么命令对一个文件的内容进行统计?(行号、单词数、字节数)
16、Grep 命令有什么用? 如何忽略大小写? 如何查找不含该串的行?
17、Linux 中进程有哪几种状态?在 ps 显示出来的信息中,分别用什么符号表示的?
18、怎么使一个命令在后台运行?
19、利用 ps 怎么显示所有的进程? 怎么利用 ps 查看指定进程的信息?
20、哪个命令专门用来查看后台任务?
21、把后台任务调到前台执行使用什么命令?把停下的后台任务在后台执行起来用什么命令?
22、终止进程用什么命令? 带什么参数?
23、怎么查看系统支持的所有信号?
24、搜索文件用什么命令? 格式是怎么样的?
25、查看当前谁在使用该主机用什么命令? 查找自己所在的终端信息用什么命令?
26、使用什么命令查看用过的命令列表?
27、使用什么命令查看磁盘使用空间? 空闲空间呢?
28、使用什么命令查看网络是否连通?
29、使用什么命令查看 ip 地址及接口信息?
30、查看各类环境变量用什么命令?
31、通过什么命令指定命令提示符?
32、查找命令的可执行文件是去哪查找的? 怎么对其进行设置及添加?
33、通过什么命令查找执行命令?
34、怎么对命令进行取别名?
35、du 和 df 的定义,以及区别?
36、awk 详解?
37、当你需要给命令绑定一个宏或者按键的时候,应该怎么做呢?
38、如果一个linux新手想要知道当前系统支持的所有命令的列表,他需要怎么做?
39、如果你的助手想要打印出当前的目录栈,你会建议他怎么做?
40、你的系统目前有许多正在运行的任务,在不重启机器的条件下,有什么方法可以把所有正在运行的进程移除呢?
41、bash shell 中的hash 命令有什么作用?
42、哪一个bash内置命令能够进行数学运算?
43、怎样一页一页地查看一个大文件的内容呢?
44、数据字典属于哪一个用户的?
45、怎样查看一个linux命令的概要与用法?假设你在/bin目录中偶然看到一个你从没见过的的命令,怎样才能知道它的作用和用法呢?

2.8内核书籍

  • 《深入了解Linux内核》
  • 《Linux就该这么学》
  • 《Linux内核完全注释V3.0书签版》
  • 《Linux命令行大全 - 绍茨 (william E.shotts)》
  • 《Linux命令速查手册》
  • 《Linux性能优化大师》
  • 《Linux环境编程:从应用到内核》
  • 《Linux集群和自动化运维 余洪春》
  • 《Linux驱动程序开发实例(第2版)》
  • 《Linux高级程序设计(第3版)》
  • 《构建高可用Linux服务器(第4版)》

书籍免费领取地址:https://docs.qq.com/doc/DTkZRWXRFcWx1bWVx

2.9Linux内核源码视频讲解

1、深度剖析Linux内核SMP负载均衡-----视频讲解地址

2、深度剖析Linux内核ARM64处理器架构-----视频讲解地址

3、深度剖析Linux内核ARM异常处理-----视频讲解地址

4、深度剖析Linux内核CFS调度器-----视频讲解地址

5、深度剖析Linux内核量化负载计算能力-----视频讲解地址

6、深度剖析Linux内核进程及生命周期-----视频讲解地址

7、深度剖析Linux内核CPU域初始化实现-----视频讲解地址

8、深度剖析Linux内核蓝牙子系统架构-----视频讲解地址

9、深度剖析Linux内核USB系统架构-----视频讲解地址

10、深度剖析Linux内核IO体系结构与访问设备-----视频讲解地址

11、深度剖析Linux内核进程管理机制-----视频讲解地址

12、深度剖析Linux内核MLFQ经典调度算法-----视频讲解地址

13、深入剖析Linux内核伙伴系统实现及API调度实战-----视频讲解地址

14、深入剖析Linux内核哈希表与运行队列-----视频讲解地址

15、深入剖析Linux内核NUMA调度器-----视频讲解地址

16、深度剖析Linux内核perf性能优化分析-----视频讲解地址

17、深入剖析Linux内核源码(完整版)

2.10内核项目

2.11论文

资料直通车:最新Linux内核源码资料文档+视频资料

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

三,Linux内核

3.1学习建议

学习linux内核不像学习语言。一个月或者三月就能掌握C或者java。学习linux内核需要循序渐进,掌握正确的linux内核学习路线非常重要。本文将分享一些学习linux内核的建议。

1.了解操作系统的基本概念。如果没有,可以学习《操作系统:设计与实现》,Andrew S.Tanenbaum写的那本,以MINIX为例解释操作系统的概念。非常推荐。

2.有了操作系统的基本概念,你就可以理解Linux的机制了。推荐罗伯特·拉芙写的Linux内核设计与实现。这本书从概念上解释了Linux有什么以及它是如何工作的。这本书应该反复仔细阅读。

3.有了Linux内核的知识,我们还需要具体学习Linux内核源代码。经典的是丹尼尔·p·博韦特写的《深入理解Linux内核》。学习这本书的时候,要看看内核代码。这本书学起来挺费劲的,所以有很多代码要研究。但是,如果这本书很好理解,那么恭喜你,你已经对Linux内核很熟悉了。

4.如果你想开发设备驱动,可以向O 'Reilly Press学习Linux设备驱动。这本书是驾驶入门的好材料。还有一本很好的教材,精通Linux驱动开发,可以参考一下。开车,难免要学习一些硬件协议和资料。如果你研究的是哪一种,可以找相应的硬件文档,了解硬件的工作原理。这些我就不细说了。

5.网络部分,学习一些Linux网络部分学习《深入了解LINUX网络技术内幕》。这本书把Linux的网络部分讲得非常清楚透彻。不过我们一般不做这方面的研究,也不需要做那么多研究。毕竟现在相关岗位很少。

6.现在Linux相关的工作大多集中在一些嵌入式开发领域,如arm、mips等。你要学习以下关于架构的信息,了解CPU的设计和工作模式。看看ARM对应的芯片手册就知道了,很详细的。mips随便看看MIPS运行,有一两个版本。两个版本有些区别,建议全看。

7.补充一点经验。不要以为Linux庞大复杂,就很难学。认真学习,什么都可以学。就看你的毅力和恒心了。另外,不要走弯路,不要看市面上那些讲Linux0.11的书,学你想学的就好。就像学C语言看谭浩强一样,走弯路,费力气,严重影响学习效果。

关于linux内核学习路线,再多说几句应用编程,有时候经常会需要的:

1. 学习Linux应用编程,建议看《unix环境高级编程》,把里面的例子都做一遍,会对整个Linux编程有系统都认识。

2. 针对Linux,有本 《Linux系统编程》,学完上一本,这本很快看一遍就懂了。主要是针对Linux具体懂一些内容,讲的挺全了,很实用。

3. Linux网络编程,系统的学习一下《unix网络编程。卷1,套接字联网api》,基本上网络应用相关的程序就都没问题了。

这些内容,分几年时间,分步计划学习,就会成为Linux高手了。个人建议参加零声教育的培训,学习效率会高很多,有目的性的参加培训,缩短周期,快速成型才是时代所需。

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

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

3.3工作经验

很多同学对Linux接触很少,对Linux平台的开发一无所知。现在,趋势越来越表明,作为一个优秀的软件开发者或者计算机IT从业者,掌握Linux是一个非常重要的谋生资源和手段。接下来我将结合我个人几年的开发经验,谈谈Linux的学习方法和学习中应该注意的一些事情,特别是关于Linux,类UNIX系统和开源软件文化。

就像我刚才说的,很多同学之前可能连Linux是什么都不知道,更别说UNIX了。所以我们从最基础的一点开始,Linux和UNIX的历史我们就不多说了,直接进入入门学习。

Linux入门非常简单。问题是你有没有耐心,有没有爱折腾,有没有不排除重装之类的大修。可以说不折腾是学不好Linux的。鸟哥说你要真正了解Linux的分区机制,并且对LVM的使用相当熟练。不超过20次是无法积累Linux安装经验的,所以不要怕折腾。

既然之前大家都用Windows,我也尽量照顾这些“菜鸟”。我的推荐,如果你是第一次接触Linux,那就先在虚拟机里试试。我推荐虚拟机用的Virtual Box。我不提倡使用VM,因为VM是开源的,是收费的。我不想推广盗版。当然,如果你有足够的钱,你可以试试VM,但我想说的是,即使是VM也不一定好。付费软件不一定好。首先,虚拟盒子很小。Windows平台下安装包80MB左右,而VM每转600MB。虽然很强大,但是消耗了很多资源。更何况虚拟盒子完全可以满足你的需求。所以,还是自己选比较好。如何使用虚拟机是你的事。这个就不教你了,因为很简单。如果不能,可以用谷歌或者百度。如果你英语好,可以直接看官方文件。

现在介绍Linux发行版的知识。正如你所见,Linux发行版并非Linux,Linux仅是指操作系统的内核,作为科班出生的你不要让我解释,我也没时间。

我推荐的发行版如下:

  1. UBUNTU适合纯新手,追求稳定的官方支持,对系统稳定性要求弱,喜欢最新的应用,相对不喜欢折腾开发者。
  2. 比UBUNTU难很多的发行版Debian,特点是稳定易用的包管理系统,缺点是缺乏企业支持,以社区开发为驱动。
  3. Arch,追逐时尚的开发者首选,优点是包更新相当快,升级无缝。基本上一次安装就可以一直工作,没有UBUNTU那样的版本概念。专业点叫滚动升级,让你的系统保持最新。缺点很明显,不稳定。同时安装配置也比Debian麻烦。
  4. 比Arch更难的Gentoo,考验用户的综合水平。从系统安装到微调,内核编译都是手把手。是高手和黑客展示自己技术手段,按需配置符合自己要求的系统的首选。

Slackware与Gentoo类似:

社区维护的RedHat的副本CentOS,完全是用RedHat的源代码重新编译的,理论上和RedHat的兼容性是最好的。如果你专注于Linux服务器,比如网络管理和网站建设,那么CentOS就是你的选择。

LFS,终极黑客炫耀工具,完全从源代码安装编译系统。在安装之前,您只能获得一个文档。您所要做的就是按照文档中的说明,一步一步,一个订单一个订单地,一个一个地构建您的Linux包。完全在你的掌控之中,你想要什么就有什么。如果你制作了LFS,那就证明你的Linux技术相当不错。如果你能借鉴LFS文档,把Linux从源代码移植到嵌入式系统,我敢说你能在中国企业做得很好。

你得挑一个适合自己的系统,然后装在虚拟机里开始用。如果你想快速学习Linux,我有一个建议,你应该忘记图形界面。不要去想图形界面能不能为你的问题提供答案,而是去世界各地寻找,询问如何用命令行解决你的问题。在这个过程中,你最好掌握好Linux的命令,至少要知道常用的命令,同时要建立自己的知识库,里面包含了你积累的知识。

下一阶段需要学习Linux平台的C++/C++开发,以及Bash脚本编程,如果对Java有很深的兴趣,还需要学习Java。同样,我建议你抛弃图形界面的IDE,从VIM开始。为什么是VIM而不是Emacs?我无意挑起编辑器大战,但我认为VIM适合新手和手笨脑慢的开发者。Emacs的按键太多,太复杂,我很害怕。然后是GCC,Make,Eclipse(Java,C++或者)。虽然Eclipse中列出了C++,但是我不建议用IDE开发C++,因为这不是Linux的文化,你很容易忽略一些应该注意的问题。IDE让你懒的跟猪一样懒。如果你对程序调试和测试感兴趣,你必须学好GDB。如果不是GDB,这也是一门必修课。这是发展的第一步。注意,我没有提到任何关于Linux API的东西,现阶段也不关心这个。你要做的就是积累经验,Linux平台开发的经验。我推荐的书如下:《C语言编程》,或者谭浩强的。c,白皮书当然更好。++C++ Primer Plus是C推荐的,我不喜欢Java,所以不推荐。工具推荐VIM的官方手册,GCC中文文档,GDB中文文档,GNU开源软件开发指南(电子书),汇编语言编程(让你对库,链接,嵌入式汇编,编译器优化选项有个初步的了解,不深入)。

如果过不了这个阶段,就不用做了。这是底线,也是最基本的基础。否则,离开,不要开发Linux。不专业的Linux开发者做出来的程序与Linux文化或者UNIX文化相悖,程序走不了多远,也不可能像Bash、VIM这样神奇的产品。所以做不好就走人。

接下来进入Linux系统编程,唯一的选择,APUE,UNIX环境下的高级编程。反复读,10遍太少。如果你在大学能把这本书砸了,里面的内容都练过了,有作品,口语表达能力足够强,面试的时候就能说服所有考官。(可能有点夸张,但APUE绝对是圣经读物,连Windows程序员都从中汲取养分。谷歌创始人的案头书,扎伯克的床头读物。)

看完这本书,你会对Linux系统编程有很好的了解。Linux和Windows平台有什么区别?它们的优缺点是什么?我的总结如下:Windows平台开发难。微软的系统API一直在扩展。如果你想使用最新最高效的功能,你必须时刻学习最适合当前流行系统的功能。不,Linux有大约100个核心API,所以你可以用很好的记忆力记住它们。而且会长期不变。为什么不呢?因为它兼容UNIX,符合POSIX标准。因此,Linux平台的开发大多集中在底层或服务器编程上。这是它的优势。当然图形是Linux的软肋,但从一个开发者的角度来说,我不在乎,因为我也能适应命令行。如果有更好的图形界面,我会把它作为礼物。另外,Windows是关闭的,你甚至不知道系统做了什么。你将永远被微软牵着鼻子走。想想吧。如果微软说Win8不支持QQ,腾讯也不会哭死。而且Linux是完全开源的。如果不喜欢,可以自己改,只要足够熟练。另外,虽然Windows使用的人很多,但是使用的场合比较单一,以桌面为主。Linux各方面都有发展,尤其是云计算、服务器软件、嵌入式领域、企业应用,兼容性一流。由于POSIX可以在UNIX系统上无缝运行,因此Apple Mac和IBM AS400系列都完全支持它。另外,Linux的开发环境支持绝对一流,无论是C/C++,Java,Bash,Python,PHP,Javascript,。。。。。。连C#都支持。而且微软除了Visual Stdio套件都不太友好吧?

如果你看了APUE后有很多感触,想验证你的一些想法或经验,推荐UNIX编程艺术,世界顶尖黑客将与你分享他们的观点。现在是时候转移注意力了。总的来说,我分为四个方向:网络、图形、嵌入式、设备驱动。

如果选择网络,细分的话,其他的不太熟悉,只说服务器软件编写和高性能并发程序编写。相对来说,这是网络编程中技术含量最高的,也是最底层的。需要很多经验,看很多书,做很多项目。

我的看法是以下面的顺序来看书:

  1. APUE的深度阅读——尤其是进程、线程、IPC、套接字
  2. 多核编程——Pthread一定要吃透,你是NB
  3. UNIX网络编程–第1卷,第2卷
  4. TCP/IP网络详解——是时候再看一遍以上两本书了。
  5. TCP/IP网络的详细说明–第2卷。我觉得看第二卷就差不多了。当然,最好还是看第三卷。尽力去看吧。
  6. Lighttpd源代码——这个服务器也很有名。
  7. NGX源代码——与Apache相比,Nginx的源代码更少。如果能大致看一下,就是NB了。看源码主要是学习里面的socket编程和并发控制,想想就激动。如果你有这些技能,你可以试试给暴雪发简历,给他们写服务器后台,以为全世界的魔兽都运行在你的服务器软件上。
  8. Linux内核TCP/IP协议栈——深入了解TCP/IP实现
  9. 如果还是喜欢驱动设计,可以看看底层协议,比如链路层。给路由器,网卡,网络设备,嵌入式系统软件写驱动应该不是问题。当然,一般的网络公司,哪怕是百度级别的,都应该毫不犹豫的录用你。看后面的书只需要时间和经验,所以35岁之前就做吧!跳槽到给你未来的地方!

图形方向,我觉得图形方向也是很有前途的,以下几个方面:

Opengl的工业和游戏开发在国外已经比较成熟。

动画特效,比如皮克斯,在国外也比较成熟。

GPU计算技术可以应用于浏览器网页渲染和GPU计算资源利用。因为开源,所以有很多文档程序可以参考。如果能进入火狐开发,或者谷歌做浏览器开发,应该很不错。

嵌入式方向:嵌入式方向没说的,Linux很重要

掌握多种架构,不仅仅是X86,ARM,MCU等。必须理解。如果你不懂硬件,我预见你会死在路上,我也想往嵌入式方向走,但是我觉得就算是学电子的学生也比不过学校教嵌入式的方式。我劝你,做之前一定要了解硬件。如果你去做嵌入式应用开发,只能祝你好运了。不要碰上诺基亚、惠普这样的公司,否则你会很惨。

驱动设计:软件开发周期很长,硬件不一样,很快。每个月都有这么多新硬件诞生,如何让它们在Linux上工作是你的工作。因为Linux兼容性好,如果不是太低级的驱动,基本的C语言就可以了,系统架构影响不大。由于系统支持,您可能可以在ARM上使用PC硬件,但需要做一些更改。所以硬件驱动开发不像嵌入式,对硬件知识要求很高。可能的方向很多,比如家电,特别是像索尼、日立、希捷、富士康这样的工厂,比较稀缺。

3.4适合人群

  • Linux 内核优化、内存管理 ,内核开发岗位、定制化自己OS
  • 深入系统内核研究、网络安全逆向分析
  • 提升自己能力,为了更好做应用层开发提供核心依据
  • 跳槽面试大厂(腾讯、华为、中兴、中微、中芯等等)
  • 从事业务开发多年,对底层原理理解不够深入的在职工程师
  • 从事嵌入式方向开发,想转入内核开发的在职工程师
  • 从事Qt/MFC等桌面开发的,薪资多年涨幅不大的在职工程师
  • 从事非开发岗位(算法岗,运维岗,测试岗),想转内核开发岗位的在职工程师

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

界面控件DevExpress WinForm的垂直网格,让数据展示更灵活(二)

DevExpress WinForm Vertical Grid(垂直网格)组件设计用于提供UI灵活性,它允许显示数据集中的单个行,或在其90度反向网格容器中显示多个数据集行。此外,开发者还可以将其用作属性网格,就像在Visual Studio …

Python使用pytorch深度学习框架构造Transformer神经网络模型预测红酒分类例子

1、红酒数据介绍 经典的红酒分类数据集是指UCI机器学习库中的Wine数据集。该数据集包含178个样本,每个样本有13个特征,可以用于分类任务。 具体每个字段的含义如下: alcohol:酒精含量百分比 malic_acid:苹果酸含量&a…

用手机APP操作使用井用采样器更省时省力

井用采样器的主要功能特点就是:机身小巧,方便操作。可用于井下作业,手机APP可实时查看采样数据,节省人力。 利用自动采样器进行水样采集可以说节省很大的人力物力,但是有时为了采到更具代表性的水样,我们需…

JAVA-6-[Spring框架]Bean的作用域和生命周期

1 Spring Bean 1、Spring有两种类型bean,一种普通bean,另外一种工厂bean(FactoryBean)。 2、普通bean:在配置文件中定义的bean类型就是返回的类型。 3、工厂bean:在配置文件中定义的bean类型可以和返回类型不一样。 第一步 创建类…

React超级简单易懂全面的有关问题回答(面试)

目录 React事件机制: 2、React的事件和普通的HTML有什么不同: - 事件命名的规则不同,原生事件采用全小写,react事件采用小驼峰 3、React组件中怎么做事件代理?他的原理是什么? 4、React高阶组件、Rend…

mysql 如何避免索引失效

案例演示 建表及初始化数据 CREATE TABLE staffs (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(24) NOT NULL DEFAULT ,age INT NOT NULL DEFAULT 0,pos VARCHAR(20) NOT NULL DEFAULT ,#职位add_time TIMESTAMP NOT NULL DEFAULT CURREN…

【源码解析】SpringBoot日志系统源码分析

LoggingApplicationListener 日志组件的处理是LoggingApplicationListener实现的。LoggingApplicationListener#onApplicationEvent&#xff0c;监听事件。如果实现接口GenericApplicationListener&#xff0c;可以允许适配事件类型。 private static final Class<?>[]…

链接sqlite

一.sqlite库函数 1.sqlite3_open()函数 语法&#xff1a;*sqlite3_open(const char *filename, sqlite3 *ppDb) 作用&#xff1a;该例程打开一个指向 SQLite 数据库文件的连接&#xff0c;返回一个用于其他 SQLite 程序的数据库连接对象。 参数1&#xff1a;如果 filename …

8个免费的PNG素材网站推荐

很多设计小白都不知道什么是PNG。事实上&#xff0c;PNG是一种支持透明度的图像格式。当你想在设计中将图像与背景或文本混合时&#xff0c;它就会派上用场。 如果你没有时间为你正在处理的设计创建透明的PNG图像&#xff0c;你也可以使用我收集的PNG素材网站&#xff0c;以便…

Mysql-SQL优化

SQL优化 插入数据优化1&#xff09;批量插入数据2&#xff09;手动控制事务3&#xff09;主键顺序插入大批量插入数据 主键优化order by优化group by优化limit优化count优化update优化小结 插入数据优化 插入数据优化主要是对于insert进行批量插入时优化&#xff0c;下面我们就…

d3.js学习笔记②搭建服务器(含报错解决)

强烈建议自己搭建一个服务器&#xff0c;否则在后续往js里导入本地数据&#xff08;比如csv、json文件等&#xff09;的时候会报错。我用的是Apache服务器&#xff0c;下载、安装过程参考这篇文章&#xff1a;Apache安装配置 在浏览器输入http://localhost/或者http://127.0.0…

excel实战小测第四

【项目背景】 本项目为某招聘网站部分招聘信息&#xff0c;要求对“数据分析师”岗位进行招聘需求分析&#xff0c;通过对城市、行业、学历要求、薪资待遇等不同方向进行相关性分析&#xff0c;加深对数据分析行业的了解。 结合企业真实招聘信息&#xff0c;可以帮助有意转向数…

一文看懂数据分析必备计算功能—内存计算

各位数据的朋友&#xff0c;大家好&#xff0c;我是老周道数据&#xff0c;和你一起&#xff0c;用常人思维数据分析&#xff0c;通过数据讲故事。 接下来&#xff0c;我们准备讲一系列的奥威BI软件的内存计算在各种分析场景中的应用。在正式开讲之前&#xff0c;我先简单说一下…

嵌入式设备显示屏相关概念汇总

嵌入式设备常用的显示屏接口 LCD 接口&#xff1a;是一种常见的数字电路接口&#xff0c;支持多种显示器件&#xff0c;如字符型液晶显示器和点阵型液晶显示器等。 VGA 接口&#xff1a;是一种视频接口标准&#xff0c;用于连接显示器和计算机。该接口提供模拟 RGB 信号&#…

快速多关键字统计

实例需求&#xff1a;在每个章节中统计关键字&#xff08;“√”, “”, “〇”, “空缺”&#xff09;的个数&#xff0c;B列中的章节编号作为章节划分的标识&#xff0c;例如1.1.1 ~ 1.1.5为第1.1章节&#xff0c;对应工作表的12 ~ 16行&#xff0c;其中黄色列为需要统计的数…

IDEA中使用Git提交代码提示:您即将把CRLF行分隔符提交到Gt仓库。 建议将core.autocrlf Git特性设置为trUe,以免发生行分隔符问题。

IDEA中使用Git提交代码提示&#xff1a;您即将把CRLF行分隔符提交到Gt仓库。 建议将core.autocrlf Git特性设置为trUe,以免发生行分隔符问题。 问题背景&#xff1a; 在IDEA中&#xff0c;使用Git提交代码到远程仓库时&#xff0c;结果弹出一个警告窗口 问题原因&#xff1a; …

【测试开发】突破瓶颈必学技能——什么是k8s的核心概念?

目录 Docker 和K8s k8s中的重要概念 Master 节点 Node 节点 集群&#xff08;Cluster&#xff09; 标签&#xff08;Label&#xff09; 命名空间&#xff08;Namespace&#xff09; 容器组&#xff08;Pod&#xff09; 无状态部署&#xff08;Deployment&#xff09;…

【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码

【2023五一杯数学建模】 B题 快递需求分析问题 1 题目 请依据以下提供的附件数据和背景内容&#xff0c;建立数学模型&#xff0c;完成接下来的问题&#xff1a;问题背景是&#xff0c;网络购物作为一种重要的消费方式&#xff0c;带动着快递服务需求飞速增长&#xff0c;为我…

AVL 树(自平衡二叉搜索树) 介绍

AVL 树&#xff08;自平衡二叉搜索树) 介绍 前言 在介绍二叉搜索树的章节中提到&#xff0c;二叉搜索树可能退化为线性链表&#xff0c;失去作为二叉树的各种优势。那么过程中需要维持二叉树的形式&#xff0c;同时左右子树的深度差异可控&#xff0c;如果能实现这两个条件&a…

音视频 FFmpeg

文章目录 前言视频编解码硬件解码(高级)软解码(低级)软、硬解码对比视频解码有四个步骤Android 系统中编解码器的命名方式查看当前设备支持的硬解码 基础知识RGB色彩空间常见的格式对比YUV索引格式分离RGB24像素数据中的R、G、B分量 BMP 文件格式格式组成像素排列顺序RGB24格式…
最新文章