- 博客(398)
- 资源 (46)
- 收藏
- 关注

原创 项目中写代码的注意事项总结
1,c++中怎么使用c语言中声明的函数,c语言中使用c++中声明的函数;2,函数返回值一般用于返回错误码,不要用于直接返回函数的执行结果。3,有符号和无符号数据类型的混合运算,应注意类型转换;4,不要把子程序的参数用作工作变量,如果需要,另设一个临时变量来处理;5,项目中禁止直接使用全局变量,一般用set/get函数来实现对全局变量的读写;6,防止字符串拷贝时,存储空间不够,应保证有NULL结束符,既是在获取拷贝字符串时,应该意识到存储空间的大小,宁可截断,也不要越界。7,函数返回值
2021-04-24 22:24:38
1251
2
原创 linux RCU技术
RCU(Read-Copy-Update)是Linux内核中的一种同步机制,用于在多核处理器环境中实现无锁读取和延迟更新。Linux RCU(Read-Copy-Update)技术通过一种高效的同步机制来处理并发冲突,确保在多核环境中读者和写者对共享数据的访问能够安全、高效地进行。RCU的核心思想是通过和。
2025-04-13 00:07:59
584
原创 linux 内存踩踏导致的空指针问题分析纪要
最开始测试说这个问题是必现或者高概率复现的,我们查看日志看着空指针又没看出什么,后面我们自己想复现问题找到问题的触发条件,后面我们发现wifi测速时这个问题出现的概率比较高,但是后面我们加了一些打开符号表和其他的调试信息后发现问题问题出现的概率也不是很高,驱动专家们怀疑这个时候改了逻辑打开了符号表,可能踩到了其他的内存,这个时候我们只能通过测试场景去看问题了。和协议栈的专家确认以及查看协议栈的发包函数的实现以及发包的流程,发现该线程是可重入的,但是没有加锁,所以可能会有问题,所以我们试着把。
2025-04-13 00:07:11
892
原创 linux signal up/down/down_interruptiable\down_uninterruptiable使用
在Linux内核中,down, down_interruptible, down_killable, 和 up 是用于操作信号量(semap hores)的函数,它们用于进程同步和互斥。如果信号量的值为0,并且进程收到一个信号(比如用户按下Ctrl+C),down_interruptible会失败并返回-EINTR,而不是一直阻塞。通常,down函数本身就是不可中断的,除非在特定的情况下,内核代码可能提供了一个自定义的不可中断版本,但这不是标准做法。如果信号量的值大于0,它会减少信号量的计数并立即返回。
2025-04-04 20:43:35
515
原创 linux 进程/线程设置核亲和性
设置本线程的CPU亲和性到CPU 0使用的函数是 set_thread_affinity(pthread_self(), 0),使用。// 设置本线程的CPU亲和性到CPU 0。// 假设我们要绑定到第0个CPU核心上。// 定义一个函数,用于设置线程的CPU亲和性。// 清空CPU集合并添加指定的CPU。// 打印进程ID和设置的CPU亲和性。// 清空CPU集合并设置亲和性掩码。// 设置当前进程的CPU亲和性。// 打印CPU亲和性设置结果。// 设置线程的CPU亲和性。// 获取当前进程的PID。
2025-04-04 20:43:14
364
原创 rk3568 yt8521S phy设备层丢包定位处理
PC持续向主控端发包时,发现mac-rx有误码统计,我们交叉对换硬件设备上的phy设备,查看丢包是跟着phy芯片走的,而且我们查看对接设备打流100M没有丢包,1000M有丢包统计。3,查看a001和a003 寄存器,查看工作模式和tx-delay和rx-delay。b, 配置ext_reg0xA0 bit15置1 bit14清0 打开收发包统计。查看是否还是否有丢包,如果没有就要查看mac层。c,轮询 读取下图查看收发包计数结果。2,环回查看收发包情况寄存器配置。由PC持续向主控端发包。
2025-03-16 19:32:46
605
原创 rk3568 phy驱动调式_phy寄存器
2,代码分析:rk3568\rk356x-linux\kernel\drivers\net\phy\phy_device.c。device_attribute描述phy_registers的属性,而他有show和store两种操作(读和写)。sys/bus/mdio_bus/devices/stmmac-0\:00/里面的 phy_registers。查看调用sysfs调用过程。1,phy调式相关寄存器。
2025-03-16 19:32:13
441
原创 Linux内核调试方法总结
另外一种调试模块初始化函数的方法是:当插入内核模块时,内核模块机制将调用函数 sys_init_module(kernel/modle.c)执行对内核模块的初始化,该函数将调用所插入模块的初始化函数。在这 个优化级别之下,编译器要对内核中的某些代码的执行顺序进行改动,所以在调试时会出现程序运行与代码顺序不 一致的情况。当前使用的日志级别。虽然内核调试有一定的困难,但是通过 你的努力和理解,说不定你会喜欢上这样的挑战。由于内核模块中各段的地址是在模块加载进内核的时候才最终确定的,所以develop机的。
2025-03-09 14:43:12
360
原创 rk3568 串口波特率更改
根据上面的配置文件,我们可以看出 使用需要更改的文件是bin/rk35/rk3568_ddr_1560MHz _v1. 19.bin,所以接下来我们围绕着/rk3568_ddr_1560MHz _v1. 19.bin进行修改展开。1,get ddr.bin file config to gen_param.txt file(读bin文件到txt文件)我们首先查看rkbin\tools\ddrbin_tool_user_guide.txt的相关说明。而后重新编译uboot,可以看到下面的生成文件。
2025-03-09 14:40:15
782
原创 常用光模块收发光范围整理
传输距离:10KM 工作波长:1310nm 发送光功率:-9.5dBm~-3.0dBm 接收灵敏度:-20.0dBm~-3.0dBm。传输距离:40KM 工作波长:1550nm 发送光功率:-4.0dBm~1.0dBm 接收灵敏度:-23.0dBm~-3.0dBm。传输距离:80KM 工作波长:1550nm 发送光功率:-2.0dBm~5.0dBm 接收灵敏度:-23.0dBm~-3.0dBm。
2025-03-02 21:23:13
308
原创 linux 内核dumpstack定位使用举例说明
当内核发生一个Oops(Out-Of-Scope Page)错误时,内核会自动输出调用栈信息。这通常发生在非法内存访问或其他严重错误情况下。:在内核代码中检测到错误或异常情况时,比如空指针解引用、越界访问等,可以在错误处理代码中调用。:当你在开发内核模块或内核代码时,遇到一个难以重现或理解的行为,你可以在代码中加入。我们这里只打印了堆栈,后面可以把PC指针和站指针一起打出来。1,在 Linux 内核中,当你需要定位问题时,来查看当前的调用栈,帮助你理解代码执行流程。查看代码可以看出空指针访问的异常。
2025-03-02 21:00:39
1070
原创 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
151
原创 rk3568 linux lockdep死锁定位
debug hungup lockdeps里面是与系统卡死相关的配置内核编译选择宏,下面的选择自己可以选择。配置完之后对比查看相关的配置宏定义,或者修改lrk3568_inux_defconfig。2,配置config,进入kernel目录,make menuconfig。选择kernel hacking进入下面界面。
2025-02-16 11:24:43
655
原创 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
925
原创 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
531
原创 linux内存泄露定位过程(kmemleak和slab debug)
查看内存是否增加slab unreclaimable,如果有增加的话需要看kmalloc里面的统计有没有增加,那个增加的多的话就要看一下内核态,主要看 这两列信息做一个乘积,看是否有明显增加。首先通过cat proc/slabinfo来查看kmalloc的内存没有明显变化,如果有的话就可以确认是内核态的泄露。1,当遇到内存增加过多时,或者由于内存导致系统oom时我们怎么定位呢,定位时需要确认是内核态还是用户态内存泄露。shirft+M 可以排序查看内存的排序。
2025-01-11 20:07:34
1089
原创 softirq cpu高 导致的设备看门狗重启
我们看到是eno1的收发报文导致的cpu过高,关闭这个接口if eno1 downh后没有出现softirq cpu高的情况,所以需要看一下收发报文的流程了。查看进程发现softirqs中断占用cpu过高。ps -aux查看进程,查看进程是否有异常。top查看内存或进程(cpu)情况。输入1,查看每个内核占用情况。2,实时查看中断处理。3,查看中断处理情况。
2025-01-11 20:06:40
835
原创 rk3568代码编译指南
我的开发板是k1b的ubuntu,所以选择的rockchip_rk3568_kickpi_k1b_ubuntu_defconfig.输入10。1,拷贝商家提供的rk356x-linux-20240531.tar.gz到linux 任意目录下,而后进行解压。3,下载拷贝文件系统ubuntu-rootfs-20240220.tar.gz到相应目录。生成rk356x-linux/kernel/boot.img。生成rk356x-linux/boot/uboot.img。5,编译内核kernel。
2024-12-22 18:14:12
741
原创 VScode 查看linux 内核代码
1,查看linux 目录下的linux代码,安装remote ssh。3 选择服务器为linux。2, 输入服务器IP。
2024-12-22 18:12:55
419
原创 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
516
原创 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
684
原创 rk3568 系统升级失败后异常如何恢复
u盘插入到开发板后重新上电,上电后可以看到rk3568恢复默认。看到启动成功后掉电拔出U盘。2,如果U盘提示不可用,需要格式化,第一次可以格式化,后续不需要。1,安装rk3568 自带的SDDiskTool工具。选择开始创建,选择烧写烧写完成后 拔出U盘。选择升级的固件要保证是系统可以正常的版本。
2024-12-14 16:30:07
334
原创 linux驱动笔记
内核测试指南 — Linux 内核文档 (kernel.org)Linux 网络和网络设备 API — Linux 内核文档 (kernel.org)二、uboot启动流程分析 |东格博客 (uniondong.github.io)
2024-12-08 16:12:27
146
原创 linux ftrace 简单举例
proc sysctl ftrace_enable 是一个很大的 on/off 开关,用于 function tracer 的 intent 跟踪器。默认情况下,它是启用的(当函数跟踪 enabled 在内核中启用)。这不仅包括 ftrace 的函数 tracers,还包括 也用于任何其他用途 (perf、kprobes、堆栈跟踪、分析等)。开跟踪后做一件事再关闭跟踪,所以此次跟踪的结果基本上是这个运行的程序的跟踪结果,但是肯定会包括很多杂讯,所以后面会介绍跟踪某个 pid 的或者跟踪某个函数。
2024-12-08 15:51:27
929
原创 rk3568 以太网驱动GMAC
上面的代码我们可以看出设备树没有适配,需要添加,参考\rk356x-linux\kernel\ arch \arm64\ boot\dts\rockchip\rk3368.dtsi里面的配置。// 用于复位PHY的GPIO。
2024-12-02 13:16:36
1237
原创 rk3568 tftpflash烧写uboot和内核
setenv serverip 192.168.1.100 //设置服务器地址(pc)ctrl+s:"Starting kernel..."之后进入 U-Boot 命令行;setenv ipaddr 192.168.1.2 //开发板 IP 地址。ctrl+m:打印 bidram/system 信息;ctrl+c:进入 U-Boot 命令行模式;ctrl+b:进入 maskrom 烧写模式;ctrl+d:进入 loader 烧写模式;ctrl+f:进入 fastboot 模式;
2024-12-02 13:15:19
1391
原创 嵌入式驱动面试总结
signsal/mmap/ioctl/sysfs/debugfs/netlink/procfs/sysctl系统调用。iic访问读出来的数据为0,示波器量出来的波形正常,可能是哪方面的原因,如何定位。CMA,段页式内存管理,为什么会有内存碎片,怎么避免内存碎片;驱动字符设备的框架说一下,主设备号和次设备号的区别说明,linux怎么查看。iic的读写访问时序,iic怎么区分设备的,器件地址和设备地址;做过phy驱动,说一下phy驱动的开发流程和测试流程;用过gdb吗,怎么定位系统挂死问题,asan的使用;
2024-11-19 16:18:33
557
原创 LINUX sysfs的使用方法举例
sys/module:表示加载的内核模块,每个子目录对应一个模块,包含模块参数和状态信息。/sys/class:表示系统中的设备类别(如网络设备、块设备等),子目录按类别分类。/sys/bus:表示系统总线类型(如PCI、USB等),每个子目录对应一个总线。/sys/devices:表示系统中的物理设备,每个子目录对应一个设备。/sys/kernel:表示内核参数和信息,如调度器参数、内核模块等。/sys/block:表示块设备(如硬盘、USB存储设备等)。
2024-11-18 19:16:44
1195
原创 rk3568 设备树总结学习
address-cells属性值决定了子节点 reg属性中地址信息所占用的字长 (32位 ),#size-cells属性值决定了子节点 reg属性中长度信息所占的字长 (32位 )。parent-bus-address: 父总线地址空间的物理地址,同样由父节点的 #address-cells 确定此物理地址所占用的字长。child-bus-address: 子总线地址空间的物理地址,由父节点的 #address-cells 确定此物理地址所占用的字长。中断控制器是GPIO4,然后使用它的34号中断。
2024-11-14 18:29:31
1027
原创 linux 内核asmlinkage关键字总结
GCC中使用__attribute__((regparm(n)))指定最多可以使用n个寄存器(eax, edx, ecx)传递参数,n的范围是0~3,超过n时则将参数压入栈中(n=0表示不用寄存器传递参数)。补充:C语言调用函数参数使用栈传递,有的说使用寄存器传递,上面的asmlinkage关键字主要用于这个作用,那么linux下有几个是使用栈传递,几个使用寄存器传递的呢。我们可以看到edi,esi,edx,ecx,r8d,r9d这几个寄存器 访问,另外的两个为pushq(栈访问)。
2024-11-09 16:25:48
831
原创 反汇编命令学习以及分析越界和空指针问题
1184: 48 8d 3d 79 0e 00 00 lea 0xe79(%rip),%rdi //加载格式字符串的地址到rdi寄存器# 2004 118b: b8 00 00 00 00 mov $0x0,%eax //清除eax寄存器,因为printf的返回值将存储在这里。1160: c3 retq //返回到调用者,eax寄存器包含返回值。
2024-11-09 16:14:03
601
原创 linux crash使用和环境部署
怀疑gdb 和crash版本不一致导致,下面根据crash跟新gdb.x86-arm64(arm6-64版本),开发板使用arm64版本。查看linux系统版本, uname -a。,下载下面的uname -a 对应的版本。更新后正常进入crash界面.
2024-11-07 10:35:20
1256
原创 linux strace 查看程序异常问题总结
可以看到openat函数异常退出-1,原因为Permission denied。可以看到是锁在等待。
2024-11-07 10:34:43
902
原创 valgrind 分析死锁
【1】里面的1 表示owner,从上面的打印可以看到mutex 2和 3和owner形成了相互等待的过程,所以造成了死锁。运行后死锁后ctrl+c发送退出信号退出进程。2,代码pthread.c。
2024-11-05 11:38:46
186
原创 ASAN ThreadSanitizer定位多线程(资源管理)
ThreadSanitizer又叫TSan,是一个检查线程Data Race的C/C++工具。上面的代码在不加锁的情况下,两个线程同时去修改Global变量,从而导致Data Race。这个时ubuntu20.04上面的问题,22.04后面应该没这个问题。1,环境部署参考上一篇文章。2,多线程资源互斥示例代码。,错误信息会直接输出出来。代码举例pthread.c。也可以gdb分析 .
2024-11-04 09:50:55
389
原创 ASAN Sanitizer使用之定位(内存)
fsanitize-recover=address:一般后台程序为保证稳定性,不能遇到错误就简单退出,而是继续运行,采用该选项支持内存出错之后程序继续运行,需要叠加设置ASAN_OPTIONS=halt_on_error=0才会生效;里面的打印heap-buffer-overflow (/home/lark/test/a.out+0x1261) in funcShadow bytes around the buggy address: 可以看出有访问内存堆溢出(0xfa)。五,栈内存回收后使用。
2024-11-04 09:49:43
278
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人