1. 内核栈 在每一个进程的生命周期中,必然会通过到系统调用陷入内核。在执行系统调用陷入内核之后,这些内核代码所使用的栈并不是原先进程用户空间中的栈,而是一个单独内核空间的栈,这个称作进程内核栈。 1.1. init_task init_task,也就是bootcpu的swapper进程对应的task_struct,其内核栈是静态初始化的。 1/// init/init_task.c 2/* 3 * Set up the first task table, touch at your own risk!. Base=0, 4 * limit=0x1fffff (=2MB) 5 */ 6struct task_struct...
1. 简介 Linux内核中的notifier_chain是一种用于跨模块通信的机制。当一个模块需要通知其他模块某些事件时,它可以使用notifier_chain将这些事件通知给其他模块。这种机制使得模块之间的耦合度降低,提高了代码的可维护性和可扩展性。 在Linux内核中,有四种类型的通知链: 原子通知链适用于对原子性要求高的中断上下文 阻塞通知链适用于进程上下文的复杂处理 原始通知链提供了最大的灵活性但需要谨慎使用 SRCU 通知链则在读写锁保护的场景中发挥作用 1/// include/linux/notifier.h 2/* 3 * Notifier chains are of four types: 4 * 5 *...
1. 编译选项 -fomit-frame-pointer表示在函数调用时不需要存储堆栈帧指针。此选项可减小生成的代码镜像大小, 一般在启用-On优化后会自动打开,也有的平台是默认打开的。 -fno-omit-frame-pointer表示将堆栈帧指针存储在寄存器中,帧指针是用来指示当前函数的栈帧(stack frame)的指针,在调试时可以帮助跟踪函数调用的堆栈信息。 在 AArch32 架构中,堆栈帧指针存储在寄存器R11A32代码)或寄存器R7T32代码)中. 在AArch64架构中,堆栈帧指针存储在寄存器X29中。作为帧指针使用的寄存器不能用作通用寄存器,但如果使用 -fomit-frame-pointer选项编译,则可用作...
1. 后缀说明 acquire操作指的是在这条语句之后的所有内存操作只准在这条语句之后,不准被提前到这条语句之前。 release操作指的是在这条语句之前的所有内存操作只准在这条语句之前,不准被延后到这条语句之后。 relaxed操作指的是不保证任何的内存顺序。 2. 读写 1atomic_read(const atomic_t *v) 2atomic_read_acquire(const atomic_t *v) 3 4atomic_set(atomic_t *v, int i) 5atomic_set_release(atomic_t *v, int i) col1 col2 (const atomic_t *v)...
ARM64汇编宏:adr_l
1. 说明 根据内核文档整理而成,具体格式含义可查看内核文档,或点击如何获得正确的printk格式占位符(v6.6)或如何获得正确的printk格式占位符(latest)查看。 linux-6.6相关内核文档路径如下: Documentation/core-api/printk-formats.rst Documentation/translations/zh_CN/core-api/printk-formats.rst 2. 整数类型 内核的printk不支持%n,也不支持浮点格式(%e / %f / %g / %a)。在printk中使用任何不支持的占位符或长度限定符都会导致一个WARN并且终止vsnprintf()执行。注...
ERR_PTR、PTR_ERR
1. 打开dynamic_debug 1CONFIG_DYNAMIC_DEBUG=y 运行时控制:/proc/dynamic_debug/control,如果开启了CONFIG_DEBUG_FS,在<debugfs>/dynamic_debug/control,两者效果是相同的。 2. 使用dynamic_debug 可以使用pr_debug或者dev_dbg来打印调试信息。 1#define pr_fmt(fmt) fmt 2 3#include <linux/kernel.h> 4#include <linux/init.h> 5#include <linux/module.h> 6 7static int __init...
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来输出日志信息。...