- 博客(853)
- 资源 (44)
- 收藏
- 关注
原创 Linux内存从0到1学习笔记(8.20 ION (二))
类似于其 PMEM身,ION 管理一个或多个内存池,其中一些在启动时被预留,以对抗碎片化或满足特殊硬件需求。GPU、显示控制器和相机是一些可能具有特殊内存需求的硬件模块。ION 将其内存池呈现为 ION 堆。每种类型的 Android 设备可以根据其内存需求配置不同的 ION 堆。简而言之,allocate() 和 free() 从堆中获取或释放一个 ion_buffer 对象。调用 phys() 将返回缓冲区的物理地址和长度,但仅适用于物理上连续的缓冲区。
2024-07-19 22:26:50
171
原创 [实践篇]13.31 QNX下的系统性能监控工具 - sysMonAppQNX(三)
以默认设置 (1000ms 的采样间隔,1 次循环) 获取 ADSP 处理器的性能分析统计数据。- 以 500ms 的采样间隔运行 3 次循环,并汇总结果,获取 ADSP 处理器的性能分析统计数据。命令用于显示目标处理器的进程描述符 (Process Descriptor, PD) 的统计信息。用于控制 ETM 跟踪 (Event Trace Monitoring) 和输出相关信息。命令用于获取目标 Q6 处理器的性能分析统计数据。此命令将显示所选处理器的架构版本信息。
2024-07-19 07:15:06
13
原创 [实践篇]13.30 QNX下的系统性能监控工具 - sysMonAppQNX(二)
将 ADSP 的核心时钟设置为 200 MHz,总线时钟设置为 100 MHz。 (默认: 0) - 设置 HCP 总线时钟频率 (可选) (默认: 0) - 设置 DMA 总线时钟频率 (可选)调用会等待用户输入解锁。测试结束后等待返回的时间 (单位: 毫秒) (默认: 0) (默认: 0) - 设置核心时钟频率。 (默认: 0) - 设置总线时钟频率。运行测试的时间 (单位: 秒) (默认: 60 秒)
2024-07-17 22:56:18
29
原创 [实践篇]13.29 QNX下的系统性能监控工具 - sysMonAppQNX(一)
sysMonAppQNX,即System Monitor Application for QNX;它是有QNX开发的系统监控应用程序。它用于监控 QNX 系统的性能和健康状况。sysMonAppQNX 可以监视各种指标,包括 CPU 使用率、内存使用率、磁盘 I/O、网络流量和进程活动。它还可以生成警报以指示潜在问题。
2024-07-17 22:38:19
514
原创 Linux内存从0到1学习笔记(8.19 ION (一))
ION(Interprocess Communication Over Non-Contiguous Memory)即“跨进程非连续内存通信”。是Android系统中负责内存管理的关键子系统,由 Google 在 Android 4.0 ICS 中引入,旨在解决当时 Android 设备中存在的多样化内存管理机制所带来的问题,也就是用归一化的思想来解决不同 Android 设备上内存管理接口分散的问题。举个例子,在使用 NVIDIA Tegra 的 Android 设备上,有 "NVMAP";
2024-07-16 23:28:57
1392
原创 【入门篇】2.3 STM32启动模式(一)
STM32F4根据BOOT引脚的电平选择启动模式,这两个BOOT引脚根据外部施加的电平来决定芯片的启动地址。
2024-07-16 22:47:58
819
原创 【入门篇】2.2 存储器映射与寄存器映射
STM32的寻址范围涉及存储器映射和32位地址线的使用。并且STM32的内存地址访问是按字节编址的,即每个存储单元是1字节(8位)。地址线根数地址编号二进制地址编号数即内存大小10122000110114n……2的n次方32……2的32次方 = 4G(字节)
2024-07-08 23:20:03
100
原创 【入门篇】2.1 Cortex M芯片与内核
Cortex M系列芯片是ARM公司设计的一系列微控制器(MCU),广泛用于嵌入式系统。它是MCU厂商,经ARM公司授权,添加不同的外设 = 各种XX32芯片。
2024-07-08 23:14:54
147
原创 【基础篇】1.8 C语言基础(二)
建议使用do { ... } while (0)来定义宏的原因,一方面是确保宏的行为类似于函数。使用可以确保宏的内容在被调用时像一个单独的语句。这意味着它可以安全地与其他语句结合使用,而不引入语法错误或意外的逻辑错误。另一方面避免潜在的错误。宏定义通常会被直接替换到代码中,如果没有合适的结构包装,可能会导致意想不到的行为。例如,如果宏中有多个语句,而没有使用,这些语句可能会在某些控制结构(如if语句)中导致语法错误。举个例子:else// 其他代码else// 其他代码else。
2024-07-06 23:03:07
97
原创 【基础篇】1.7 C语言基础(一)
1.结构体定义(不使用typedef时,声明结构体变量需要带上struct关键字)int x;int y;2.定义结构体别名(使用typedef后,可以省略struct关键字:)int x;int y;} Point;Point p1;// 现在可以直接使用Point作为类型名// 假设a是一个已经声明的int变量// 定义了一个接受int参数并返回void的函数指针类型// 将函数赋值给函数指针// 通过函数指针调用函数return 0;
2024-07-06 15:47:30
151
原创 [实践篇]13.29 再来聊下Pass Through设备透传
PassThrough(也称为设备直通或设备透传)是设备直接分配技术的一种具体实现。它允许宿主机中的物理设备(如PCI/PCIe设备)被直接分配给虚拟机,是虚拟机能够像物理设备一样直接使用这些设备。某些直通设备,特别是需要进行大量数据传输的设备(如WIFI,处处设备等)。这些设备通常支持DMA操作,能够独立完成内存与设备之间的数据传输。
2024-06-22 23:09:47
89
原创 Linux内存从0到1学习笔记(8.17 SMMU Fault调试方法)
通过前面的介绍,我们知道了SMMU实际上是一个针对外设的MMU。它作为一个硬件IP被设备执行DMA操作时使用。再来简单回顾下SMMU的工作流程:外设 ---> DMA操作 ---> SMMU ---> Memory也就是说,通常情况下驱动程序会先分配DMA Buffer ---> 然后执行SMMU映射,并得到IOVA ---> 驱动在设置IOVA到设备(也就是告诉设备Buffer的位置) ---> 设备驱动开始执行DMA操作 ---> 设备通过SMMU访问分配的DMA Buffer。
2024-06-22 08:11:03
225
原创 Linux内存从0到1学习笔记(8.16 SMMU详解)
本文基于QCOM平台的SoC进行拆解。在QCOM平台下,SMMU作为一个子系统负责将虚拟地址转换为物理地址并检查访问权限。SMMU在SoC中执行两个主要功能:内存碎片整理(使用虚拟内存)和访问控制。QSMMU为ARM CPU Cluster提供了一个符合Arm V8的硬件接口。以QSMMU V500为例,首先QSMMU V500是基于armmmu-500客制化的smmu-v2实现。TBU或QTB 转换缓冲单元(QTB实际上指Qcom平台的TBU)。
2024-06-14 23:03:26
137
原创 Linux内存从0到1学习笔记(8.15 MMU/IOMMU/SMMU概览)
IOMMU(input/output memory management unit 输入/输出内存管理单元)是一个更广泛的概念,用于多种架构(包括x86/x64和ARM),其原理与CPU中的MMU相似,管理设备的内存访问请求,实现地址转换和内存保护。它的主要作用之一是控制设备DMA(Direct Memory Access)地址到机器物理地址的映射。这种映射确保了设备能够安全地访问物理内存区域。因为在没有IOMMU的情况下,设备通过DMA可以访问机器的全部地址空间,这可能会带来安全风险。
2024-06-14 22:44:42
210
原创 6.16 CO-RE(Compile Once – Run Everywhere)使用手册(二,处理内核改动和功能检测)
BPF_CORE_READ()宏系列是BPF CO-RE的核心,但在使用BPF CO-RE构建实用BPF应用程序时,还有更多内容需要考虑。BPF应用程序必须处理的一个非常常见的问题是执行功能检测的需要。即检测特定主机内核是否支持某些新的可选功能,BPF应用程序可以利用这些功能来获取更多信息或提高效率。然而,如果内核不支持这些功能,BPF应用程序宁愿回退到支持旧内核的代码,而不是直接失败。BPF CO-RE提供了一系列不同的机制来满足这些需求。
2024-06-12 22:52:16
121
原创 6.15 CO-RE(Compile Once – Run Everywhere)使用手册(一,读取内核数据)
到目前为止,最常见的BPF CO-RE操作是从某个内核结构中读取字段的值。libbpf提供了一系列辅助函数,使得读取字段变得简单且CO-RE可重定位。CO-RE可重定位意味着,无论结构的实际内存布局如何(这可能会根据实际的内核版本和使用的内核配置而变化),BPF程序都将被调整为从结构的起始位置开始,以正确的实际偏移量读取字段。
2024-06-12 22:40:28
169
原创 6.14 CO-RE(Compile Once – Run Everywhere)的工作原理
首先我们来看下BPF应用程序必须处理的典型场景,以及如何使用BPF CO-RE解决它们。正如接下来要遇到的,一些可移植性问题(例如,兼容的结构布局差异)被处理得相当透明和自然,而其他问题则被更明确地处理,例如,通过if/else条件语句(与BCC程序中的编译时#ifdef/#else结构相对)和BPF CO-RE提供的额外机制。
2024-06-05 22:05:03
89
原创 6.13 CO-RE(Compile Once – Run Everywhere)简介
BPF CO-RE 即Compile Once – Run Everywhere,编译一次——到处运行。BPF CO-RE是为了解决BPF的可移植性而存在,也就是说编写一个BPF程序,该程序能够成功编译、通过内核验证,并且能够在不同的内核版本上正确运行,而无需为每个特定的内核重新编译。
2024-06-05 22:04:57
247
原创 6.12 Libbpf-bootstrap(三,APP)
既然我们已经了解了最小应用以及Makefile中的编译方式,接下来我们将通过bootstrap应用程序展示的一些额外的BPF特性。在现代BPF Linux环境中,bootstrap是我编写可用于生产环境的BPF应用程序的方式。它依赖于BPF CO-RE(阅读原因请点击这里),并且需要Linux内核以CONFIG_DEBUG_INFO_BTF=y配置构建(详见此处)。
2024-06-01 17:09:22
178
原创 6.11 Libbpf-bootstrap(二,Minimal)
minimal是一个很好的入门示例。你可以将其视为一个简单的POC,用于尝试BPF功能。它不使用BPF CO-RE,因此你可以使用较旧的内核,并且只需包含系统内核头文件即可获取内核类型定义。这不是构建生产就绪应用程序和工具的最佳方法,但对于本地实验来说已经足够了。
2024-06-01 16:46:24
86
原创 6.10 Libbpf-bootstrap(一,简介)
在看完前面的介绍,是不是感觉看了也就看了。但是,如果想要像BCC那样使用libbpf编写BPF程序,该怎么开始呢?那么这就需要libbpf-bootstrap了。libbpf-bootstrap是官方推荐的一个范式,就像我们写PPT的模版。简单来说可以简化我们的BPF开发流程,它可以帮助我们快速开发编写自己的BPF程序。这也就为什么把这个项目叫做bootstrap了。就像你需要使用一台电脑环境写个贪吃蛇游戏,那么你不需要在去买显卡,CPU,主板去组装一台电脑;而是只需要按下电源键即可。通过使用。
2024-05-29 23:04:33
1042
原创 【基础篇】1.3 第一个内核驱动和内核模块代码示例
内核模块(kernel module):是一种可以被动态加载到内核中的代码,用于扩展基本内核功能。它们通常是由内核源代码编译而成,可以在系统运行时根据需要动态地加载和卸载,而无需重启系统。内核驱动:是内核的一部分,与内核一起编译和链接。驱动程序作为内核的扩展组件,帮助内核实现与硬件的连接和操控。它们通常是静态链接的,这意味着一旦内核被编译和部署,驱动就被永久地包含在内。
2024-05-19 10:22:22
172
原创 【基础篇】1.2 内核驱动代码结构与示例
在驱动程序的开头,通常会定义一些模块级别的信息,如模块的许可证、作者、描述和版本等。这些信息有助于用户和其他开发者了解模块的基本信息。
2024-05-18 22:58:29
991
原创 【基础篇】1.1 内核驱动简介
内核驱动,也称为内核模块或设备驱动,是一段可以加载到操作系统内核中的代码,通常用于管理硬件设备和提供操作系统与硬件之间的接口。这些驱动为操作系统提供了与硬件设备进行交互的能力,使得操作系统能够识别、管理和控制硬件设备。在Linux系统中,内核驱动通常以模块的形式存在,可以被动态地加载到内核中或从内核中卸载。这种模块化设计使得Linux系统能够灵活地支持各种硬件设备,而无需在每次添加或更换硬件时都重新编译整个内核。
2024-05-18 22:44:17
963
原创 6.2 LIBBPF API(一,异常处理)
如果函数直接返回错误代码,它会使用0来表示成功,并使用负的错误代码来表示错误的原因。在这种情况下,应直接从返回值中检查错误代码,无需检查errno。如果函数返回一个指针,它会返回NULL来表示存在错误。在这种情况下,应检查errno来获取错误代码。当使用“libbpf 1.0模式”中的libbpf时,API函数可以通过两种方式返回错误。/* 请注意下面EINVAL和E2BIG的错误代码前没有负号。/* 相应地处理错误 */处理E2BIG错误 */处理EINVAL错误。
2024-04-11 22:43:21
2548
原创 5.119 BCC工具之zfsdist.py解读
ZFS 是一种高级的文件系统,设计用于存储大量数据并提供强大的数据完整性保证。zfsdist用于追踪 ZFS(Zettabyte File System)的读取、写入、打开和同步操作,并将其延迟以 2 的幂次直方图的形式进行汇总。
2024-04-10 08:09:19
2423
原创 5.117 BCC工具之xfsdist.py解读
xfsdist 追踪 XFS 的读取、写入、打开和 fsyncs 操作,并将其延迟以 2 的幂次直方图的形式进行总结。
2024-04-09 07:47:17
274
原创 5.115 BCC工具之vfscount.py解读
这通过追踪所有以“vfs_”开头的内核函数,计算了在此期间发生的VFS调用次数。默认情况下,时间为99999999秒。
2024-04-08 08:42:57
425
原创 5.114 BCC工具之nfsdist.py解读
nfsdist 追踪 NFS 读取、写入、打开和 getattr,并将其延迟概括为 2 的幂次方直方图。
2024-04-08 08:42:37
464
原创 5.113 BCC工具之nfsslower.py解读
NFS是一种分布式文件系统协议,允许客户端通过网络访问服务器上的文件。然而,由于网络延迟、服务器负载等原因,NFS操作可能会变得缓慢,从而影响系统性能。nfsslower显示慢于阈值的 NFS 读取、写入、打开和 getattr 操作。这有助于我们发现导致NFS性能下降的慢操作,并进一步分析其原因.该工具还可以追踪commit操作,这是NFS特有的,可能会非常慢。警告:这会对这些NFS操作(包括从文件系统缓存中的读取和写入)添加低开销的检测。这种读取和写入可能会非常频繁(取决于工作负载;
2024-04-06 10:55:00
387
pageowner 解析工具
2022-05-13
SELinux4AndroidO
2018-02-05
recovery_l10n
2015-04-10
解决Android4.3彩信幻灯片中gif格式图片不能正常播放
2014-07-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人