- 博客(464)
- 资源 (19)
- 问答 (1)
- 收藏
- 关注
原创 sigrok逻辑分析仪存储格式剖析
ref:https://sigrok.org/wiki/Input_output_formatshttps://sigrok.org/Downloads - sigrokhttps://github.com/sigrokproject/pulseview
2025-07-19 09:46:23
118
原创 elf文件格式
ELF代表Executable and Linkable Forma,是一种对可执行文件、目标文件和库使用的文件格式,跟Windows下的PE文件格式类似。ELF格式是是UNIX系统实验室作为ABI(Application Binary Interface)而开发和发布的,早已经是Linux下的标准格式了。
2025-07-12 12:09:26
839
原创 arm架构,arm内核,处理器之间的关系
我们经常说,stm32f103是采用cotex-M3内核,基于armv7架构设计的。那么,stm32f103、cotex-M3、armv7之间有什么关系呢?
2025-07-10 23:21:15
653
原创 linxu内核的signal fault和arm内核的flault
我们在分析linux或者安卓系统的coredump文件时,经常碰见SIGSEGV(段错误)、SIGBUS(总线错误)。那么这些错误和arm内核的各种硬件fault有什么关联呢?
2025-07-10 23:02:39
634
原创 trace32
ref:Trace 32 离线 dump 分析环境搭建方法 | Hacper's Blog6 Trace32 - SiFli-Wiki v1.0 文档Lauterbach TRACE32 | JTAG Debugger & Trace Solutions
2025-07-05 10:32:44
227
原创 android binder(四)binder驱动详解2
服务注册过程(addService)核心功能:在服务所在进程创建binder_node,在servicemanager进程创建binder_ref。所有进程binder_proc所记录的handle=0的binder_ref都指向service manager;每个进程binder_proc所记录的binder_ref的handle值是从1开始递增的;同一个服务的binder_node在不同进程的binder_ref的handle值可以不同。
2025-06-08 16:09:28
260
原创 android binder(二)应用层编程实例
ref:https://juejin.cn/post/7214342319347712057Android系统--Binder系统具体框架分析(一) - lkq1220 - 博客园第5课第1节_Binder系统_C程序示例_框架分析_哔哩哔哩_bilibiliXRefAndroid - Support AOSP 15.0 AndroidXRef & OpenHarmony 5.0https://cs.android.com/android/platform/superproject/main
2025-06-02 19:03:46
489
原创 slab内存结尾篇 -- 谈谈kmalloc的源码实现
这些专有的 slab 内存池,slab 在向伙伴系统申请若干物理内存页 page 之后,内核会按照需要被池化的专有数据结构在内存中的布局 size,从这些物理内存页中划分出多个大小相同的内存块出来,然后将这些划分出来的内存块统一交给其所属的 slab 内存池管理。内核中除了上述这些专有内存的分配需求之外,其实更多的是通用小内存的分配需求,比如说,内核会申请一些 8 字节,16 字节,32 字节等特定尺寸的通用内存块,内核并不会限制这些通用内存块的用途,可以拿它们来存储任何信息。
2025-06-02 15:32:22
235
原创 armv7 backtrace
ref:ARM Cortex-M3/M4/M7 Hardfault异常分析_arm hardfault-CSDN博客
2025-05-11 22:00:49
343
原创 MDK调试技巧
1、fromelf 是 ARM Compiler 工具链中的一个命令行工具,从fromelf这个名字上我们就能看到它是用来处理elf文件的,elf 全称 Executable and Linking Format ,这种文件是gcc编译出来的,而我们使用的axf全称 Arm executable File ,是由keil或者ads编译出来的,两者在格式上有些区别,但里面包含的符号表,调试信息,汇编基本是相同的。上述通过指定文件路径名字的方式不够通用,改进方法是使用keil自带的键序列。
2025-05-11 13:25:33
485
原创 linux内存页块划分及位图存储机制
核心作用与背景是 Linux 内存管理中的一个关键数据结构,主要用于跟踪和管理 内存块(pageblock)的特性。通过,内核可以高效地记录每个内存块的属性,例如迁移类型、分配状态等,从而优化内存分配与回收策略。
2025-03-06 22:23:35
1008
原创 伙伴系统的核心实现
下面我们来看下减半分裂过程的实现,expand 函数中的参数在本节示例中:low = 指定分配阶 order = 0,high = 最后遍历到的分配阶 order = 3。
2025-03-03 21:59:46
380
原创 物理内存分配快速路径
伙伴系统有一个特点就是它所分配的物理内存页全部都是物理上连续的,并且只能分配 2 的整数幂个页,这里的整数幂在内核中称之为分配阶。
2025-03-01 19:30:25
1010
原创 linux RT-Preempt spin lock实现
spinlock.h - include/linux/spinlock.h - Linux source code v5.4.90 - Bootlin Elixir Cross Referencer
2025-01-10 23:24:33
523
转载 Linux性能异常经典案例分析之D进程
用户业务场景类似图片服务器,通过负载均衡ULB将用户请求流量打散到A、B、C三台云主机(虚机)上,云主机挂载网络存储UFS(即NFS),用于存储用户请求图片数据。业务上线不久后,某次晚高峰,A、B、C三台服务器同时出现负载异常(load偏高),业务侧出现访问卡顿和业务数据加载缓慢等现象,随即客户侧收到大量用户投诉。2.2 故障分析由于故障现象有一定的误导性,以及对客户业务架构的不够了解,导致排查前期出现了偏离。即故障现象是三台虚机负载同时。
2025-01-04 17:26:19
217
原创 vmcore和kdump
在Linux系统中,vmcore是指内核崩溃时生成的内存转储文件。这个文件包含了系统崩溃时的内存状态,可以用于分析和诊断内核崩溃的原因。符号文件:分析vmcore时,通常需要与生成该内核的符号文件(vmlinux)一起使用,以便正确解析内存转储中的数据。存储空间:vmcore文件可能非常大,尤其是在系统内存较大时,因此需要确保有足够的存储空间来保存这些文件。使用crash工具时,需要提供内核符号文件(通常是vmlinux文件),以便解析vmcore中的数据。bt:显示崩溃时的堆栈跟踪。ps:显示进程列表。
2024-12-14 23:00:27
479
原创 slab分配器(3):slab内存初始化
那就只需要进行merge操作并返回,而无需进一步创建新的。函数中完成了这两个结构体的初始化之后,相当于就是创建了两个。中分配出来的对象,那么这个问题是怎么解决的呢?结构,并对该结构体进行初始化,最终添加到全局链表中。完成的功能比较简单,就是创建一个用于管理。中,有存在对象大小相近,且具有兼容标志的。函数,内核中定义了两个静态的全局变量。结构体初始化,包括了上文中分析到的。来分配的,因此不需要创建一个相关的。结构体对象的缓存池,一个用于分配。在创建的过程中,当发现已有的。结构体对象的缓存池。
2024-11-23 20:59:51
350
转载 slab分配器(2):组织结构
在上小节的内容中,笔者主要为大家介绍了 struct kmem_cache 结构中关于 slab 的一些基础信息,其中主要包括 slab cache 中所管理的 slabs 相关的容量控制,以及 slab 中对象的内存布局信息。上图中的 kmem_cache 结构就好比是超市,slab cache 的本地 cpu 缓存结构 kmem_cache_cpu 就好比超市的营业厅,营业厅内摆满了一排一排的货架,这些货架就是上图中的 slab,货架上的商品就是 slab 中划分出来的一个一个的内存块。
2024-11-23 14:47:29
179
原创 memblock内存分配器
memblock 是 Linux 内核中的一个内存管理子系统,主要用于在系统启动早期阶段管理物理内存。它在内核初始化期间负责管理内存,直到更复杂的内存管理子系统(如伙伴系统)接管。
2024-11-17 22:47:51
452
原创 LRU(Least Recently Used,最近未使用)
lru的引入主要是和内存回收有关。属于内核的大部分page是不能够进行回收的,比如内核栈、内核代码段、内核数据段以及大部分内核使用的page,它们都是不能够进行回收的;相反,进程使用的page,比如进程代码段、进程数据段、进程堆栈、进程访问文件时映射的文件页、进程间共享内存使用的页,这些页框都是可以进行回收的。那么,可回收的page里面选择那些进行回收呢?
2024-11-16 19:35:49
936
原创 PCP(Per-CPU Pageset)
如果PCP列表为空,则从全局内存池中获取一批(batch个 pages),放入PCP列表,然后再从PCP列表中分配所需的page。每个CPU都有自己的PCP列表,这样在分配和释放内存时,可以避免多个CPU同时访问同一个全局内存池,从而提高性能。减少锁争用:由于每个CPU都有自己的PCP列表,内存分配和释放时不需要频繁地获取全局锁,从而减少了锁争用,提高了系统的并发性能。提高缓存命中率:PCP列表中的页面更有可能被同一个CPU再次使用,从而提高了缓存命中率,减少了内存访问延迟。高速缓存中的页框描述符链表。
2024-11-16 12:08:50
1336
原创 内存回收基本原理与内存水位
内核会为每个 NUMA 节点中的每个物理内存区域定制三条用于指示内存容量的水位线,分别是:WMARK_MIN(页最小阈值), WMARK_LOW (页低阈值),WMARK_HIGH(页高阈值)。这三条水位线定义在WMARK_MIN,WMARK_LOW,NR_WMARK这三条水位线对应的 watermark 数值存储在每个物理内存区域 struct zone 结构中的 _watermark[NR_WMARK] 数组中。// 物理内存区域中的水位线。
2024-11-10 17:53:27
1356
原创 linux物理内存管理:node,zone,page
对于物理内存内存,linux对内存的组织逻辑从上到下依次是:node,zone,page,这些page是根据buddy分配算法组织的,看下面两张图:上面的概念做下简单的介绍:内存节点结构体在linux内核include/linux/mmzone.h文件NUMA下每个node由一个pglist_data结构体描述UMA下只有一个node,即全局变量mmzone.h - include/linux/mmzone.h - Linux source code v5.4.285 - Bootlin Elixir Cr
2024-11-10 14:13:27
1217
原创 Cortex-M3/4体系架构-异常中断与恢复
(2)异常的定义就是突发事件,打断了CPU的正常常规业务,CPU不得不跳转到异常向量表中去执行异常处理程序;中断是异常的一种,一般特指SoC内的内部外设产生的打断SoC常规业务,或者外部中断(SoC的GPIO引脚传回来的中断)。(1)针对SoC来说,发生复位、软中断、中断、快速中断、取指令异常、数据异常等,我们都统一叫异常。所以说:中断其实是异常的一种。arm定义好了异常向量表,定义了各种异常发送时跳转的函数。在发生中断时先保存现场,再去处理中断,最后恢复现场。的返回地址,“返回地址”保存的是。
2024-10-27 21:01:38
482
原创 arm 体系架构-过程调用标准AAPCS
ref:ARM体系结构学习笔记:过程调用标准AAPC、 ARM32调用约定、ARM64调用约定_arm64 传参 结构体-CSDN博客ARM软件逆向工程入门 01 - ARM调用约定(Calling Convention)_armv7函数调用约定-CSDN博客ARM学习(17)ARM函数调用规则_arm bl call 调用函数-CSDN博客
2024-10-27 13:18:37
940
原创 arm汇编指令汇总
LDR{条件} 目的寄存器,:从内存中将一个32位的字数据传送到目的寄存器中。该指令通常用于从内存中读取32位的字数据到通用寄存器,然后对数据进行处理。LDR{条件}H 目的寄存器,:从内存中将一个16位的半字数据传送到目的寄存器中,同时将寄存器的。LDR{条件}B 目的寄存器,:从内存中将一个8位的字节数据传送到目的寄存器中,同时将寄存器的。特别说明:当程序计数器PC作为目的寄存器时,从内存中读取的字数据将被当作目的地址,从而实现程序流程的跳转。
2024-10-27 10:38:50
904
原创 Linux & Unix 共享库
ref:Linux & Unix 共享库 一https://www.eet-china.com/mp/a80944.html一文读懂Linux下动态链接库版本管理及查找加载方式 | IdeaWand
2024-10-23 11:14:22
462
原创 linux进程优先级
normal_prio 的值取决于静态优先级和调度策略,可以通过 _setscheduler 函数来设置 normal_prio 的值。MAX_RT_PRIO 的值为100,nice 的范围是 -20 ~ +19,故 static_prio 值的范围是 100 ~ 139。rt_priority 的值也是取决于调度策略的,可以在 _setscheduler 函数中对 rt_priority 值进行设置。prio 的值是调度器最终使用的优先级数值,即调度器选择一个进程时实际选择的值。
2024-09-16 11:05:59
1415
ICM-20602官方英文原版数据手册
2018-02-03
MPU6050官方原本英文资料
2018-02-03
MPU6500官方原版英文资料
2018-02-03
BLHeli-master最新版
2018-09-06
Keil.STM32F0xx_DFP 包括2.0.0和1.4.0两个版本
2019-02-22
InstallerProjects.vsix
2020-10-23
DUI0491C_arm_compiler_reference.rar
2020-07-27
从特定内存地址中读取数据
2017-10-26
TA创建的收藏夹 TA关注的收藏夹
TA关注的人