Jan 19, 2024
本文阅读量次【一文秒懂】Linux内核调试工具——devmem # 1、介绍 # 我们在底层开发过程中,经常需要在终端查看或者修改设备寄存器的值,有这样一个工具—-devmem,可用于读取或者修改物理寄存器的值,非常方便!
简而言之,devmem就是在Linux命令行模式下,直接操作我们设备寄存器的值!
2、如何使用 # 2.1 配置devmem # 进入menuconfig选项中,按下/搜索关键词即可!
2.2、使用devmem # 进入Linux后,输入devmem -h查看帮助信息即可!
Usage: devmem ADDRESS [WIDTH [VALUE]] Read/write from physical address ADDRESS Address to act upon WIDTH Width (8/16/...) VALUE Data to be written []内部为可选内容,比较简单,这里直接上使用代码!
读物理内存 devmem 0x10000000 #读指定的物理内存值 devmem 0x10000000 16 #读16bit物理内存的值 写物理内存 devmem 0x10000000 32 0x00000000 #以32bit写入给定的值到指定物理内存 devmem 0x10000000 8 0x010 #以8bit写入给定的值到指定物理内存 欢迎关注【嵌入式艺术】,董哥原创!
Dec 13, 2023
本文阅读量次【一文秒懂】Ftrace系统调试工具使用终极指南 # 1、Ftrace是什么 # Ftrace是Function Trace的简写,由 Steven Rostedt 开发的,从 2008 年发布的内核 2.6.27 中开始就内置了。
Ftrace是一个系统内部提供的追踪工具,旨在帮助内核设计和开发人员去追踪系统内部的函数调用流程。
随着Ftrace的不断完善,除了追踪函数调用流程外,还可以用来调试和分析系统的延迟和性能问题,并发展成为一个追踪类调试工具的框架。
除了Ftrace外,追踪类调试工具还包括:
2、Ftrace的实现原理 # 为了帮助我们更好的使用Ftrace,我们有必要简单了解Ftrace的实现原理。
2.1 Ftrace框架图 # Ftrace的框架图如下:
由框架图我们可以知道:
ftrace包括多种类型的tracers,每个tracer完成不同的功能 将这些不同类型的tracers注册进入ftrace framework 各类tracers收集不同的信息,并放入到Ring buffer缓冲区以供调用。 2.2 Ftrace是如何记录信息的 # Ftrace采用了静态插桩和动态插桩两种方式来实现。
静态插桩:
我们在Kernel中打开了CONFIG_FUNCTION_TRACER功能后,会增加一个-pg的一个编译选项,这个编译选项的作用就是为每个函数入口处,都会插入bl mcount跳转指令,使得每个函数运行时都会进入mcount函数。
Ftrace一旦使能,对kernel中所有的函数插桩,这带来的性能开销是惊人的,有可能导致人们弃用Ftrace功能。
为了解决这个问题,开发者推出了Dynamic ftrace,以此来优化整体的性能。
动态插桩:
这里的动态,是指的动态修改函数指令。
编译时,记录所有被添加跳转指令的函数,这里表示所有支持追踪的函数。 内核将所有跳转指令替换为nop指令,以实现非调试状态性能零损失。 根据 function tracer 设置,动态将被调试函数的nop指令,替换为跳转指令,以实现追踪。 总而言之,Ftrace记录数据可以总结为以下几个步骤:
打开编译选项-pg,为每个函数都增加跳转指令 记录这些可追踪的函数,并为了减少性能消耗,将跳转函数替换为nop指令 通过flag标志位来动态管理,将需要追踪的函数预留的nop指令替换回追踪指令,记录调试信息。 3、如何使用Ftrace # 3.1 配置详解 # CONFIG_FTRACE=y # 启用了 Ftrace CONFIG_FUNCTION_TRACER=y # 启用函数级别的追踪器 CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y # 表示内核支持图形显示 CONFIG_FUNCTION_GRAPH_TRACER=y # 以图形的方式显示函数追踪过程 CONFIG_STACK_TRACER=y # 启用堆栈追踪器,用于跟踪内核函数调用的堆栈信息。 CONFIG_DYNAMIC_FTRACE=y # 启用动态 Ftrace,允许在运行时启用和禁用 Ftrace 功能。 CONFIG_HAVE_FTRACE_NMI_ENTER=y # 表示内核支持非屏蔽中断(NMI)时进入 Ftrace 的功能 CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y # 表示内核支持通过 mcount 记录函数调用关系。 CONFIG_FTRACE_NMI_ENTER=y # 表示内核支持通过 mcount 记录函数调用关系。 CONFIG_FTRACE_SYSCALLS=y # 系统调用的追踪 CONFIG_FTRACE_MCOUNT_RECORD=y # 启用 mcount 记录函数调用关系。 CONFIG_SCHED_TRACER=y # 支持调度追踪 CONFIG_FUNCTION_PROFILER=y # 启用函数分析器,主要用于记录函数的执行时间和调用次数 CONFIG_DEBUG_FS=y # 启用 Debug 文件系统支持 上面只是介绍了部分配置,更多详细配置可自行了解。
...
Jan 17, 2024
本文阅读量次【一文秒懂】TOP命令详解 # 1、Top命令介绍 # Linux系统中,Top命令主要用于实时运行系统的监控,包括Linux内核管理的进程或者线程的资源占用情况。
这个命令对所有正在运行的进程和系统负荷提供不断更新的概览信息,包括系统负载、CPU利用分布情况、内存使用、每个进程的内容使用情况等信息。
2、Top命令使用 # Top的命令介绍如下:
top -hv|-bcHiOSs -d secs -n max -u|U user -p pid -o fld -w [cols] 常用的Top指令有:
top:启动top命令 top -c:显示完整的命令行 top -b:以批处理模式显示程序信息 top -S:以累积模式显示程序信息 top -n 2:表示更新两次后终止更新显示 top -d 3:设置信息更新周期为3秒 top -p 139:显示进程号为139的进程信息,CPU、内存占用率等 top -n 10:显示更新十次后退出 除此之外,在top进程运行过程中,两个最重要的功能是查看帮助(h 或 ?)和退出(q 或 Ctrl+C)。
3、Top信息详解 # top展示界面由从上到下3部分组成
概览区域 表头 任务区域 还有一个输入/消息行,位于概览区域和表头之间。 3.1 概览区详解 # top - 14:46:08 up 5:46, 1 user, load average: 0.00, 0.00, 0.
...
Jan 19, 2024
本文阅读量次【一文秒懂】Linux内核调试工具——Debugfs # 1、介绍 # Debugfs其存在的主要意义是为了内核开发者向用户空间传递更多有用的信息,与proc不同,proc只提供进程相关的信息;同时也与sysfs不同,sysfs对每个文件都要求一定的规则,而Debugfs没有任何的规则。
简而言之,Debugfs是一种用于内核调试的虚拟文件系统。
2、如何调试 # 2.1 配置Debugfs # 进去menuconfig选项中,按下/搜索CONFIG_DEBUG_FS关键词即可!
当然,可以看Location在内核中的位置。
2.2 挂载Debugfs # mount -t debugfs none /sys/kernel/debug #挂载 mount #查看挂载情况 ___ none on /sys/kernel/debug type debugfs (rw,relatime) 2.3 GPIO调试 # cat gpio gpio-43 ( |wakeup ) in lo IRQ gpio-64 ( |cd ) in lo IRQ 上述只是简单的调试GPIO的方法,而Debugfs功能远不止于此,其提供了一些API接口,方便我们在内核中Debug使用。
而我们要做的,就是在我们想要进行Debug的地方,注册debugfs接口,然后查看我们要调试的信息。
2.4 GPIO的实现 # 文件kernel\drivers\gpio\gpiolib.c中
`static const struct file_operations gpiolib_operations = { .owner = THIS_MODULE, .open = gpiolib_open, .
...