最实用、最核心的知识是晦涩的、难学的,对于这个学习大纲希望对于正在学Linux内核路上的同学能有所帮助。
进程管理和调度
进程的优先级
进程生命周期
进程表示
- 进程类型
- 命名空间
- 进程ID号
- 进程关系.
进程管理相关的系统调用
- 进程复制
- 内核线程
- 启动新进程
- 退出进程
调度器的实现
- 概观
- 数据结构
- 处理优先级
- 核心调度器
完全公平调度类
- 数据结构
- CFS操作
- 队列操作
- 选择下一个进程
- 处理周期性调度器
- 唤醒抢占
- 处理新进程
实时调度类
- 性质
- 数据结构
- 调度器操作
调度器增强
- SMP调度器
- 调度域和控制组
- 内核抢占和低延迟相关工作
内存管理
(N)UMA模型中的内存组织
- 概述
- 数据结构
页表
- 数据结构
- 页表项的创建和操作
初始化内存管理
- 建立数据结构
- 特定于体系结构的设置
- 启动过程期间的内存管理
物理内存管理
- 伙伴系统的结构
- 避免碎片
- 初始化内存域和结点数据结构
- 分配器API
- 分配页
- 释放页
- 内核中不连续页的分配
- 内核映射
slab分配器
- 备选分配器
- 内核中的内存管理
- slab分配的原理
- 实现
- 通用缓存
处理:器高速缓存和TLB控制
进程虚拟内存
进程虚拟地址空间
- 进程地址空间的布局
- 建立布局
内存映射的原理
数据结构
- 树和链表
- 虚拟内存区域的表示
- 优先查找树
对区域的操作
- 将虚拟地址关联到区城
- 区域合并
- 插入区域
- 创建区域
内存映射
- 创建映射
- 删除映射
- 非线性映射
反向映射
- 数据结构
- 建立逆向映射
- 使用逆向映射
用户空间缺页异常的校正
- 按需分配/调页
- 匿名页
- 写时复制
- 获取非线性映射
内核缺页的异常
在内核和用户空间之间复制数据
锁与进程间通信
控制机制
- 竞态条件
- 临界区
内核锁机制
- 对整数的原子操作
- 自旋锁
- 信号量
- RCU机制
- 内存和优化屏障
- 读者/写者锁
- 大内核锁
- 互斥量
- 近似的per-CPU计数器
- 锁竞争与细粒度锁
System V进程间通信
- System V机制
- 信号量
- 消息队列
- 共享内存
其他IPC机制
- 信号
- 管道与套接字
设备驱动程序
I/0体系结构
访问设备
- 设备文件
- 字符设备、块设备和其他设备
- 使用ioct进行设备寻址
- 主从设备号的表示
- 注册
与文件系统关联
- inode中的设备文件成员
- 标准文件操作
- 用于字符设备的标准操作
- 用于块设备的标准操作
字符设备操作
- 表示字符设备
- 打开设备文件
- 读写操作
块设备操作
- 块设备的表示
- 数据结构
- 向系统添加磁盘和分区
- 打开块设备文件
- 请求结构
- BIO
- 提交请求
- I/O调度
- ioct的实现
资源分配
- 资源管理.
- 1/O内存
- 1/O端口
总线系统
- 通用驱动程序模型
- PCI总线
- USB
模块
使用模块
- 添加和移除
- 依赖关系
- 查询模块信息
- 自动加载
插入和删除模块
- 模块的表示
- 依赖关系和引用
- 模块的二进制结构
- 插入模块
- 移除模块
自动化与热插拔
- kmod实现的自动加载
- 热插拔
版本控制
- 校验和方法
- 版本控制函数
虚拟文件系統
文件系统类型
通用文件模型
- inode
- 链接
- 编程接口
- 将文件作为通用接口
VFS的结构
- 结构概观
- inode
- 特定于进程的信息
- 文件操作
- 目录项缓存
处理VFS对象
- 文件系统操作
- 文件操作
标准函数
- 通用读取例程
- 失效机制
- 权限检查
系统调用
系统程序设计基础
- 追踪系统调用
- 支持的标准
- 重启系统调用
内核活动
中断
- 中断类型
- 硬件IRQ
- 处理中断
- 数据结构
- 中断电流处理
- 初始化和分配IRQ
- 处理IRQ
软中断
- 开启软中断处理
- 软中断守护进程
tasklet
- 创建tasklet
- 注册tasklet
- 执行tasklet
等待队列和完成量
- 等待队列
- 完成量:
- 工作队列
系统调用的实现
- 系统调用的结构
- 访问用户空间
- 追踪系统周用
Ext文件系统族
Ext2文件系统
- 物埋结构
- 数据结构
- 创建文件系统
- 文件系统操作
Ext3文件系统
- 数据结构.
Ext4文件系统
- 数据结构
- 加密部分
- 扩展部分
无持久存储的文件系统
proc文件系统
- /pro的内容
- 数据结构
- 初始化
- 装载proc文件系统
- 管理/proc数据项
- 进程相关的信息
- 系统控制机制
简单的文件系统
- 顺序文件.
- 用libfs编写文件系统
- 调试文件系统
- 伪文件系统
sysfs
- 数据结构
- 装载文件系统
- 文件和目录操作
- 向sysfs添加内容
扩展属性和访问控制表
扩展属性
- 到虚拟文件系统的接口
- Ext4中的实现
- Ext3中的实现
- Ext2中的实现
访问控制表
- 通用实现
- Ext4中的实现
- Ext3中的实现
- Ext2中的实现
网络
ISO/OSI和TCP/IP参考模型
通过套接字通信
- 创建套接字
- 使用套接字
- 数据报套接字
网络实现的分层模型
网络命名空间
套接字缓冲区
- 使用套接字缓冲区管理数据
- 管理套接字缓冲区数据
网络访问层
- 网络设备表示
- 接收分组
- 发送分组
网络层
- IPv4
- IPv6
- 接收分组
- 交付到本地传输层
- 分组转发
- 发送分组
- netfilter
传输层
- UDP
- TCP
应用层
- socket数据结构
- 套接字和文件
- socketcall系统调用
- 创建套接字
- 接受数据
- 发送数据
内核内部的网络通信
- 通信函数
- netlink机制
系统调用
系统程序设计基础
- 追踪系统调用
- 支持的标准
- 重启系统调用
可用的系统调用
系统调用的实现
- 系统调用的结构
- 访问用户空间
- 追踪系统调用
时间管理
概述
- 定时器类型
- 配置选项
低分辨率定时器的实现
- 定时器激活与进程统计
- 处理jiffies
- 数据结构
- 动态定时器
通用时间子系统
- 概述
- 配置选项
- 时间表示
- 用于时间管理的对象
高分辨率定时器
- 数据结构
- 设置定时器
- 实现
- 周期时钟仿真
- 切换到高分辨率定时器
动态时钟
- 数据结构
- 低分辨率系统下的动态时钟
- 高分辨率系统下的动态时钟
- 停止和启动周期时钟
广播模式
定时器相关系统调用的实现
- 时间基准
- alarm和setitimer系统调用
- 获取当前时间
管理进程时间
页缓存和块缓存
页缓存的结构
- 管理和查找缓存的页
- 回写修改的数据
块缓存的结构
地址空间
- 数据结构
- 页树
- 地址空间操作
页缓存的实现
- 分配页
- 查找页
- 在页上等待
- 对整页的操作
- 页缓存预读
块缓存的实现
- 数据结构
- 操作
- 页缓存和块缓存的交互
- 独立的缓存区
数据同步
pdflush机制
启动新线程
线程初始化
执行实际工作
周期性刷出
相关数据结构
- 页状态
- 回写控制
- 可调参数
中央控制
超级块同步
inode同步
- 遍历超级块
- 考察超级块inode
- 回写单个inode
拥塞
- 数据结构
- 阈值
- 拥塞状态的设置和清除
- 在拥塞队列上等待.
强制回写
膝上模式
用于同步控制的系统调用
完全同步
- inode的同步
- 单个文件的同步
- 内存映射的同步
页面回收和页交换
概述
- 可换出页
- 页顛簸
- 页交换算法
Linux内核中的页面回收和页交换
- 交换区的组织
- 检查内存使用情况
- 选择要换出的页
- 处理缺页异常
- 减缩内核缓存
管理交换区
- 数据结构
- 创建交换区
- 激活交换区
交换缓存
- 标识换出页
- 交换缓存的结构
- 添加新页.
- 搜索一页
数据回写
页面回收
- 概述
- 数据结构
- 确定页的活动程度
- 收缩内存域
- 隔离LRU页和集 中回收
- 收缩活动页链表
- 回收不活动页
交换令牌
处理交换缺页异常
- 换入页
- 读取数据
- 交换预读
发起内存回收
- kswap d进行周期性内存回收
- 在严重内存不足时换出页
收缩其他缓存
- 数据结构
- 注册和删除收缩器
- 收缩缓存
审计
审计规则
实现
- 数据结构
- 初始化
- 处理请求
- 记录事件
- 系统调用审计
推荐书籍
《Linux内核设计与实现》
《深入理解Linux内核》
《深入Linux内核架构》
《Linux内核完全剖析》
《Linux内核源代码情景分析》
如果是自学的话,会比较困难,这里推荐一位大佬的免费课程,这个跟以往所见到的只会空谈理论的有所不同,正在学习的朋友可以体验一下
https://ke.qq.com/course/417774?flowToken=1031343
另外Linux、C/C++技术交流群:【960994558】整理了一些个人觉得比较好的学习书籍、大厂面试题、和热门技术教学视频资料共享在里面(包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等等.),有需要的可以自行添加哦!~