Linux内核这么复杂,我该如何学习?
1、首先我们要明白Linux重要性
其实大家每时每刻都在使用着Linux系统,不过,你们对此并不知情而已。可以说Linux已经成为了我们生活中的一个基础,比如飞机的控制系统、银行的系统、手机的系统等等,你可以想象下没有以上的东西我们的生活将会怎么样,我们的生活、资金和生命都掌握在linux手中,它能够让我们生存,同样,它也可以让我们灭亡,所以Linux的重要性几乎令人难是置信,没有Linux的世界可能将会截然不同,或许,这样的世界会暗然失色,一片漆黑,而Linux将是那种世界不会继续存在的理由。
2、我们如何学习呢?
2.1 环境(准备工作)
一开始很多人问用什么linux发行版好呢?其实都差不多,知识点大部分都是一样,我一开始用的是redhat感觉很好的,当然也可以用Ubuntu或者其他的发行版都是可以的。
需要掌握Linux基础知识。例如,Linux命令、磁盘管理、用户管理、文件权限等,强烈推荐大家阅读网友总结的《Linux入门学习笔记》,下载地址:
Linux入门学习笔记(Linux学习界的盗墓笔记)github.com
2.2 Linux内核组成以及源码组织结构
Linux内核主要由进程管理、内存管理、设备驱动、文件系统、网络协议栈外加一个系统调用。

源码组织结构

2.3 清楚Linux内核每个模块里包含了哪些

内存管理
内存原理
SMP/NUMA模型组织
页表/页表缓存
CPU缓存
内存映射
虚拟内存
伙伴分配器
块分配器
巨型页
页回收
页错误异常处理与反碎片技术
连续内存分配器技术原理
不连续页分配器原理与实现
内存系统调用
kmalloc/vmalloc
内存池原理与实现
内存优化与实现
文件系统
虚拟文件系统VFS
通用文件模型
数据结构
文件系统调用
挂载文件系统
无存储文件系统
磁盘文件系统
Ext2/Ext3/Ext4文件系统
日志JBD2
用户空间系统
FUSE原理机制/接口与实现
进程管理
进程基础
进程原理及状态
生命周期及系统调用
task_struct数据结构
进程调度
调度策略
进程优先级
调度类分析
SMP调度
网络协议栈
网络基础架构
SKB/net_device
网络层分析
Linux邻近子系统
netlink套接字
iptables套接字
netfilter框架
内核NIC接口分析
mac80211无线子系统
网络协议栈
internet控制消息协议(ICMP)
用户数据报协议(UDP)
传输控制协议(TCP)
流控制传输协议(SCTP)
数据报拥塞控制协议(DCCP)
IPv4路由选择子系统*
组播/策略/多路径路由选择
接收/发送(IPv4/IPv6)数据报
infiniBand栈的架构
系统API调用
POSIX网络API调用
epoll内核原理与实现
网络系统参数配置
设备驱动
设备子系统
I/O机制原理
设备模型
字符设备子系统
网络接口卡驱动
Linux设备模型
LDM
设备模型和sysfs
字符设备驱动
主设备与次设备
设备文件操作
分配与注册字符设备
写文件操作实现
网卡设备驱动
数据结构
设备方法
驱动程序
块设备驱动
资源管理
I/O调度
BIO结构原理
PCI总线原理
蓝牙子系统
HCI层/连接
L2CAP
BNEP
蓝牙数据包接收架构
2.4 清楚哪些内容后,开始针对每个模块的知识点,系统的学习。
书籍推荐
我要根据自己的实际情况,挑选合适的书籍。例如自己是运维方面的,可以阅读《》、或者自己是想往的可以阅读《》等等。
阅读文章
在学习的时候肯定会遇到一些书本内容难以理解等,这个时候我们需要借鉴一些大神的优秀文章,来帮助自己的掌握知识。

视频学习
在学习的时候,视频往往比文字资料来得更有效果。
1、Linux Kernel Network Drivers - Classification(Linux内核网络驱动程序)
2、Linux Kernel Development(Linux内核开发)
3、The mind behind Linux(Linux背后的思想)
4、Linux Systems Performance(Linux系统性能)
5、Network Driver Interfaces(网络驱动程序接口)
6、Selective module compilation in mainline kernel(在主线内核中编译可选模块):
7、Linux System Programming 6 Hours Course(Linux系统编程6小时课程)
8、Threads and Thread Handing(线程和线程处理)
9、Learning the Linux Kernel with tracing(通过跟踪学习Linux内核)
10、How to Apply a Patch to the Linux Kernel Stable Tree(如何将补丁应用到Linux内核稳定树)
11、Linux Kernel Programming(Linux内核编程- atomic_t数据类型-原子变量和api)
12、Kernel Recipes 2017 - 性能优化大牛Brendan Gregg
内核项目

这些工具,也许能更好帮助我们学习、生产。
大佬论文

只要时间充足,英文不错,可以拜读下,大佬们的学术论文。
2.5 熟读面试题
面试题往往能体现出这个体系里的重点知识,所以我们有必要阅读下面试题。如果自己正想找Linux相关你面试岗位,更加应该看看。

总结
无论我们学习哪个知识,我们应该有章法、有计划、更加应该要有方法,这样的才能学好, 学透。当然,还要勤奋,我们做程序员的,本来就应该多敲代码,多思考。

文章资源来源于Github项目,感兴趣的小伙伴可以去star、fork一下: