![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
深入理解Linux内核
文章平均质量分 77
工作中经常会遇到一些问题,需要阅读内核源代码。
因此打算做一个内核源码走读的专栏,方便自己快速找到以前整理过的资料。也希望能给其他驱动工程师提供一些学习上的帮助~
Evan_ZGYF丶
我在起点
展开
-
【内存管理】进程的虚拟地址和内核中的虚拟地址有什么关系?
那么到底什么是虚拟内存地址 ?Linux 内核为啥要引入虚拟内存而不直接使用物理内存 ?虚拟内存空间到底长啥样?内核如何管理虚拟内存?什么又是物理内存地址 ?如何访问物理内存?本文笔者就来为大家详细一一解答上述几个问题,让我们马上开始吧~~~~转载 2023-10-18 23:09:52 · 212 阅读 · 0 评论 -
【内存管理】虚拟内存、物理内存之间的关系
本文介绍了什么是虚拟内存、什么是物理内存,虚拟内存与物理内存之间的关系,以及为何需要虚拟内存的原因原创 2023-10-18 14:53:24 · 1209 阅读 · 0 评论 -
【编码规范】Linux 内核编码风格
目录重点速读:1) 缩进2) 把长的行和字符串打散3) 大括号和空格的放置3.1) 大括号3.2) 空格4) 命名5) typedef6) 函数7) 集中的函数退出途径8) 注释9) 你已经把事情弄糟了10) Kconfig 配置文件11) 数据结构12) 宏、枚举和 RTL13) 打印内核消息14) 分配内存15) 内联弊病16) 函数返回值及命名17) 使用布尔18) 不要重新发明内核宏19) 编辑器模式行(配置信.翻译 2022-04-25 14:55:32 · 1681 阅读 · 0 评论 -
【SPI】SPI学习之SPI调试相关
spi调试方法uboot下调试SPI在uboot下,有spi的调试命令“sspi”,代码在:uboot/cmd/spi.c具体用法如下:原创 2021-05-29 17:59:11 · 4953 阅读 · 5 评论 -
【SPI】SPI学习之SPI驱动相关
spi驱动框架目录:linux/driver/spi/<从设备驱动层> spidev.c 自己编写<核 心 层> spi.c 内核提供<控 制 器 层> spi-xxx.c(瑞芯微:spi-rockchip.c 全志:spi-sunxi.c) 原厂提供...原创 2021-05-29 17:52:53 · 2683 阅读 · 1 评论 -
【SPI】SPI学习之SPI硬件相关
参考:文档:linux spi驱动开发学习(一)-----spi子系统架构http://blog.chinaunix.net/uid-21501855-id-5211900.html参考:文档:SPI通信简介https://blog.csdn.net/firefly_cjd/article/details/51935079#t17什么是spi?spi的作用?SPI硬件知识SPI外部信号描述SPI硬件寄存器映射SPI特性SPI相位和极性CPOL和CP...原创 2021-05-29 17:34:21 · 3166 阅读 · 3 评论 -
【中断】自己写一个中断处理程序,需要注意哪些问题?
Linux中断知识汇总:【深入理解Linux内核】【中断】内容汇总帖目录什么是中断处理程序?注册中断处理程序编写中断处理程序编写中断处理程序的注意事项为什么在中断里不可以睡眠?为什么在中断里不可以使用耗时很长的函数?什么是中断处理程序?中断处理程序:在响应一个特定中断的时候,内核会执行一个函数,该函数叫做中断处理程序。产生中断的每一个设备都有一个相应的中断处理程序。中断处理程序是被内核调用来响应中断的,他们运行于中断上下文中,该上下文中的代码不可阻塞。我们一.原创 2021-04-28 22:19:26 · 5987 阅读 · 3 评论 -
【中断】发生硬件中断后,ARM处理器做了那些事情?
发生硬件中断后,ARM处理器做了那些事情?CPU自动保存处理器状态,即将中断发生时的CPSR寄存器内容保存到SPSR_irq寄存器中 CPU自动设置当前程序状态寄存器CPSR的低5位,使处理器进入特权模式中的IRQ模式(Linux不使用FIQ,只使用IRQ) 硬件自动关闭IRQ中断 将返回地址(PC)自动保存到LR_irq寄存器中 CPU自动的将程序计数器PC设置成异常中断向量表中的地址,进入相应的异常处理程序中处理中断 处理完中断后,恢复中断发生前的处理器状态,即将SPSR_irq寄存器中原创 2021-04-24 22:00:23 · 1870 阅读 · 2 评论 -
【中断】你对中断究竟有多了解?试着把中断的触发流程整理了一遍...
如果要你讲一下中断,你会怎么去描述一个中断的触发流程呢?最基础的可能就是:保护现场 - 中断处理 - 恢复现场...那保护现场做了什么事情?中断处理需要注意什么事情?恢复现场又做了什么事情?相对应的,关于中断,还有很多这样的问题:触发中断的因素有哪些? 各中断源如何向CPU提出中断请求? CPU如何区分是哪个中断触发的请求? 当多个中断源同时提出中断请求时,中断系统如何确定优先响应哪个中断请求? CPU在什么条件、什么时候、以什么方式来响应中断?..原创 2021-04-24 16:38:09 · 8491 阅读 · 5 评论 -
【深入理解Linux内核】EXPORT_SYMBOL宏解析
内核版本:5.10.0相关头文件:include/linux/export.h#include <linux/export.h>宏定义:#define EXPORT_SYMBOL(sym) _EXPORT_SYMBOL(sym, "")#define EXPORT_SYMBOL_GPL(sym) _EXPORT_SYMBOL(sym, "_gpl")#define EXPORT_SYMBOL_GPL_FUTURE(sym) _EXPORT_SYMBOL(s.原创 2021-04-15 10:56:35 · 1943 阅读 · 0 评论 -
【深入理解Linux内核】函数源码解析模板
当做是一篇“水”文吧。主要写一个模板,以后不熟悉的函数源码,都按照这个模板去填充。方便自己,方便他人。Ps:对于一些其他人都已经解析的非常完美的函数,会直接转载。系统版本:相关头文件:函数定义:函数功能描述:输入参数说明:返回参数说明:实例解析:...原创 2021-04-14 15:53:13 · 159 阅读 · 0 评论 -
【workqueue】flush_work函数解析
内核版本:5.10.0flush_work函数flush_work函数的功能是等待当前的工作队列执行完毕。返回true代表等待的工作队列已执行完毕; 返回false代表工作队列已经是空闲状态。static bool __flush_work(struct work_struct *work, bool from_cancel){ struct wq_barrier barr; if (WARN_ON(!wq_online)) return false; if (WARN.原创 2021-04-14 15:43:43 · 4331 阅读 · 0 评论 -
【中断】中断上下文、进程上下文
Linux中断知识汇总:【深入理解Linux内核】【中断】内容汇总帖目录中断上下文和进程上下文什么是中断上下文?什么是进程上下文?为什么要进行不同之间状态的切换?什么情况下进行用户态到内核态的切换?中断上下文代码中注意事项中断上下文和进程上下文进程上下文和中断上下文是操作系统中很重要的两个概念,这两个概念在操作系统课程中不断被提及,是最经常接触、看上去很懂但又说不清楚到底怎么回事的两个概念。造成这种局面的原因,可能是原来接触到的操作系统课程的教学总停留在一种浅层次.原创 2021-03-29 22:16:37 · 3461 阅读 · 1 评论 -
【深入理解Linux内核】【中断】内容汇总帖
这篇文章的主要目的,就是想把所有自己以前写的中断汇总下,形成一套知识体系。方便查找问题。【中断】软中断、tasklet和任务队列原创 2021-03-29 22:14:01 · 742 阅读 · 3 评论 -
【中断】软中断、tasklet和任务队列
Linux中断知识汇总:xxxx目录中断下半部实现机制什么是软中断?什么是tasklet?什么是工作队列?软中断、tasklet和工作队列的区别与联系软中断:tasklet:工作队列:如何选择合适的下半部机制?中断下半部实现机制为了让中断处理运行的快,同时要完成相应的全部工作。根据具体的内容将中断分为两个部分:上半部分(中断处理程序)和下半部分(推后处理程序)。上半部分需要立即执行,并且有严格的时间限制,这些工作是在所有中断被禁止的情况下完成的,剩余部.原创 2021-03-29 21:59:16 · 1502 阅读 · 1 评论 -
【Makefile】Makefile 中 LINUXINCLUDE 的作用
背景知识在驱动开发的时候,我们经常会创建很多新的头文件,这些头文件大多以#include"xxx.h"的形式放在源码中。而内核头文件则是以#include <xxx.h>的形式存在。#include"xxx.h"、#include <xxx.h>这两者的区别:前者(使用""),来引用xxx.h文件,是首先检索文件的当前路径;如果没有,再检索标准路径,看看这些文件夹下是否有该头文件。 后者(使用<>),来引用xxx.h文件,是首先检索标准路径,看看这些文原创 2021-01-27 15:47:28 · 898 阅读 · 1 评论 -
【proc】使用proc_create_data函数在proc下创建节点
前情提要:移植代码的时候遇到create_proc_read_entry函数,新的内核里已经没有这个函数了,只能找对应的替换。proc_create_data函数就是可以替换掉它,本文主要讲解下如何使用proc_create_data,以及相关的参数配置。proc_create_data函数函数定义在“linux/proc_fs.h”头文件中extern struct proc_dir_entry *proc_create_data(const char *, umode_t,.原创 2021-01-27 11:31:07 · 8487 阅读 · 2 评论 -
【USB总线】usb-skeleton驱动分析
usb-skeleton应该算是最简单的一个USB驱动了,它提供了USB驱动必备的一些操作,供需要进行USB开发的人员参考。本文主要是对usb-skeleton进行分析,记录一些重要的通用的USB驱动函数,旨在后续进行USB开发的时候,能快速理解上手。module_usb_driver函数module_usb_driver函数,实际上就干了一件事:向内核注册xxx_driver驱动。即bus、device、driver三者之间的关系,USB设备是支持热插拔的,当检测到USB设备插入,(.原创 2020-11-10 11:01:28 · 673 阅读 · 1 评论 -
【内存管理】【slab】/sys/kernel/slab/<slab name>/trace解析
目录什么是/sys/kernel/slab//trace?/sys/kernel/slab//trace的作用/sys/kernel/slab//trace使用方法什么是/sys/kernel/slab/<slab name>/trace?首先是看下官方文档里的相关介绍:https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-kernel-slabWhat: /sys/kernel/slab/cache原创 2021-01-20 16:05:27 · 2248 阅读 · 2 评论 -
linux在系统调用进入内核时,为什么要将参数从用户空间拷贝到内核空间?不能直接访问,或是使用memcpy吗?非要使用copy_from_user才行吗?
参考:Linux为什么一定要copy_from_user ?网上很多人提问为什么一定要copy_from_user,也有人解答。比如百度一下:但是这里面很多的解答没有回答到点子上,不能真正回答这个问题。我决定写篇文章正式回答一下这个问题,消除读者的各种疑虑。这个问题,我认为需要从2个层面回答 第一个层次是为什么要拷贝,可不可以不拷贝? 第二个层次是为什么要用copy_from_user而不是直接memcpy 为什么要拷贝拷贝这个事情是必须的,这个事情甚至都跟Lin.转载 2021-01-10 14:27:26 · 2361 阅读 · 0 评论 -
【同步与并发】自旋锁、信号量
首先讲应用场景:当某一个执行单元在使用一块共享资源时,是不能被打断的,否则会造成共享资源内的数据被另一个执行单元改变,造成无法预知的错误。为了预防以上可能产生的情景,就需要对这一块共享资源做保护措施。 保护共享资源的方式有很多,例如:中断屏蔽、自旋锁、信号量... 保护共享资源的互斥机制--中断屏蔽:通过local_irq_disable(禁止中断操作)/local_irq_s...原创 2018-05-24 13:21:24 · 820 阅读 · 1 评论 -
【PCIe】PCIe Multicast组播功能实现
参考:《PCIe-Multicast(组播)实现》PCIe组播概念传统 PCIe系统局限于单目标传送 ,这种传输模式以主机为中心 ,使得主机在给定的时间,在某一时刻主机只能与众多子设备中的一个进行通讯 。现在越来越多的应用需要同时向多个子设备发送数据,也许主机也不只是一个,甚至一个子设备也需要向主机向其他子设备发送数据 ,PCIE multicast应运而生。组播是指同...原创 2020-03-19 14:42:46 · 2947 阅读 · 3 评论 -
【PCIe】非常适合初学的pcie博客(PCIe知识整理)
非常适合初学的pcie博客:PCIE扫盲(第一阶段):http://blog.chinaaet.com/justlxy/p/5100053251PCIe简介:http://blog.chinaaet.com/justlxy/p/5100053066 这一章主要介绍PCIe的由来,在2001年的时候被提出,命名“PCI-Express”,主要优势就是传输速率高,另外还有传输距...原创 2018-07-30 10:55:16 · 18917 阅读 · 9 评论 -
【内核同步机制】深入理解Linux内核 -- completion机制
completion 机制在linux内核中,引入锁机制主要是解决资源并发与竞争问题;主要常用锁机制:信号量,自旋锁,互斥锁;该篇文章主要讲解的是completion信号量。completion信号量:completion信号量是一个轻量级的机制,它允许一个线程告诉另一个线程某个工作已经做完了;completion 关键结构completion 结构struct completion { unsigned int done; struct swait_queue_head wait;}原创 2020-12-17 22:32:29 · 3243 阅读 · 2 评论 -
【GCC系列】深入理解Linux内核 -- __no_sanitize_address宏定义
__no_sanitize_address宏的含义就是用于通知编译器,当使用编译器编译时,不应在函数中检测内存访问-fsanitize = address 选项。__attribute__((no_sanitize_address))是gcc编译器支持的一个编译特性,用于通知编译器,当使用编译器编译时,不应在函数中检测内存访问-fsanitize = address 选项。|关键字:Linux,内核,源码,kernel,source,code,__no_sanitize_address,关键原创 2020-12-17 15:32:17 · 3167 阅读 · 1 评论 -
【GCC系列】深入理解Linux内核 -- __attribute__属性
GNU C 的一大特色就是__attribute__ 机制。__attribute 其实是个编译器指令,告诉编译器声明的特性,或者让编译器进行更多的错误检查和高级优化。|关键字:Linux,内核,源码,kernel,source,code,__attribute__,关键字,解析,分析,详解,含义,使用,原创 2020-12-17 15:29:01 · 777 阅读 · 1 评论 -
【GCC系列】深入理解Linux内核 -- __init宏定义
本文使用的Linux源码内核版本:Linux 5.10.0__init宏定义在Linux的内核源码里,尤其是一些关键的内核函数,会包含__init宏,它是用来做什么的呢?asmlinkage __visible void __init __no_sanitize_address start_kernel(void)那么,它的作用是什么?先去找下宏定义:【include/linux/init.h】#define __init __section(".init.text") __cold __l原创 2020-12-17 13:31:52 · 2466 阅读 · 1 评论 -
【GCC系列】深入理解Linux内核 -- __visible宏定义
__visible宏定义在Linux的内核源码里,尤其是一些关键的内核函数,会包含__visible宏,它是用来做什么的呢?asmlinkage __visible void __init __no_sanitize_address start_kernel(void)那么,它的作用是什么?先去找下宏定义(估计又是和编译器相关,而且会分不同架构去定义):【include/linux/complier_attributes.h】/* gcc: https://gcc.gnu.org/online原创 2020-12-17 10:34:41 · 2450 阅读 · 1 评论 -
【GCC系列】深入理解Linux内核 -- asmlinkage 宏定义
本文使用的Linux源码内核版本:Linux 5.10.0相信大家在看linux的source code的时候,都会注意到asmlinkage这个宏,它是用来做什么的呢?asmlinkage宏定义:看下宏在哪里定义:代码中有好几处都定义了asmlinkage宏,如下:【include/linux/linkage.h】#ifndef asmlinkage#define asmlinkage CPP_ASMLINKAGE#endif【arch/x86/include/asm/linkage原创 2020-12-16 17:24:31 · 1913 阅读 · 1 评论