陌上花开缓缓归以
无
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
linux内存小型化分析
cat /proc/meminfo,只启动内核相关的ko文件,也就是初始化startbsp相关的脚本,统计start kernel到内核加载完之后的(编译进内核模块)内存,以及编译成ko模块加载后的内存,加载完后统计加起来的内存就是内核模块使用的全部内存。可以先确认那些内核功能可以裁剪,裁剪后保证系统功能正常使用,并且查看裁剪前后内存对比情况,主要裁剪内核宏和设备树相关的一些配置,裁剪后通过查看proc/meminfo查看内存使用情况。b,设备树相关配置修改,里面有一些功能可以关闭,比如CMA。原创 2025-07-22 00:20:19 · 187 阅读 · 0 评论 -
linux看门狗重启定位思路总结
查看日志查看是否有RCU install或者deadlock相关打印,如果有的话可以考虑使用lockdep死锁检测工具。根据perf火焰图或者perf top(-g)分析任务的cpu占用情况,分析cpu占用高的任务或者相关进程或者ko。查看中断,抓中断打印,可以查看/proc/softirqs和/proc/interrupts下面的打印信息。如果怀疑中断被异常关闭,首先可以写一个模拟中断关闭的ko场景,查看是否与现场场景一致。接串口查看系统启动中卡住的地方,结合串口打印分析异常点。(5)看门狗任务异常。原创 2025-07-19 18:43:58 · 64 阅读 · 0 评论 -
linux 数据翻转导致系统卡死问题定位分析
本文介绍了Linux内核中死锁模拟的实现与分析。第一部分展示了两种死锁模拟方法:通过高负载循环导致系统卡死,以及通过错误配置定时器引发永久阻塞。第二部分重点分析了time_after宏的缺陷,指出在jiffies接近MAX_JIFFIES时可能因数据翻转导致判断失效,并提出了优化方案,改用64位整数比较以避免回绕问题。整个实验涉及内核线程创建、CPU绑定、定时器管理和看门狗机制等关键技术,有助于理解系统死锁的成因和检测方法。原创 2025-07-13 11:57:46 · 156 阅读 · 0 评论 -
linux卡死问题模拟场景
摘要:本文展示了Linux内核态实时任务卡死问题的检测与恢复机制。通过实现两种内核模块(绑定CPU和未绑定CPU版本),利用看门狗定时器检测任务超时(5秒阈值),自动重启卡死的任务。绑定CPU版本明确将任务固定在CPU0执行,而未绑定版本由调度器动态分配CPU。实验通过模拟阻塞触发看门狗机制,观察到任务成功重启并记录日志(如"Task hung detected! Restarting...")。该方案为实时系统提供了有效的任务监控和恢复手段,同时对比了不同CPU调度策略下的行为差异。原创 2025-07-13 10:51:08 · 59 阅读 · 0 评论 -
linux魔术字定位踩内存总结
1,当数据被踩时,也就是出现数据异常时,并且可以稳定复现时,我们确认时踩固定内存时,我们可以使用魔术字定位问题。2,当数据是逻辑上被改写时,数据加上魔术字时,数据扩展位不会被修改,此时我们正常查看代码逻辑定位即可。#define MAGIC_BYTE 0xAA // 定义魔术字(单字节)// 模拟内存踩踏(修改魔术字)// 检查魔术字是否被修改。原创 2025-07-01 23:07:38 · 199 阅读 · 0 评论 -
linux 用户态|内核态打印函数调用进程的pid
内核中,如果我有一个内核函数,并且我想知道哪个进程调用了它,我可以修改函数以记录current->pid。// 获取当前进程的 PID。#include <linux/sched.h> // 用于 current->pid。// 获取当前进程的 PID。#include <unistd.h> // 用于 getpid()举例查看malloc/free/sprintf等函数使用。2,内核态打印函数调用进程的pid。原创 2025-07-01 23:04:20 · 51 阅读 · 0 评论 -
linux alignment fault对齐造成设备挂死问题定位
本文分析了ARM架构中的alignment fault问题及其诊断方法。首先介绍了ESR_ELx寄存器在异常诊断中的作用,详细解析了EC、IL和ISS等关键字段的含义,并梳理了0x00-0x3C范围内各EC值对应的异常类型(如指令中止、数据中止、对齐错误等)。然后通过两个代码示例(char转int和void转结构体指针)演示了用户态和内核态alignment fault的具体触发场景,指出ARM架构要求int类型访问地址必须4字节对齐。最后建议在嵌入式开发中使用__attribute__((aligned(原创 2025-06-13 21:24:49 · 531 阅读 · 0 评论 -
rk3568 硬件断点看数据被踩(越界)问题
文章分析了Linux内核内存访问异常"Unable to handle kernel paging request",指出该错误通常由空指针、受限内存访问或非法用户空间访问引起。针对示例地址0xc6fef31e,初步判断为内核态内存踩踏错误。文章提供了两种调试方案:KASAN(适用于大内存)和硬件断点(适用于小内存),并详细介绍了硬件断点的配置方法和代码实现示例。最后建议使用addr2line或objdump工具定位故障指令0xc0088b8c对应的源代码位置。原创 2025-06-13 18:52:53 · 244 阅读 · 0 评论 -
linux用反汇编分析访问空指针问题
本文分析了Linux系统中空指针访问的反汇编特征及调试方法。主要内容包括:1) 通过gdb查看寄存器状态,当x1寄存器为空指针时显示0x0;2) 在无gdb环境下,可通过反汇编识别空指针特征指令如mov xn,#0、cbz跳转及ldr/str访问[0]等;3) 详细解析了ldr、str、mov等关键指令的用法;4) 通过实例演示空指针访问的反汇编代码,包括单级指针解引用崩溃和多级指针链式访问崩溃的场景。文章为分析空指针问题提供了实用的反汇编分析方法。原创 2025-06-13 18:52:18 · 371 阅读 · 0 评论 -
linux 错误码总结
在Linux系统中,当一个系统调用或库函数执行失败时,除了返回特定的错误值(如-1或NULL)外,还会通过。在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。Linux系统定义了一系列错误码宏,每个错误码对应一个特定的错误类型。的值在每次系统调用或函数调用失败时会被更新,而成功调用则可能不会修改。由操作系统维护,保存最近一次发生的错误信息。的值,确定具体发生了什么错误,并采取相应的处理措施。2,错误码与程序错误处理的关系。3,常见错误码及其含义。原创 2025-06-10 23:13:42 · 211 阅读 · 0 评论 -
linux 内存meminfo分析(内存水位线和内存回收机制分析)
Linux 提供了多个与虚拟内存管理相关的参数,这些参数可以通过 /proc/sys/vm/ 文件系统进行调整,从而影响内存回收行为,内存水位用于监控和管理系统的空闲内存,cat /proc/zoneinfo可查看内存水位线。原创 2025-06-08 08:26:59 · 633 阅读 · 0 评论 -
linux 用户态时间性能优化工具perf/strace/gdb/varlind/gprof
本文介绍了Linux环境下五种常用的程序性能分析工具:1)使用perf top分析CPU占用高的函数;2)通过gdb的info proc stat查看进程时间信息;3)利用strace的-tt和-c选项跟踪系统调用耗时;4)valgrind callgrind工具生成函数调用图;5)gprof统计函数调用次数和时间。这些工具分别从不同维度(CPU、系统调用、内存、函数调用等)帮助开发者定位性能瓶颈,其中perf适合分析CPU使用,strace专注系统调用,valgrind侧重内存分析,gprof提供函数级统原创 2025-06-07 14:52:24 · 671 阅读 · 0 评论 -
linux用户态内存泄露问题从进程角度跟踪举例
本文通过测试程序test_malloc演示了Linux系统下内存泄漏的检测方法。程序每2秒分配10KB内存并赋值,通过ps命令观察到进程的VSZ(虚拟内存)从2.5MB增长到20MB,RSS(物理内存)从0.5MB增长到19MB,同时系统MemFree值减少了约20MB。文章详细介绍了通过/proc/meminfo、/proc/pid/statm和/proc/pid/status等文件监控内存使用情况的方法,包括如何解读进程的虚拟内存、物理内存、共享内存等关键指标.原创 2025-05-31 18:26:12 · 904 阅读 · 0 评论 -
linux nm/objdump/readelf/addr2line命令详解
本文以rk3568开发板为例,详细介绍了如何利用nm、objdump、readelf和addr2line工具分析Linux内核文件、动态库及.o文件。主要内容包括:1)addr2line定位内核函数地址对应源码位置,强调编译时需保留调试信息;2)readelf查看符号表信息;3)objdump反汇编分析函数调用关系;4)nm工具解析符号类型。文章还系统总结了各工具的核心参数和适用场景,如objdump的-d反汇编参数、nm的-C解码C++符号功能等,并演示了交叉编译环境下工具链的使用方法,为开发者提供了全面原创 2025-05-31 18:09:16 · 1246 阅读 · 0 评论 -
gcc编译优化参数-O0和-Os区别
GCC编译器优化级别选择指南:-O0适合调试阶段(关闭优化保留调试信息),-Os针对嵌入式场景优先减小代码体积。-O2是推荐级别(平衡性能与风险),-O3激进优化可能提升10-15%性能但增大体积。优化路径建议:参数优化→组件裁剪→系统精简→二进制压缩。内存对齐优化(如64字节对齐)可避免伪共享问题,匹配现代CPU缓存行特性。典型优化流程包括编译参数调整(如CFLAGS="-Os")和后期符号剥离(strip命令)。原创 2025-05-25 17:02:50 · 790 阅读 · 0 评论 -
linux 内存碎片分析
本文分析了Linux系统内存管理的两个关键文件/proc/pagetypeinfo和/proc/zoneinfo的输出信息。/proc/pagetypeinfo显示了内存页面按迁移类型(不可移动、可移动、可回收等)和阶数(0-10)的分布情况,其中DMA32区域的可移动页块数量较多,而DMA区域则以不可移动页为主。/proc/zoneinfo则详细记录了各内存区域(DMA、DMA32)的状态,包括空闲页数、内存水位线、活动内存类型等,数据显示系统当前内存充足,但DMA32区域的slab不可回收内存较高,可能原创 2025-05-24 13:07:15 · 809 阅读 · 0 评论 -
linux taskset 查询或设置进程绑定CPU
本文介绍了Linux系统中CPU亲和性设置的方法。主要分为用户态和内核态两种方式:用户态可通过taskset工具或sched_setaffinity()函数绑定进程/线程到指定CPU核心,示例展示了查询CPU信息、修改进程亲和性等操作;内核态则需使用set_cpus_allowed_ptr()函数和cpumask操作。文章包含具体命令示例和代码片段,说明了如何将线程绑定到特定CPU核心,以及如何在内核模块中设置内核线程的CPU亲和性。原创 2025-05-24 12:05:34 · 572 阅读 · 0 评论 -
linux strace调式定位系统问题
strace是Linux系统调试工具,主要用于跟踪进程的系统调用和信号。其核心功能包括:监控系统调用(显示函数参数和返回值)、跟踪信号接收、分析调用耗时(-T/-tt参数)和统计调用次数(-c参数)。常用命令示例:跟踪指定函数(-e trace=function)、监控信号(-e trace=signal)、统计调用耗时(strace -T ls)以及输出调试信息(-d参数)。通过-p可附加到运行中的进程,-f可跟踪子进程。该工具能有效帮助开发者分析程序行为、定位性能瓶颈和调试异常问题。原创 2025-05-23 22:21:36 · 1121 阅读 · 0 评论 -
linux 内核warn_on/Bug_on
本文介绍了Linux内核中两种错误处理机制:warn_on()和bug_on()。warn_on()用于报告潜在问题,会打印警告信息和调用堆栈但允许继续执行;而bug_on()用于严重错误,会触发Oops并打印详细错误信息(包括调用堆栈),通常导致进程终止或系统崩溃。两者都通过条件判断触发,但处理方式不同:warn_on()记录警告后继续执行,bug_on()则终止执行并打印完整调试信息。文中通过代码示例展示了两种机制的具体使用场景和输出格式,并说明了如何通过串口、dmesg或系统日志获取这些调试信息。原创 2025-05-23 22:20:34 · 913 阅读 · 0 评论 -
linux hungtask detect机制分析
hungtaskdetect是Linux内核中用于检测长时间阻塞任务的机制,主要针对因死锁、死循环或资源竞争导致无法调度的任务。其核心目标是防止系统因单个任务阻塞而完全僵死,并提供诊断信息辅助排查问题。该机制通过内核线程khungtaskd定期扫描所有进程的task_struct结构体,检查任务是否处于TASK_UNINTERRUPTIBLE状态,并记录任务进入该状态的时间戳。若任务阻塞时长超过预设阈值(默认120秒),则触发警告并打印任务堆栈信息到内核日志。用户可以通过/proc/sys/kernel/下原创 2025-05-18 19:23:25 · 256 阅读 · 0 评论 -
linux oom panic重启代码跟踪
Linux系统在内存耗尽时会触发OOM(Out of Memory)Killer机制,通过终止进程释放内存。OOMKiller的行为可通过多个内核参数控制,如/proc/sys/vm/panic_on_oom决定是否触发系统崩溃,/proc/sys/vm/oom_kill_allocating_task决定是否直接杀死触发OOM的进程,/proc/<PID>/oom_score_adj调整进程的OOM优先级。OOMKiller根据进程的内存占用量、运行时间等计算oom_score,优先终止得分最高的进程。原创 2025-05-18 19:21:46 · 78 阅读 · 0 评论 -
linux perf top分析系统性能
本文介绍了在Linux系统中使用perf工具进行性能监控的步骤。首先,通过检查内核宏CONFIG_PERF_EVENTS和CONFIG_HAVE_PERF_EVENTS确认系统支持perf功能。在使用perf top时,若遇到权限问题,可以通过调整/proc/sys/kernel/perf_event_paranoid设置来解决。接着,安装调试符号表并更新系统,以确保perf能够正确解析符号。随后,使用perf top分析系统性能,识别CPU占用率较高的函数,并通过绑定CPU进一步细化分析。原创 2025-05-10 23:39:14 · 370 阅读 · 0 评论 -
linux kallsys
【代码】linux kallsys。原创 2025-04-22 18:45:25 · 109 阅读 · 0 评论 -
linux 内存踩踏导致的空指针问题分析纪要
最开始测试说这个问题是必现或者高概率复现的,我们查看日志看着空指针又没看出什么,后面我们自己想复现问题找到问题的触发条件,后面我们发现wifi测速时这个问题出现的概率比较高,但是后面我们加了一些打开符号表和其他的调试信息后发现问题问题出现的概率也不是很高,驱动专家们怀疑这个时候改了逻辑打开了符号表,可能踩到了其他的内存,这个时候我们只能通过测试场景去看问题了。和协议栈的专家确认以及查看协议栈的发包函数的实现以及发包的流程,发现该线程是可重入的,但是没有加锁,所以可能会有问题,所以我们试着把。原创 2025-04-13 00:07:11 · 1178 阅读 · 0 评论 -
Linux内核常见的调试方法总结
另外一种调试模块初始化函数的方法是:当插入内核模块时,内核模块机制将调用函数 sys_init_module(kernel/modle.c)执行对内核模块的初始化,该函数将调用所插入模块的初始化函数。在这 个优化级别之下,编译器要对内核中的某些代码的执行顺序进行改动,所以在调试时会出现程序运行与代码顺序不 一致的情况。当前使用的日志级别。虽然内核调试有一定的困难,但是通过 你的努力和理解,说不定你会喜欢上这样的挑战。由于内核模块中各段的地址是在模块加载进内核的时候才最终确定的,所以develop机的。原创 2025-03-09 14:43:12 · 459 阅读 · 0 评论 -
linux 内核dumpstack定位使用举例说明
当内核发生一个Oops(Out-Of-Scope Page)错误时,内核会自动输出调用栈信息。这通常发生在非法内存访问或其他严重错误情况下。:在内核代码中检测到错误或异常情况时,比如空指针解引用、越界访问等,可以在错误处理代码中调用。:当你在开发内核模块或内核代码时,遇到一个难以重现或理解的行为,你可以在代码中加入。我们这里只打印了堆栈,后面可以把PC指针和站指针一起打出来。1,在 Linux 内核中,当你需要定位问题时,来查看当前的调用栈,帮助你理解代码执行流程。查看代码可以看出空指针访问的异常。原创 2025-03-02 21:00:39 · 1299 阅读 · 0 评论 -
rk3568 sysrq如何使用快捷键
当系统卡顿或者卡死时,我们怎么定位,有时候会出现看门狗重启,那么没有看门狗重启时,怎么定位呢,我们如何使用。(2)查看/var/log/kern.log 和 /var/log/syslog。那么第二种方法使用securecrt/Mobaxterm怎么使用呢。为宏设置快捷键 Ctrl+Alt+Shift+B。1,找到MobaXterm.ini,添加下面的配置。: 要打印所有任务的堆栈信息,键盘上输入以下信息。打印dmesg : dmesg。(1)清空dmesg:dmesg -C。特性来打印堆栈和重启系统呢。原创 2025-03-02 19:36:35 · 207 阅读 · 0 评论 -
rk3568 linux lockdep死锁定位
debug hungup lockdeps里面是与系统卡死相关的配置内核编译选择宏,下面的选择自己可以选择。配置完之后对比查看相关的配置宏定义,或者修改lrk3568_inux_defconfig。2,配置config,进入kernel目录,make menuconfig。选择kernel hacking进入下面界面。原创 2025-02-16 11:24:43 · 734 阅读 · 0 评论 -
linux kasan 使用举例
选择INLINE instruction。原创 2025-02-16 11:23:59 · 743 阅读 · 0 评论 -
rk3568 内核态OOM内存泄漏kmemleak使用
1,配置,修改\kernel\arch\arm64\configs\rockchip_linux_defconfig,修改后查看.config.分析代码:phylink_bringup_phy代码里面使用完irq_str后没有释放,这样需要释放.pr_info("%s\n", my_string);// 在内核日志中打印信息。// 释放分配的内存。加上kfree(irq_str)再烧写可以看到没有释放的现象。phylink_bringup_phy调用的地方。原创 2025-01-12 19:40:55 · 1050 阅读 · 0 评论 -
linux 内核OOM问题定位-SLAB_DEBUG
首先看slabinfo按的size排序查看 slub object,可以查看 space 总占用大小,及objects个数判断泄漏点 为kmalloc-128。那个泄露多看/sys/kernel/debug的slab/kmalloc*-的alloc-traces和free-traces。SLAB或者SLUB有一个用就可以,改menuconfig没有clean会覆盖之前的更改,现在看一下编译的过程。或者配置defconfig,配置完之后需要clean后再编译。1,配置menuconfig。原创 2025-01-12 19:40:30 · 650 阅读 · 0 评论 -
linux内存泄露定位过程(kmemleak和slab debug)
查看内存是否增加slab unreclaimable,如果有增加的话需要看kmalloc里面的统计有没有增加,那个增加的多的话就要看一下内核态,主要看 这两列信息做一个乘积,看是否有明显增加。首先通过cat proc/slabinfo来查看kmalloc的内存没有明显变化,如果有的话就可以确认是内核态的泄露。1,当遇到内存增加过多时,或者由于内存导致系统oom时我们怎么定位呢,定位时需要确认是内核态还是用户态内存泄露。shirft+M 可以排序查看内存的排序。原创 2025-01-11 20:07:34 · 1200 阅读 · 0 评论 -
softirq cpu高 导致的设备看门狗重启
我们看到是eno1的收发报文导致的cpu过高,关闭这个接口if eno1 downh后没有出现softirq cpu高的情况,所以需要看一下收发报文的流程了。查看进程发现softirqs中断占用cpu过高。ps -aux查看进程,查看进程是否有异常。top查看内存或进程(cpu)情况。输入1,查看每个内核占用情况。2,实时查看中断处理。3,查看中断处理情况。原创 2025-01-11 20:06:40 · 880 阅读 · 0 评论 -
linux sysrq的使用举例
m:模块会被编译,但是不会被编译到内核中,只是生成.o文件,我们可以收集这些.o文件做到linux的文件系统中,然后用insmod实现动态加载。(0x0) Disable magic SysRq key functions 数据说明。rk3568的magic sysrq key的目录,进入linux的kernel目录。空格:表示该功能不编译到内核中,即新的内核将不支持该功能。*: 模块驱动编译到内核中,启动时自动加载。M:标识作为内核模块编译。原创 2024-12-14 16:33:11 · 723 阅读 · 0 评论 -
linux panic 空指针使用举例
查看rfkill_wlan_probe+0x518/0x63c处挂死,可以看出具体问题哦在rfkill_wlan_probe函数。3,查看代码符号表地址 nm vmlinux | grep rfkill_wlan_probe。可以看到代码pdata为空指针后继续使用。4,分析代码,查看挂死在哪一行代码。原创 2024-12-14 20:37:46 · 598 阅读 · 0 评论 -
linux ftrace 简单举例
proc sysctl ftrace_enable 是一个很大的 on/off 开关,用于 function tracer 的 intent 跟踪器。默认情况下,它是启用的(当函数跟踪 enabled 在内核中启用)。这不仅包括 ftrace 的函数 tracers,还包括 也用于任何其他用途 (perf、kprobes、堆栈跟踪、分析等)。开跟踪后做一件事再关闭跟踪,所以此次跟踪的结果基本上是这个运行的程序的跟踪结果,但是肯定会包括很多杂讯,所以后面会介绍跟踪某个 pid 的或者跟踪某个函数。原创 2024-12-08 15:51:27 · 970 阅读 · 0 评论 -
linux crash使用和环境部署
怀疑gdb 和crash版本不一致导致,下面根据crash跟新gdb.x86-arm64(arm6-64版本),开发板使用arm64版本。查看linux系统版本, uname -a。,下载下面的uname -a 对应的版本。更新后正常进入crash界面.原创 2024-11-07 10:35:20 · 1327 阅读 · 0 评论 -
linux strace 查看程序异常问题总结
可以看到openat函数异常退出-1,原因为Permission denied。可以看到是锁在等待。原创 2024-11-07 10:34:43 · 963 阅读 · 0 评论 -
linux 的devmem2 调式使用说明
中的数据变化,以此来检测驱动中对内存或者相关配置的正确性验证。devmem2的方式是提供给驱动开发人员,在应用层能够侦测。安装成功后会有/dev/mem 这个目录。原创 2025-06-02 19:37:56 · 1861 阅读 · 1 评论 -
linux perf 环境部署和基本测试(基于Ubuntu20.04)
上面可以看到main->foo1的栈占用率 100%。命令可以统计每个调用栈出现的百分比。1,linux 安装perf。4, perf top命令。3,perf常用命令。举例代码main.c。原创 2024-11-02 19:13:05 · 1188 阅读 · 0 评论