- 博客(466)
- 资源 (46)
- 收藏
- 关注
原创 项目中写代码的注意事项总结
1,c++中怎么使用c语言中声明的函数,c语言中使用c++中声明的函数;2,函数返回值一般用于返回错误码,不要用于直接返回函数的执行结果。3,有符号和无符号数据类型的混合运算,应注意类型转换;4,不要把子程序的参数用作工作变量,如果需要,另设一个临时变量来处理;5,项目中禁止直接使用全局变量,一般用set/get函数来实现对全局变量的读写;6,防止字符串拷贝时,存储空间不够,应保证有NULL结束符,既是在获取拷贝字符串时,应该意识到存储空间的大小,宁可截断,也不要越界。7,函数返回值
2021-04-24 22:24:38
1358
3
原创 phy降速自愈到100M重试流程分析
让一个用户态程序24/7运行并每秒检查时间,在资源消耗上不如cron高效。但为了满足你的具体要求,我们按此方式实现。我们将创建一个Netlink通道,允许用户态程序直接命令内核驱动设置一个特定的PHY速率。根据你的要求,我们将创建一个独立的C程序,它内部包含定时和重试逻辑,而不是使用cron。我们使用状态机模型,由用户通过Netlink触发的“强制设置速率”事件。这是一个简单的C程序,用于演示如何向内核驱动发送设置速率的命令。此部分是整个自愈机制的基础,与之前描述相同。
2025-11-02 21:50:53
703
原创 linux系统启动失败之flash异常分析
当系统无法启动并出现Flash ECC错误时,可通过以下方法定位问题:首先用U-Boot命令(sfread/nandread/mmcread)读取Flash存储的关键组件(UBoot、内核、设备树),再通过TFTP导出到PC与原始文件对比。若系统完全无法启动,可使用J-Link/RT809H等工具直接读取芯片内容进行分析。对于NAND Flash需注意坏块管理,eMMC则需按块读取。最终使用Beyond Compare等工具比对读取数据与原始固件,即可定位损坏区域。不同存储介质(NOR/NAND/eMMC)
2025-11-01 21:32:57
1273
1
原创 linux系统移植过程中挂死问题分析
摘要: 在ARM32系统中,代码通过将32位状态码强制转换为unsigned long*写入4字节寄存器,未引发越界问题。移植到AArch64后,因数据模型变为LP64(unsigned long和指针均为8字节),同一操作会覆盖相邻的4字节填充区和user_buffer指针高4位,导致内核访问无效地址而崩溃。根本原因是类型不匹配引发内存破坏,修复方案是使用固定宽度类型(如uint32_t)明确数据大小,确保跨平台安全性。该案例凸显了隐式类型转换在跨架构移植中的高风险性。
2025-11-01 21:31:56
116
原创 linux gpio errno EBUSY问题举例分析
在设备树中,为GPIO功能创建专用pinctrl配置节点,确保function属性设为gpio&pio {// 示例:GPIO84// 上拉(可选)// 默认输出高(可选)说明为平台提供的宏,表示将引脚配置为GPIO功能89。不同SoC的宏名不同,需查阅芯片手册或内核头文件(如)3。
2025-10-29 21:26:04
502
原创 linux arm64平台上协议栈发包报文长度溢出导致系统挂死举例
参考链接:【linux 5.10 移植kfence调试踩内存纪要 - CSDN App】https://blog.csdn.net/qq_40008325/article/details/153577501?// skb_put 是一个内联函数,最终会调用 skb_put_zero。// 检查写入长度是否超过了 tail 和 end 之间的空间。// 如果空间不足,调用 skb_over_panic。// SKB_DATA_ALIGN 是内存对齐宏。// 调用通用的 panic 函数。
2025-10-29 21:24:51
85
原创 linux 5.10 移植kfence调试踩内存纪要
本文介绍了如何在Linux 5.10内核上移植KFENCE内存错误检测工具。主要步骤包括:从高版本内核(5.12+)回溯移植核心文件到mm/kfence/目录,修改内存管理相关代码(如slub.c)集成KFENCE钩子函数,添加配置选项和头文件。移植完成后需在内核配置中启用KFENCE选项,并设置采样间隔等参数。通过检查System.map符号、内核启动日志和DebugFS接口验证移植是否成功。最后提供了测试内核模块代码,可模拟内存越界、释放后使用等错误来验证KFENCE功能。移植过程需注意版本兼容性问题,
2025-10-19 17:10:00
422
原创 Linux 内核 AW21012 芯片适配点灯
摘要:本文介绍了AW21012芯片(12通道LED驱动IC)的Linux驱动开发实现。该芯片支持I2C接口、12位PWM调光和多种灯光模式。文章详细说明了设备树配置方法(包括LED通道定义)、驱动框架实现(含I2C通信、亮度控制函数等核心代码),以及用户空间通过sysfs控制LED的测试方法。驱动实现了硬件初始化、寄存器配置和LED子系统集成,支持最大4096级调光。开发过程参考了艾为电子提供的技术文档,包括数据手册和软硬件设计指南。
2025-10-19 15:52:05
1017
原创 linux系统问题定位之寄存器篇
uboot md指令读地址寄存器数据,以及kernel阶段读寄存器举例,和使用devm读写寄存器,这里面的寄存器是哪里来的,举一个例子分析读rk3568的iic。
2025-10-17 13:12:01
364
原创 linux AtputilTimerDel删除定时器导致系统挂死问题分析
上面可以看出挂死在定时器删除上,其实我们可以分析一下g_fast_timer_id,可以看到我们在del定时器后还可以使用g_fast_timer_id,此时就出现了访问非法地址的情况,我们在删除g_fast_timer_id时,没有将g_fast_timer_id置空。#include "atp_util.h" // 假设的头文件。// *** 使用安全删除函数 ***
2025-10-17 10:30:09
427
原创 linux ARM汇编指令 ESR/PSR/ESR/CPSR/SPSR寄存器分析系统异常
这是 ESR 中最重要的字段,它直接告诉内核发生了什么类型的异常。armv7没有统一的异常处理字段,后续遇到具体问题再补充。1,查看系统使用的什么平台 arm32还是AARCH64。ISS 的含义完全依赖于 EC 字段。这是控制 CPU 特权级和功能的关键字段。aarch64平台(armv8)armv8 ESR字段详细说明。arm32平台(armv7)
2025-10-17 10:23:45
305
原创 linux 内核泄露时kmalloc内存申请分析
1,当kmalloc申请内存时,我们怎么查看是哪个函数使用的相应kmalloc的内存。我们这里使用kmalloc-128来举例分析在mm/slab.c或mm/slub.c中找到kmalloc-128对应的cache创建位置。// 每CPU本地缓存// 缓存标志位// 最小部分slab数量// 对象总大小(含元数据)// 对象实际大小(不含元数据)// 空闲指针偏移量// 分配的页阶和对象数// 最大分配页阶和对象数// 最小分配页阶和对象数// 分配标志。
2025-10-16 12:49:57
551
原创 linux socket recvfrom errno resource busy问题分析纪要
该打印显示pid 12350在17:45:10.128901 关闭了fd close(3),而pid 12351在17:45:11.130234 调用recvfrom(3,此时fd已经关闭,所以肯定是resource is busy.对于UDP socket,虽然内核允许多个进程绑定到同一个端口(需要设置。上时,内核的调度可能会引发资源竞争,导致其中一个或多个调用失败,返回。这可以理解为内核的一种保护机制,防止数据包被“撕裂”地处理。(4)逻辑上确认谁使用该socketfd,谁去释放他。
2025-10-16 12:48:36
499
原创 linux 字节对齐导致的挂死问题分析
摘要本文分析了不同硬件架构对未对齐内存访问的处理差异:x86通过多周期访问自动处理但性能下降,ARMv7触发异常导致内核崩溃,ARMv8默认忽略但可能损坏数据,MIPS直接导致系统挂死。通过代码示例展示了未对齐访问问题,包括用户态数据包解析错误和内核模块崩溃案例。最后提出四种解决方案:1)使用内核安全宏get_unaligned;2)内存拷贝法;3)确保分配对齐内存;4)移除结构体packed属性让编译器自动对齐。这些方案可有效预防因未对齐访问引发的系统故障。
2025-09-27 14:44:49
249
原创 Linux DMA内存、IOMMU、一致性内存、伙伴系统、CMA、swiotlb内存映射详解与举例分析
本文介绍了Linux内核中几种关键的内存管理机制:DMA内存通过dma_alloc_coherent实现外设直接访问内存,无需CPU干预;IOMMU提供硬件地址转换与隔离功能;一致性内存确保CPU与设备访问同步;伙伴系统管理物理页帧;CMA用于分配大块连续内存;SWIOTLB则作为无IOMMU时的软件中转方案。每种机制各有特点,适用于不同场景,如DMA适用于高性能I/O,CMA适合大块内存需求设备。文中还提供了各机制的核心API和对应的设备树配置方法。
2025-09-27 14:40:24
838
原创 linux inotify 功能详解
本文介绍了Linux内核宏CONFIG_INOTIFY_USER对inotify功能的影响,比较了inotifywait和inotifywatch工具的差异。inotifywait适用于实时监控文件系统事件并触发操作,支持递归监控和事件过滤;inotifywatch则用于统计事件发生频率,可设置监控时长并输出详细报告。文章详细说明了两个工具的参数用法,包括持续监控模式(-m)、事件类型指定(-e)、递归监控(-r)和时间设置(-t)等,并提供了监控目录变化的实用命令示例。
2025-09-05 23:20:24
182
原创 linux ubi文件系统
本文介绍了在Linux环境下模拟实现简化版UBI文件系统的方法。UBI是位于MTD和文件系统之间的抽象层,主要功能包括坏块管理、磨损均衡、逻辑卷管理和擦除计数。文章详细阐述了UBI的核心架构设计思路,包括使用文件模拟Flash设备、设计关键数据结构(擦除块信息、逻辑卷信息、设备信息)以及实现核心功能(初始化设备、坏块扫描、磨损均衡、逻辑卷读写)。通过C语言代码示例,展示了如何构建一个具备基本功能的UBI模拟系统,为理解Flash存储管理机制提供了实践参考。
2025-09-05 23:19:14
613
原创 linux缺页中断频繁怎么定位
本文介绍了Linux系统内存缺页中断的检测与优化方法。检测方面:可通过dmesg、perf、vmstat等工具查看缺页中断日志和系统状态,pidstat监控进程内存使用。常见原因包括不合理的内存访问模式、频繁内存分配/释放等。优化建议:1)分析系统内存状况,检查/proc/meminfo和slab分配;2)使用valgrind检测内存泄漏;3)调整内存水位线参数如swappiness和min_free_kbytes。当available内存接近0时,说明内存不足导致频繁交换,需优化内存访问模式或增加物理内存
2025-09-05 23:18:32
358
原创 linux jffs文件系统
1,JFFS 是一种经典的 Flash 文件系统,通过日志结构和垃圾回收机制,解决了 Flash 存储的诸多问题。虽然在大容量设备上逐渐被 UBIFS 取代,但在小容量嵌入式设备中仍具有重要价值。2,rootfs.jffs文件解析查看2.2 目录项节点 字段说明:字段说明:JFFS2 在内核中通过以下mtd函数实现文件读写,并调用 MTD 接口操作 Flash:2. 挂载文件系统3. 写入文件4. 读取文件5. 删除文件四、垃圾回收机制
2025-09-04 07:18:36
411
1
原创 linux __builtin_return_address举例分析
是 GCC 提供的一个内建函数,用于获取当前函数调用栈中指定帧的返回地址。该函数常用于调试和性能分析,帮助开发者理解程序中的函数调用关系。以下通过具体示例说明其使用方法,并结合不同参数(0/1/2)的场景分析。
2025-08-31 12:08:57
414
原创 linux系统卡死卡顿死锁问题场景c语言举例并分析
使用strace查看阻塞进程相关信息,并且查看i/o通信过程中的errno信息打印出来进行错误码分析,或者查看进程状态为 D状态。// 尝试获取lock2,但lock2已被Thread2持有。// 尝试获取lock1,但lock1已被Thread1持有。cat /proc/interrupt,查看是否有很多的异常中断信息。dmesg/cat /proc/kmsg &查看是否有异常信息。cat /proc/pid/status以及其他内存相关信息。2,死锁/softlockdep/hardlockdep/
2025-08-31 09:44:36
282
1
原创 linux内核trace_begin和trace_end使用分析
所以函数运行的时间为:1235.667890-1235.567890=0.1s=100ms.mdelay(100);1,strace/ftrace的实现和使用。4,定位超时问题举例。在内核代码中,可以使用。
2025-08-31 09:43:47
204
原创 linux cma alloc fail 问题分析
3,修改实际编译成内核的CMA大小,控制CMA大小的内核宏修改CONFIG_CMA_SIZE。1,分析日志 dmesg,cat /proc/kmesg。CMA_ALLOC_SIZE的大小应该设置小一些。4,模拟cma alloc failed 场景。// 尝试从 CMA 区域分配连续内存。// 模拟使用内存...
2025-08-29 00:50:37
454
原创 linux 时间翻转问题分析
unsigned long或者unsigned int和上面是一样的,这个时候内核引入time_after/time_before函数。// 对于uint32_t, 这就是 2^32 - 5。// --- 场景1: 正常情况,未发生翻转 ---// 模拟 Linux 内核的 time_before 宏。// --- 场景2: 发生时间翻转 ---
2025-08-29 00:49:49
236
原创 linux tftpboot烧写地址分析
在大多数基于 ARM 架构的嵌入式平台中,loadaddr 的默认值通常设置为 0x80008000 或 0x40008000。这些地址是 ARM Linux 内核推荐的加载地址,确保内核镜像能够正确加载到内存中并启,RK3568 平台的 loadaddr 默认值通常为。是一个环境变量,用于指定文件(如内核镜像、设备树等)加载到内存的起始地址。2,通过 TFTP 协议从远程服务器下载文件到内存。默认的 loadaddr 值通常由配置文件(如。saveenv //.保存配置。,表示后续文件将加载到该地址.
2025-08-21 07:57:31
290
原创 linux cma内存分析
是内核启动时传递的命令行参数,用于动态禁用CMA功能。此时内核已编译支持CMA,但通过参数强制关闭其运行时行为,例如不预留或释放已预留的CMA内存区域。)是编译时配置选项,用于决定是否在内核中启用CMA功能。若未启用该宏,整个CMA子系统将不会被编译进内核,系统完全失去连续内存分配能力。3,GFP_ATOMIC与GFP_KERNEL的功能与区别。(1)GFP_ATOMIC分析。4,GFP_ATOMIC和。1,linux cma开关。2,常用CMA宏及其功能。
2025-08-21 07:57:04
1049
原创 uboot点灯适配
通过Kconfig和defconfig宏控制的方式,可以灵活地为不同开发板适配点灯功能。bl redledon /* 启动时点亮红色LED */bl greenledon /* 启动时点亮绿色LED */bl blueledon /* 启动时点亮蓝色LED */bl colouredledinit /* 初始化LED */6,启动过程中uboot加入点灯功能,修改start.S。/* 启动阶段LED指示 */
2025-07-22 00:21:19
890
原创 linux内存小型化分析
cat /proc/meminfo,只启动内核相关的ko文件,也就是初始化startbsp相关的脚本,统计start kernel到内核加载完之后的(编译进内核模块)内存,以及编译成ko模块加载后的内存,加载完后统计加起来的内存就是内核模块使用的全部内存。可以先确认那些内核功能可以裁剪,裁剪后保证系统功能正常使用,并且查看裁剪前后内存对比情况,主要裁剪内核宏和设备树相关的一些配置,裁剪后通过查看proc/meminfo查看内存使用情况。b,设备树相关配置修改,里面有一些功能可以关闭,比如CMA。
2025-07-22 00:20:19
253
原创 linux看门狗重启定位思路总结
查看日志查看是否有RCU install或者deadlock相关打印,如果有的话可以考虑使用lockdep死锁检测工具。根据perf火焰图或者perf top(-g)分析任务的cpu占用情况,分析cpu占用高的任务或者相关进程或者ko。查看中断,抓中断打印,可以查看/proc/softirqs和/proc/interrupts下面的打印信息。如果怀疑中断被异常关闭,首先可以写一个模拟中断关闭的ko场景,查看是否与现场场景一致。接串口查看系统启动中卡住的地方,结合串口打印分析异常点。(5)看门狗任务异常。
2025-07-19 18:43:58
166
原创 linux cpu频率和AVS调压等级
Linux内核中,AVS调压的实现依赖于一些宏定义和配置选项,这些宏定义帮助内核模块化地管理电源策略。// 最高电压 1200mV。// 最低电压 800mV。// 1.6GHz 对应 1200mV。// 1.4GHz 对应 1100mV。// 1.0GHz 对应 900mV。策略,根据系统负载动态调整频率和电压。策略,始终以最高频率和电压运行。策略,始终以最低频率和电压运行。1,cpu频率对应的电压等级。(2)频率与电压的对应关系。
2025-07-19 18:41:20
1092
原创 linux 数据翻转导致系统卡死问题定位分析
本文介绍了Linux内核中死锁模拟的实现与分析。第一部分展示了两种死锁模拟方法:通过高负载循环导致系统卡死,以及通过错误配置定时器引发永久阻塞。第二部分重点分析了time_after宏的缺陷,指出在jiffies接近MAX_JIFFIES时可能因数据翻转导致判断失效,并提出了优化方案,改用64位整数比较以避免回绕问题。整个实验涉及内核线程创建、CPU绑定、定时器管理和看门狗机制等关键技术,有助于理解系统死锁的成因和检测方法。
2025-07-13 11:57:46
221
原创 linux卡死问题模拟场景
摘要:本文展示了Linux内核态实时任务卡死问题的检测与恢复机制。通过实现两种内核模块(绑定CPU和未绑定CPU版本),利用看门狗定时器检测任务超时(5秒阈值),自动重启卡死的任务。绑定CPU版本明确将任务固定在CPU0执行,而未绑定版本由调度器动态分配CPU。实验通过模拟阻塞触发看门狗机制,观察到任务成功重启并记录日志(如"Task hung detected! Restarting...")。该方案为实时系统提供了有效的任务监控和恢复手段,同时对比了不同CPU调度策略下的行为差异。
2025-07-13 10:51:08
170
原创 linux dmesg/kmesg定位问题
2,cat /proc/kmsg查看打印,或者加上&后台运行,其次,kmsg 命令和。3,一般用 dmesg 查看历史日志,再用 kmsg 实时监控新消息。dmesg 的输出通常不会自动保存,建议使用重定向保存到文件。4,如果需要保存日志,一般使用重定向将日志重定向到文件。1,printk的打印,没有接串口时,怎么看。文件通常需要 root 权限才能访问。
2025-07-02 19:04:29
435
原创 linux show stack/dump_stack函数分析
函数用于打印当前进程或指定进程的内核态堆栈信息。其核心功能是回溯函数调用栈,并打印出每个函数的地址。// 调用汇编函数回溯栈。是内核调试的重要工具。
2025-07-02 19:03:54
541
原创 linux魔术字定位踩内存总结
1,当数据被踩时,也就是出现数据异常时,并且可以稳定复现时,我们确认时踩固定内存时,我们可以使用魔术字定位问题。2,当数据是逻辑上被改写时,数据加上魔术字时,数据扩展位不会被修改,此时我们正常查看代码逻辑定位即可。#define MAGIC_BYTE 0xAA // 定义魔术字(单字节)// 模拟内存踩踏(修改魔术字)// 检查魔术字是否被修改。
2025-07-01 23:07:38
266
原创 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
112
原创 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
695
1
原创 rk3568 硬件断点看数据被踩(越界)问题
文章分析了Linux内核内存访问异常"Unable to handle kernel paging request",指出该错误通常由空指针、受限内存访问或非法用户空间访问引起。针对示例地址0xc6fef31e,初步判断为内核态内存踩踏错误。文章提供了两种调试方案:KASAN(适用于大内存)和硬件断点(适用于小内存),并详细介绍了硬件断点的配置方法和代码实现示例。最后建议使用addr2line或objdump工具定位故障指令0xc0088b8c对应的源代码位置。
2025-06-13 18:52:53
349
原创 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
466
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅