- 博客(448)
- 资源 (19)
- 问答 (1)
- 收藏
- 关注
原创 linux内存页块划分及位图存储机制
核心作用与背景是 Linux 内存管理中的一个关键数据结构,主要用于跟踪和管理 内存块(pageblock)的特性。通过,内核可以高效地记录每个内存块的属性,例如迁移类型、分配状态等,从而优化内存分配与回收策略。
2025-03-06 22:23:35
871
原创 伙伴系统的核心实现
下面我们来看下减半分裂过程的实现,expand 函数中的参数在本节示例中:low = 指定分配阶 order = 0,high = 最后遍历到的分配阶 order = 3。
2025-03-03 21:59:46
330
原创 物理内存分配快速路径
伙伴系统有一个特点就是它所分配的物理内存页全部都是物理上连续的,并且只能分配 2 的整数幂个页,这里的整数幂在内核中称之为分配阶。
2025-03-01 19:30:25
946
原创 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
382
转载 Linux性能异常经典案例分析之D进程
用户业务场景类似图片服务器,通过负载均衡ULB将用户请求流量打散到A、B、C三台云主机(虚机)上,云主机挂载网络存储UFS(即NFS),用于存储用户请求图片数据。业务上线不久后,某次晚高峰,A、B、C三台服务器同时出现负载异常(load偏高),业务侧出现访问卡顿和业务数据加载缓慢等现象,随即客户侧收到大量用户投诉。2.2 故障分析由于故障现象有一定的误导性,以及对客户业务架构的不够了解,导致排查前期出现了偏离。即故障现象是三台虚机负载同时。
2025-01-04 17:26:19
95
原创 vmcore和kdump
在Linux系统中,vmcore是指内核崩溃时生成的内存转储文件。这个文件包含了系统崩溃时的内存状态,可以用于分析和诊断内核崩溃的原因。符号文件:分析vmcore时,通常需要与生成该内核的符号文件(vmlinux)一起使用,以便正确解析内存转储中的数据。存储空间:vmcore文件可能非常大,尤其是在系统内存较大时,因此需要确保有足够的存储空间来保存这些文件。使用crash工具时,需要提供内核符号文件(通常是vmlinux文件),以便解析vmcore中的数据。bt:显示崩溃时的堆栈跟踪。ps:显示进程列表。
2024-12-14 23:00:27
369
原创 slab分配器(3):slab内存初始化
那就只需要进行merge操作并返回,而无需进一步创建新的。函数中完成了这两个结构体的初始化之后,相当于就是创建了两个。中分配出来的对象,那么这个问题是怎么解决的呢?结构,并对该结构体进行初始化,最终添加到全局链表中。完成的功能比较简单,就是创建一个用于管理。中,有存在对象大小相近,且具有兼容标志的。函数,内核中定义了两个静态的全局变量。结构体初始化,包括了上文中分析到的。来分配的,因此不需要创建一个相关的。结构体对象的缓存池,一个用于分配。在创建的过程中,当发现已有的。结构体对象的缓存池。
2024-11-23 20:59:51
294
转载 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
86
原创 memblock内存分配器
memblock 是 Linux 内核中的一个内存管理子系统,主要用于在系统启动早期阶段管理物理内存。它在内核初始化期间负责管理内存,直到更复杂的内存管理子系统(如伙伴系统)接管。
2024-11-17 22:47:51
353
原创 LRU(Least Recently Used,最近未使用)
lru的引入主要是和内存回收有关。属于内核的大部分page是不能够进行回收的,比如内核栈、内核代码段、内核数据段以及大部分内核使用的page,它们都是不能够进行回收的;相反,进程使用的page,比如进程代码段、进程数据段、进程堆栈、进程访问文件时映射的文件页、进程间共享内存使用的页,这些页框都是可以进行回收的。那么,可回收的page里面选择那些进行回收呢?
2024-11-16 19:35:49
862
原创 PCP(Per-CPU Pageset)
如果PCP列表为空,则从全局内存池中获取一批(batch个 pages),放入PCP列表,然后再从PCP列表中分配所需的page。每个CPU都有自己的PCP列表,这样在分配和释放内存时,可以避免多个CPU同时访问同一个全局内存池,从而提高性能。减少锁争用:由于每个CPU都有自己的PCP列表,内存分配和释放时不需要频繁地获取全局锁,从而减少了锁争用,提高了系统的并发性能。提高缓存命中率:PCP列表中的页面更有可能被同一个CPU再次使用,从而提高了缓存命中率,减少了内存访问延迟。高速缓存中的页框描述符链表。
2024-11-16 12:08:50
1116
原创 内存回收基本原理与内存水位
内核会为每个 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
1200
原创 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
1057
原创 arm 体系架构-异常中断与恢复
(2)异常的定义就是突发事件,打断了CPU的正常常规业务,CPU不得不跳转到异常向量表中去执行异常处理程序;中断是异常的一种,一般特指SoC内的内部外设产生的打断SoC常规业务,或者外部中断(SoC的GPIO引脚传回来的中断)。(1)针对SoC来说,发生复位、软中断、中断、快速中断、取指令异常、数据异常等,我们都统一叫异常。所以说:中断其实是异常的一种。arm定义好了异常向量表,定义了各种异常发送时跳转的函数。在发生中断时先保存现场,再去处理中断,最后恢复现场。的返回地址,“返回地址”保存的是。
2024-10-27 21:01:38
384
原创 arm 体系架构-过程调用标准AAPCS
ref:ARM体系结构学习笔记:过程调用标准AAPC、 ARM32调用约定、ARM64调用约定_arm64 传参 结构体-优快云博客ARM软件逆向工程入门 01 - ARM调用约定(Calling Convention)_armv7函数调用约定-优快云博客ARM学习(17)ARM函数调用规则_arm bl call 调用函数-优快云博客
2024-10-27 13:18:37
619
原创 arm汇编指令汇总
LDR{条件} 目的寄存器,:从内存中将一个32位的字数据传送到目的寄存器中。该指令通常用于从内存中读取32位的字数据到通用寄存器,然后对数据进行处理。LDR{条件}H 目的寄存器,:从内存中将一个16位的半字数据传送到目的寄存器中,同时将寄存器的。LDR{条件}B 目的寄存器,:从内存中将一个8位的字节数据传送到目的寄存器中,同时将寄存器的。特别说明:当程序计数器PC作为目的寄存器时,从内存中读取的字数据将被当作目的地址,从而实现程序流程的跳转。
2024-10-27 10:38:50
639
原创 Linux & Unix 共享库
ref:Linux & Unix 共享库 一https://www.eet-china.com/mp/a80944.html一文读懂Linux下动态链接库版本管理及查找加载方式 | IdeaWand
2024-10-23 11:14:22
445
原创 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
1313
原创 sysfs系统
所以,内核开发人员觉得有必要使用一个独立的抽象接口来描述设备和驱动信息,毕竟直到目前,驱动代码在内核代码中占比非常大,内容也是非常庞杂。与ext系列和fat等文件系统不同的是,sysfs是一个系统在启动时构建在内存中虚拟文件系统,一般被挂载在/sys目录下,既然是存储在内存中,自然掉电不保存,不能存储用户数据。事实上,在之前也有同样的虚拟文件系统建立了内核与用户系统信息的交互,它就是procfs,但是procfs并非针对设备和驱动程序,而是针对整个内核信息的抽象接口。
2024-08-31 21:43:30
292
原创 c++函数模板
函数模板是C++中的一种特性,它将将参数列表中的全部或者部分参数类型剥离了出来,允许你编写一个通用的函数。函数模板的格式包括模板声明、模板参数列表和函数定义。返回类型 函数名(参数列表) {// 函数体template <typename T>:这是模板声明,T 是一个类型参数。你也可以使用 class 关键字代替 typename,效果是一样的。返回类型:函数的返回类型,可以是模板参数 T 或其他类型。函数名:函数的名称。参数列表:函数的参数列表,可以包含一个或多个模板参数 T。
2024-07-13 18:08:18
670
原创 C/C++ 修改系统时间导致sem_timedwait阻塞
ref:c++ - sem_timedwait with CLOCK_MONOTONIC_RAW/CLOCK_MONOTONIC - Stack Overflowhttps://www.cnblogs.com/xiaolincoding/p/11369715.htmlsem_timedwait 和修改系统时间_monotonic system-wide clock-优快云博客
2024-05-18 00:59:12
229
原创 tcpdump常用命令
ref:Home | TCPDUMP & LIBPCAPhttps://www.cnblogs.com/onlyforcloud/p/4396126.html
2024-01-14 16:32:00
721
原创 paho mqtt qos
ref:Paho MQTT C Client Library: MQTTClient_connectOptions Struct Referencepaho mqtt c 源码分析-5 (Qos) - 简书https://github.com/eclipse/paho.mqtt.c/issues/297What is MQTT Quality of Service (QoS) 0,1, & 2? – MQTT Essentials: Part 6
2024-01-03 22:02:37
512
原创 弱网模拟工具
一个人晚上在家通过 Wi-Fi 上网,在线电影播放基本流畅,可一旦在晚间用网高峰期打视频电话就画面糊,这时不仅可能带宽受限了,还可能有较高的丢包率。与有线网络通信相比,无线网络通信受环境影响会更大,比如高层建筑、用户的移动、环境噪音、封闭的环境等,网络服务质量相对不稳定,导致用户经常在弱网环境下通信。例如,在车库的视频通话通常都不如在室外的质量。除了受环境影响外,网络覆盖、过载控制、邻区漏配等,也会造成呼叫失败、服务质量下降。这些真实的用户场景。
2023-12-02 18:02:05
6447
原创 H264初探
ref:【科普】“视频”是怎么来的?H.264、码率这些词又是什么意思?_哔哩哔哩_bilibiliH.264编解码原理浅析 - 知乎
2023-12-02 17:48:16
615
InstallerProjects.vsix
2020-10-23
DUI0491C_arm_compiler_reference.rar
2020-07-27
Keil.STM32F0xx_DFP 包括2.0.0和1.4.0两个版本
2019-02-22
BLHeli-master最新版
2018-09-06
MPU6050官方原本英文资料
2018-02-03
MPU6500官方原版英文资料
2018-02-03
ICM-20602官方英文原版数据手册
2018-02-03
从特定内存地址中读取数据
2017-10-26
TA创建的收藏夹 TA关注的收藏夹
TA关注的人