Linux中断处理流程图

sequenceDiagram participant caller as caller participant irq as irq.c participant irqdomain as irqdomain.c participant irqdesc as irqdesc.c participant bitmap as bitmap.c activate caller caller ->> irq: irq_of_parse_and_map activate irq Note right of irq: irq_of_parse_and_map irq ->> irq: of_irq_parse_one irq ->>...

printk的pr_fmt

1. printk 打印级别控制:/proc/sys/kernel/printk printk_index:/sys/kernel/debug/printk/index/ 2. pr_fmt和dev_fmt 在阅读Linux内核或其他开源代码时,在文件的开始部分,通常能看到类似如下代码。但是代码中又没有看到使用的地方。 1#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 2 3#include <...> 4#include <...> 其实pr_fmt是通常和大名鼎鼎的printk一起来合作实现其他宏,比较常见的就是pr_*()系列宏,另外一些模块或驱动中也会利用pr_fmt来输出日志信息。...

内存管理API汇总

1. 总览 如下为内核开发或驱动开发常见的内存管理API关系,其他如CMA分配器等相关API未列出。 1.1. 框架图 1.2. 函数图总览 2. memblock分配器 memblock分配器主要用于Linux启动时的内存分配,被memblock_alloc分配后未被释放的内存,不会被加入到页管理器中。 api param desc memblock_alloc size, align size表示要申请的大小,align表示内存对齐大小 3. 页分配器 页分配器相关的函数或宏在include/linux/gfp.h中声明。常用的函数如下: return api param unsigned long...

为什么要有idmap

要开启MMU,需要建立页表映射,而且需要处理缓存一致性的问题,这样内核启动的依赖条件就会变得复杂。为了降低启动代码的复杂度,约定在Linux内核启动时,MMU是关闭的。这样也就意味着不能利用高速缓存的性能。为了获得更好的性能,也为了后续可以给不同的地址空间设置不同的访问属性以更好地管理内存,需要在某个阶段把MMU打开,并使能高速缓存。 但是,在关闭MMU的情况下,处理器访问的是物理地址,而MMU打开时,处理器访问的地址变成了虚拟地址。现代处理器大多数是多级流水线架构,处理器会提前预取多条指令到流水线中。打开MMU只需要向SCTLR_ELx寄存器写入特定值即可,运行到此处时,处理器已经提前预取了多条指令,这些指令要操作的地址实际是物理...