![](https://img-blog.csdnimg.cn/20190918140037908.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Linux内核设计与实现(读书笔记)
文章平均质量分 84
Linux内核设计与实现
Hani_97
Stay hungry,stay foolish。
展开
-
Linux内核设计与实现(19)第十九章:可移植性
Linux内核设计与实现(19)第十九章:可移植性1. linux移植性非常好2. 字长 位2.1 字长2.2 位2.3 内核编码中字长准则3. 数据类型3.1. 不透明类型3.2. 长度确定的类型3.2.1 内核空间的长度确定的类型3.2.2 用户空间的长度确定的类型3.3 char 类型4. 数据对齐4.1. 通过指针转换类型时, 不要转换长度不一样的类型4.2. 对于数组, 按照基本数据类型进行对齐4.3. 对于联合体, 长度最大的数据对齐就可以了4.4. 对于结构体, 保证结构体中每个元素能够正确对原创 2021-08-20 15:07:08 · 206 阅读 · 0 评论 -
Linux内核设计与实现(18)第十八章:内核调试
Linux内核设计与实现(18)第十八章:内核调试1. 内核态调试难点1.1 KDB 调试1.2 解决:1.2.1 输出 LOG(printk)1.2.2 oops1.2.3 主动触发 bug1.2.3.1 panic1.2.4 神奇的系统请求键1.2.5 其他:gdb 和 kdb1. 内核态调试难点内核调试的难点在于它不能像用户态程序调试那样打断点,随时暂停查看各个变量的状态。也不能像用户态程序那样崩溃后迅速的重启,恢复初始状态。内核调试的难点大致有以下几个:1.重现bug困难 如果能够重现一原创 2021-08-20 13:50:13 · 151 阅读 · 0 评论 -
Linux内核设计与实现(17)第十七章:设备与模块
Linux内核设计与实现(17)第十七章:设备与模块1. 设备类型,内核模块,内核对象,sysfs2. 设备类型2.1 块设备,字符设备,网络设备2.1. 伪设备3. 内核模块3.1 动态加载:3.2 带参数的内核模块3.3 内核模块的位置3.4 内核模块相关操作4. 内核对象4.1 统一设备模型4.2 kobject 简介4.3 ktype4.4 kset4.5 kobject ktype 和 kset 之间的关系4.6 kref5. sysfs 虚拟文件系统5.1 定义:5.2 kobject 和 sy原创 2021-08-20 11:31:29 · 180 阅读 · 0 评论 -
Linux内核设计与实现(16)第十六章:页高速缓存和页回写
Linux内核设计与实现(16)第十六章:页高速缓存和页回写1. 缓存2. 写缓存常见的有3种策略(不缓存,写透缓存,回写)3. 缓存回收的策略4. 页高速缓存4.1 定义:4.2 大小:4.3 提高I/O性能,页高速缓存的条件4.4 实现5. 页回写5.1 回写线程 flusher5.2 触发回写的3种情况5.3 回写历史发展:5.3.1. 膝上型计算机模式5.3.2. bdflush 和 pdflush (2.6版本前 flusher 线程的实现方法)5.3.3. flusher 线程1. 缓存缓原创 2021-08-19 17:37:33 · 153 阅读 · 0 评论 -
Linux内核设计与实现(15)第十五章:进程地址空间
Linux内核设计与实现(15)第十五章:进程地址空间1. 虚拟地址空间2. 内存描述符 mm_struct2.1 内存描述符 mm_struct2.2 内核线程没有进程地址空间2.3 进程是用户进程还是内核线程3. 分配进程地址空间4. 虚拟内存区域(VMA)5. 地址空间和页表5.1 页表:5.2 3级页面(PGD PMD PTE)1. 虚拟地址空间定义:地址空间就是每个进程所能访问的内存地址范围,是一段连续的虚拟内存空间. 每个进程都有唯一的地址空间,彼此之间互不干扰 背景(为什么需要虚拟地原创 2021-08-19 16:56:16 · 110 阅读 · 0 评论 -
Linux内核设计与实现(14)第十四章:块I/O层
Linux内核设计与实现(14)第十四章:块I/O层1. 字符设备和块设备1.1 字符设备1.2 块设备1.3 字符设备和块设备的区别2. 块和扇区2.1 块2.2 扇区2.3 块和扇区:2.4 查看扇区和块大小:fdisk3. 内核访问块设备的方法3.1 块和内存页3.2 内核中有2种方法来管理块和内存页之间的映射。3.3 缓冲区和缓冲区头3.3.1 缓冲区头 buffer_head3.3.2 缓冲区头作用:3.3.3 缓冲区和缓冲区头的缺点3.4 bio3.4.1 bio 背景:3.4.2 bio 优点原创 2021-08-19 16:10:22 · 135 阅读 · 0 评论 -
Linux内核设计与实现(12)第十二章:内存管理
Linux内核设计与实现(12)第十二章:内存管理1. 页1.1 分页1.2 page 页内存消耗2. 区2.1 背景:2.2 区的作用:2.3 三个区3. 获取内存的方法3.1. 按页获取:最原始的方法,用于底层获取内存的方式3.1.1 GFP 标志3.2. 按字节获取:使用最多的方式(kmalloc()和vmalloc())3.2.1 kmalloc 和 vmalloc 区别在于:3.3 slab 层获取:效率最高的获取方法3.3.1 slab 背景:3.3.2 slab 层实现原理(内存池思想)3.3原创 2021-08-11 17:19:17 · 265 阅读 · 0 评论 -
Linux内核设计与实现(11)第十一章:定时器和时间管理
Linux内核设计与实现(11)第十一章:定时器和时间管理1. 内核对时间的使用概述:2. 系统时间2.1 实际时间2.2 定时器2.2.1 静态定时器2.2.2 动态定时器3. 基础概念大搜罗:HZ,节拍,jiffies,定时器中断,实时时钟3.1 HZ 赫兹3.2 节拍(tick)3.3 jiffies3.3.1 jiffies常用的一些运算3.3.2 回绕问题3.4 定时器中断:3.5 实时时钟4. 定时器执行流程4.1 伪代码实例5. 实现程序延迟的方法 schedule_timeout1. 内核原创 2021-08-11 15:18:00 · 165 阅读 · 0 评论 -
Linux内核设计与实现(10)第十章:内核同步方法
Linux内核设计与实现(10)第十章:内核同步方法1. 原子操作2. 自旋锁2.1 自旋锁2.2 自旋锁API2.3 自旋锁伪代码实现3. 信号量4. 互斥锁4.1 互斥体和信号量场景选择:4.2 互斥体和自旋锁场景选择:5. 完成变量(没用过)6. 大内核锁(已经弃用)7. 顺序锁(没用过)8. 禁止抢占9. 顺序和内存屏障9.1 内存屏障背景9.2 内存屏障例子说明9.3 详细参考:Linux RCU机制+内存屏障9.4 内存屏障API10. 总结1. 原子操作原子(atomic)本意是“不能被进原创 2021-08-11 11:13:41 · 262 阅读 · 0 评论 -
Linux内核设计与实现(9)第九章:内核同步介绍
Linux内核设计与实现(9)第九章:内核同步介绍1. 临界区,竞争条件,同步1.1 内核中造成并发的原因:2. 锁2.1 锁的种类:互斥锁,读写锁,自旋锁,递归锁2.2 死锁2.3.1 死锁定义2.3.2 常见死锁情形2.3.3 避免死锁:2.4 什么数据需要加锁3. 编写内核代码时,时时记着下面这些问题:1. 临界区,竞争条件,同步临界区:就是访问和操作共享数据的代码段。竞争条件: 多个执行线程处于同一个临界区。同步: 安排进程/线程执行的先后顺序就是同步目的:避免并发和防止竞争条件1.1原创 2021-08-10 19:21:46 · 178 阅读 · 0 评论 -
Linux内核设计与实现(7)第七章:中断处理
Linux内核设计与实现(7)第七章:中断处理1. 中断背景,定义;分类;上下部机制;中断号;中断上下文2. 中断相关函数2.1 注册中断的函数 request_irq2.2 释放中断的函数 free_irq2.3 中断处理程序的声明 intr_handler3. 中断处理机制3.1 中断处理流程图:4. 中断控制方法1. 中断背景,定义;分类;上下部机制;中断号;中断上下文详细参考之前的文章:Linux 中断https://blog.csdn.net/lqy971966/article/detai原创 2021-08-10 11:18:54 · 267 阅读 · 0 评论 -
Linux内核设计与实现(6)第六章:内核数据结构
Linux内核设计与实现(6)第六章:内核数据结构1.链表1.1 container_of 解释2. 队列3. 映射4. 红黑树1.链表内核中关于链表定义的代码位于: include/linux/list.hlinux内核中的链表使用方法和一般数据结构中定义的链表是有所不同的:linux的链表不是将用户数据保存在链表节点中,而是将链表节点保存在用户数据中。图:list1.1 container_of 解释功能是:实现了根据一个已知结构体首个成员的指针和首个成员的变量名得出宿主结构体的地址的功原创 2021-08-10 11:04:23 · 133 阅读 · 0 评论 -
Linux内核设计与实现(5)第五章:系统调用
Linux内核设计与实现(5)第五章:系统调用1. 系统调用1.1 定义1.2 作用(四个作用)1.3 用户程序,系统调用,内核,硬件设备的调用关系1.4 printf()函数调用过程1.5 系统调用命名2. Linux上的系统调用实现原理2.1 调用过程2.2.1 通知内核调用一个哪个系统调用2.2.2 用户程序把系统调用的参数传递给内核2.2.3 用户程序获取内核返回的系统调用返回值1. 系统调用1.1 定义系统调用就是用户程序和硬件设备之间的桥梁。用户程序在需要的时候,通过系统调用来使用硬件设原创 2021-08-09 16:58:13 · 220 阅读 · 0 评论 -
Linux内核设计与实现(4)第四章:进程的调度
Linux内核设计与实现(4)第四章:进程的调度1. 调度1.1 什么是调度1.1.1 调度是一个平衡的过程1.2 进程调度程序1.3 调度策略(cpu密集型和IO密集型)2. 进程的优先级2.1 动态优先级的调度算法2.2 两种度量方法:nice值和实时优先级3.时间片3.1 默认时间片(10/20ms)4. 完全公平调度算法 CFS4.1 通俗说:4.2 定义:4.3 CFS nice 值变化:4.4 进程抢占时机:4.5 时间记账:4.5.1 struct sched_entity 与 task_st原创 2021-08-09 15:44:03 · 465 阅读 · 0 评论 -
Linux内核设计与实现(3)第三章:进程管理
Linux内核设计与实现(3)第三章:进程管理1.进程是资源封装的单位进程封装的资源包括:内存、文件、文件系统、信号、控制台,寄存器堆栈等。一个进程区别于另外一个进程的标记就是占有的资源完全不一样。2.进程提供两种虚拟机制:虚拟处理器和虚拟内存这两种虚拟给进程造成一个假象——只有自己独享处理器以及独享真个内存资源。有趣的是,同一进程中的线程可以共享虚拟内存,但每个都拥有各自的虚拟处理器。虚拟处理器 ???3.僵尸进程 & 孤儿进程进程退出执行后被设置为僵死状态,直到其父进程调用wa原创 2021-08-02 20:33:18 · 261 阅读 · 0 评论 -
Linux内核设计与实现(2)第二章:内核开发的准备
Linux内核设计与实现(2)第二章:内核开发的准备1.获取内核源码通过 http://www.kernel.org 获取2. 内核源码的结构一堆 搞个表 或者 截图3.likely unlikely 解释如果能事先判断一个if语句时经常为真还是经常为假,那么可以用unlikely和likely来优化这段判断的代码。看日常 详解4 没有内存保护因为内核是最低层的程序,所以如果内核访问的非法内存,那么整个系统都会挂掉...原创 2021-08-02 20:32:05 · 133 阅读 · 0 评论 -
Linux内核设计与实现(1)第一章:Linux内核简介
Linux内核设计与实现(1)第一章:Linux内核简介1.1969年产生unix ;1991年,Linus Torvalds推出linux;Linux是类Unix系统,但它不是Unix。尽管Linux借鉴了Unix的许多设计并且实现了Unix的API,但是Linux没有像其他Unix变种一样直接使用Unix的源代码。2.内核组成通常一个内核由负责响应中断的中断服务程序,负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间的内存管理程序,和网络、进程间通信等系统服务程序共同组成原创 2021-08-02 20:30:48 · 372 阅读 · 0 评论 -
Linux内核设计与实现(13)第十三章:虚拟文件系统
Linux内核(1):虚拟文件系统VFS1. VFS1.1 文件系统定义:1.2 VFS(虚拟文件系统)定义1.3 VFS在Linux系统中的架构视图2. VFS 虚拟文件系统2.1 例子说明 VFS2.1.1 Linux VFS支持的文件系统2.1.2 文件系统目录树(图)2.1.3 Ext2写数据流程例子3. VFS 统一文件模型(common file model)3.1 VFS如何对不同文件系统进行统一管理3.2 四种对象(超级快,目录项,索引节点,文件)3.2.1 四种对象1:super_blo原创 2021-07-28 17:21:15 · 290 阅读 · 0 评论