u-boot 学习笔记
u-boot 学习笔记 u-boot分类 1.1. api 1.1.1. api.md 1.2. arch 1.2.1. arm 1.2.1.1. arm.md 1.2.1.2. assembly.md 1.2.2. arch.md 1.3. boot 1.3.1. bootm.md 1.3.2. bootretry.md 1.3.3. bootz.md 1.3.4. image.md 1.4. cmd 1.4.1. cmd.md 1.5. common 1.5.1. autoboot.md 1.5.2. board.md 1.5.3. cli.md 1.5.4. command.md 1.5.5. console.md 1.5.6. dmalloc.md 1.5.7. event.md 1.5.8. export.md 1.5.9. log.md 1.5.10. main.md 1.6. dm 1.6.1. adc.md 1.6.2. button.md 1.6.3. clock.md 1.6.4. core.md 1.6.5. dts.md 1....
RT-Thread 学习笔记
RT-Thread 学习笔记 其他资料 1.1. fatfs 1.1.1. fatfs.md 2. ARM指针寄存器.md 3. CAN驱动.md 4. completion.md 5. condvar.md 6. dataqueue.md 7. DFS.md 8. fal.md 9. fatfs.md 10. FINSH模块.md 11. I2C驱动.md 12. IDLE线程.md 13. IPC.md 14. littlefs.md 15. map文件分析.md 16. pipe.md 17. PM电源管理.md 18. readme.md 19. ringblock.md 20. ringbuffer.md 21. romfs.md 22. RTC.md 23. RT-LINK.md 24. RTT系统初始化.md 25. SDMMC.md 26. SIGNAL.md 27. SPI驱动.md 28. tmpfs.md 29. ULOG.md 30. USB.md 31. waitqueue.md 32. 串口驱动.md 33. 调度.md 34. 工作队列...
test
[TOC]
Linux内核kallsyms符号压缩的完整构建流程
@[toc] Linux内核kallsyms符号压缩的完整构建流程 1. 引言Linux内核的kallsyms机制是其自省(Introspection)和调试能力的核心基石。它允许内核在运行时将内存地址解析为可读的符号名称,这对于错误追踪(Oops messages)、性能分析和内核调试至关重要。然而,在一个现代内核中,符号数量可达数十万之多,直接以字符串形式存储将消耗数兆字节的宝贵内存。 为了解决这一问题,内核构建系统采用了一套精巧的多趟链接(Multi-pass Linking)和符号压缩(Symbol Compression)流程。此流程由scripts/link-vmlinux.sh脚本调度,并使用一个专门的宿主工具scripts/kallsyms来执行核心的压缩算法。本文将完整地、分步骤地剖析这一流程,从构建脚本的宏观调度到压缩工具的微观算法实现。 2. 宏观调度:scripts/link-vmlinux.sh的多趟链接整个kallsyms数据的生成过程并非一次完成,而是通过一个迭代收敛的过程,以确保最终嵌入内核的符号地址是完全准确的。这个过程巧妙地解决了“测量行为...
Linux内核kallsyms符号压缩与解压机制
@[toc] Linux内核kallsyms符号压缩与解压机制 1. 引言:为何需要kallsyms?在Linux内核的运行过程中,当发生错误(Oops)、进行性能剖析(Profiling)或使用调试器(Debugger)时,系统需要将内存中的函数地址转换为人类可读的符号名称。例如,将地址0xffffffff810a43c0转换为printk。这个地址到符号的映射表就是kallsyms(Kernel All Symbols)。 然而,内核包含数以万计的符号,如果将所有符号名称作为原始字符串直接存储在内核镜像中,会占用数兆字节的宝贵内存。为了解决这个问题,内核在编译时采用了一种高效的**“查表压缩”**方案,将符号名称字符串压缩成紧凑的字节序列。本文将深入剖析这一压缩数据的结构以及内核在运行时如何对其进行解压,还原出原始的符号名称。 123456789101112graph TD subgraph "内核编译时" A["所有符号名称"] --> B("scripts/kallsyms"); ...
commoncap
[TOC] include/linux/security.h12345678910111213141516/** * @brief security_capable - 检查凭证是否拥有特定能力(LSM钩子包装)。 * @param cred 待检查的进程凭证。 * @param ns 目标资源所属的用户命名空间。 * @param cap 要检查的能力编号。 * @param opts 附加选项。 * @return 0 表示拥有能力,-EPERM 表示没有。 */static inline int security_capable(const struct cred *cred, struct user_namespace *ns, int cap, unsigned int opts){ // 这是一个内联包装函数,直接调用底层的能力检查核心函数。 return cap_capable(cred, ns, cap, opts);} security/commoncap.ccap_capa...
kallsyms
[TOC] kernel/kallsyms.ckallsyms_init: 内核符号表 /proc 接口创建本代码片段的核心功能是在 Linux 内核初始化期间,通过 /proc 虚拟文件系统,创建一个名为 kallsyms 的只读文件。这个文件(/proc/kallsyms)向用户空间提供了一个内核符号表的实时视图,其中包含了内核中所有非静态函数和全局变量的名称及其在内存中的地址。这是内核调试、性能分析(profiling)和动态追踪(tracing)等高级功能的基石。 实现原理分析该机制的实现完全建立在 Linux 的 /proc 文件系统框架之上,这是一种在内存中动态生成文件内容的机制。 Proc 文件注册 (proc_create): kallsyms_init 函数的核心是调用 proc_create。这个函数向 /proc 文件系统注册一个新的文件节点。 "kallsyms": 指定了在 /proc 根目录下创建的文件名。 0444: 定义了文件的访问权限为八进制的 0444,即对所有用户(属主、属组、其他)都只有读取权限。...
clockevents
[TOC] kernel/time/clockevents.cclockevents_switch_state - 设置时钟事件设备的运行状态123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475static int __clockevents_switch_state(struct clock_event_device *dev, enum clock_event_state state){ if (dev->features & CLOCK_EVT_FEAT_DUMMY) return 0; /* Transition with new state-specific callbacks */ switch (state) { case CLOCK_EVT_STATE_DETACH...