首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

宋宝华:那些年你误会的Linux DMA(关于Linux DMA ZONE和API最透彻的一篇)

创作目的 互联网、Linux内核书籍上充满了各种关于Linux DMA ZONEdma_alloc_coherent、dma_map_single等的各种讲解,由于很多童鞋缺乏自身独立的思考,人云亦云...1.DMA ZONE的大小是16MB? 这个答案在32位X86计算机的条件下是成立的,但是在其他的绝大多数情况下都不成立。 首先我们要理解DMA ZONE产生的历史原因是什么。...DMA ZONE的大小,以及DMA ZONE要不要存在,都取决于你实际的硬件是什么。...下面我们架空历史,假设有一个如下的芯片,里面有5个DMA,A、B、C都可以访问所有内存,D只能访问32MB,而E只能访问64MB,你觉得Linux的设计者会把DMA ZONE设置为多大?...反正任何DMA在任何地方申请的内存,这个DMA都可以存取到。 ? 2.DMA ZONE的内存只能做DMA吗? DMA ZONE的内存做什么都可以。

6.6K46
您找到你想要的搜索结果了吗?
是的
没有找到

Linux 内核 内存管理】物理内存组织结构 ④ ( 内存区域 zone 简介 | zone 结构体源码分析 | zone 结构体源码 )

文章目录 一、内存区域 zone 简介 二、zone 结构体源码分析 1、watermark 成员 2、lowmem_reserve 成员 3、zone_pgdat 成员 4、pageset 成员 5...内存管理系统 3 级结构 : ① 内存节点 Node , ② 内存区域 Zone , ③ 内存页 Page , Linux 内核中 , 使用 上述 3 级结构 描述 和 管理 " 物理内存 "...; 一、内存区域 zone 简介 ---- " 内存节点 " 是内存管理的 最顶层结构 , " 内存节点 " 再向下划分 , 就是 " 内存区域 " zone , " 内存区域 " 在 Linux 内核中使用...struct zone 结构体类型进行描述 , zone 枚举定义在 Linux 内核源码的 linux-4.12\include\linux\mmzone.h#350 位置 ; 每个 " 内存区域...; 源码路径 : linux-4.12\include\linux\mmzone.h#350

4.4K30

Linux 内核 内存管理】分区伙伴分配器 ② ( free_area 空闲区域结构体源码 | 分配标志位 | GFP_ZONE_TABLE 标志位区域类型映射表 |分配标志位对应的内存区域类型 )

)\ ) 四、分配标志位对应的内存区域类型 ---- 源码路径 : linux-4.12\include\linux\gfp.h#296 上述标志位对应的区域类型如下 : ___GFP_DMA 标志..., 对应 ZONE_DMA 内存区域类型 ; ___GFP_HIGHMEM 标志 , 对应 ZONE_HIGHMEM 内存区域类型 ; ___GFP_DMA32 标志 , 对应 ZONE_DMA32 内存区域类型...#endif #ifdef CONFIG_ZONE_DMA #define OPT_ZONE_DMA ZONE_DMA #else #define OPT_ZONE_DMA ZONE_NORMAL...#endif #ifdef CONFIG_ZONE_DMA32 #define OPT_ZONE_DMA32 ZONE_DMA32 #else #define OPT_ZONE_DMA32 ZONE_NORMAL...#endif 源码路径 : linux-4.12\include\linux\gfp.h#296 内存区域类型 参考 【Linux 内核 内存管理】物理内存组织结构 ⑤ ( 内存区域 zone 类型简介

1.3K20

Linux 内核 内存管理】物理内存组织结构 ⑤ ( 内存区域 zone 类型简介 | 内存区域类型zone_type 枚举源码分析 | zone_type 枚举源码 )

① 内存节点 Node , ② 内存区域 Zone , ③ 内存页 Page , Linux 内核中 , 使用 上述 3 级结构 描述 和 管理 " 物理内存 " ; 一、内存区域 zone 类型简介...---- " 内存节点 " 是内存管理的 最顶层结构 , " 内存节点 " 再向下划分 , 就是 " 内存区域 " , " 内存区域 " 的类型 在 Linux 内核中使用 enum zone_type...枚举类型进行描述 , zone_type 枚举定义在 Linux 内核源码的 linux-4.12\include\linux\mmzone.h#293 位置 ; 二、内存区域类型 zone_type..., #endif ZONE_MOVABLE, #ifdef CONFIG_ZONE_DEVICE ZONE_DEVICE, #endif __MAX_NR_ZONES }; 源码路径 : linux...-4.12\include\linux\mmzone.h#293

1.9K20

DMA方式

1.DMA方式的特点 主存和DMA接口之间有一条直接数据通路。由于DMA方式传送数据不需要经过CPU,因此不必中断现行程序,I/O与主机并行工作,程序和传送并行工作。...2.DMA控制器的组成 对数据传送过程中进行控制的硬件称为DMA控制器(DMA接口)。...当I/O设备需要进行数据传送时,通过DMA控制器向CPU提出DMA传送请求,CPU响应之后让出系统总线,由DMA控制器接管总线进行数据传送。 1)接受外设发出的DMA请求,并向CPU发出总线请求。...DMA请求触发器:每当I/O设备准备好数据后给出一个控制信号,使DMA请求触发器置位。...由此可见,DMA控制器必须具有控制系统总线的能力。 3.DMA的传送方式 主存和DMA控制器之间有一条数据通路,因此主存和I/O设备之间交换信息时。不通过CPU。

3.6K12

什么是DMADMA究竟有多快!

直接内存访问(Direct Memory Access,DMA):在计算机体系结构中,DMA 是一种数据传输方式,允许外部设备直接访问计算机的内存,而无需通过中央处理单元(CPU)的干预。...那么,DMA究竟有多快呢? 实践出真知 恰好,最近有个多通道数据采集的项目,受限于通道数多、分辨率高,而系统带宽有限,为了尽可能充分利用有限带宽,就得想办法优化时序,把时间都留给数据采集和传输。...优化方向就是DMA。 硬件链路是ADC通过SPI接口将数据发送给STM32单片机,单片机再将数据发送到上位机。 咱们的目标就是优化SPI这边,先看普通采集模式。...再看下,开启DMA之后的效果。SPI可以连续工作,时钟速率稳定在20MHz,高效工作。 这就是DMA的强大之处! 问题来了,为什么上图中的波形,有这么大的震荡呢?

18610

32.Linux-2440下的DMA驱动(详解)

DMA中断 1.1在linux中,分配释放DMA缓冲区,只能使用以下几个函数 1)  /*该函数只禁止cache缓冲,保持写缓冲区,也就是对注册的物理区写入数据,也会更新到对应的虚拟缓存区上*/ void...和DMASKTRIGn[1]=1才有效,DMA传输时,该位自动清0 1.3接下来就开始讲linux注册DMA中断 首先,DMA的每个通道只能有一个源- >目的,所以输入命令 cat /proc/interrupts...,找到DMA3中断未被使用 所以在linux中使用: request_irq(IRQ_DMA3, s3c_dma_irq, NULL, "s3c_dma", 1);// s3c_dma_irq:中断服务函数...,还是直接两个地址之间的拷贝 -> 2.2)若是DMA启动,则设置DMA的相关硬件,并启动DMA传输 2.1 所以,驱动代码如下所示: #include #include... #include #include #include #include <linux

3.7K90

物理地址和虚拟地址的分布

进一步,针对不同的用途,Linux内核将所有的物理页面划分到3类内存管理区中,如图,分别为ZONE_DMAZONE_NORMAL,ZONE_HIGHMEM。 ?...ZONE_DMA 的范围是 0~16M,该区域的物理页面专门供 I/O 设备的 DMA 使用。...Linux内核空间虚拟地址分布 ? 在 Kernel Image 下面有 16M 的内核空间用于 DMA 操作。...于是,内核将 0~896M 的物理地址空间一对一映射到自己的线性地址空间中,这样它便可以随时访问 ZONE_DMAZONE_NORMAL 里的物理页面;此时内核剩下的 128M 线性地址空间不足以完全映射所有的...ZONE_HIGHMEM,Linux 采取了动态映射的方法,即按需的将 ZONE_HIGHMEM 里的物理页面映射到 kernel space 的最后 128M 线性地址空间里,使用完之后释放映射关系

2K31

物理地址和虚拟地址的分布

进一步,针对不同的用途,Linux内核将所有的物理页面划分到3类内存管理区中,如图,分别为ZONE_DMAZONE_NORMAL,ZONE_HIGHMEM。 ?...ZONE_DMA 的范围是 0~16M,该区域的物理页面专门供 I/O 设备的 DMA 使用。...Linux内核空间虚拟地址分布 ? 在 Kernel Image 下面有 16M 的内核空间用于 DMA 操作。...于是,内核将 0~896M 的物理地址空间一对一映射到自己的线性地址空间中,这样它便可以随时访问 ZONE_DMAZONE_NORMAL 里的物理页面;此时内核剩下的 128M 线性地址空间不足以完全映射所有的...ZONE_HIGHMEM,Linux 采取了动态映射的方法,即按需的将 ZONE_HIGHMEM 里的物理页面映射到 kernel space 的最后 128M 线性地址空间里,使用完之后释放映射关系

2K111

Linux内存描述之内存区域zone--Linux内存管理(三)

enum zone_type { #ifdef CONFIG_ZONE_DMA ZONE_DMA, #endif #ifdef CONFIG_ZONE_DMA32 ZONE_DMA32..., 该区域包含的页框可以由老式的基于ISAS的设备通过DMA使用”直接内存访问(DMA)”, ZONE_DMAZONE_NORMAL区域包含了内存的常规页框, 通过把他们线性的映射到现行地址的第4个GB...一个管理区(zone)由struct zone结构体来描述(linux-3.8~目前linux4.5),而在linux-2.4.37之前的内核中是用struct zone_struct数据结构来描述...以2个节点2个zone为例(zone从高到低排列, ZONE_DMA0表示节点0的ZONE_DMA,其它类似)....为了解决这些制约条件,Linux使用了三种区: ZONE_DMA : 这个区包含的页用来执行DMA操作。 ZONE_NOMAL : 这个区包含的都是能正常映射的页。

9K31

Linux 内核 内存管理】分区伙伴分配器 ③ ( 备用内存区域列表 | ZONELIST_FALLBACK 枚举 | zoneref 结构体 | 备用内存区域借用物理页规则 )

内核源码中的 linux-4.12\include\linux\mmzone.h#601 位置 ; pglist_data 结构体中的 struct zone node_zones[MAX_NR_ZONES..., 内部的备用区域 按照 区域类型 , 由高到低 进行排序 ; 如 : 该 UMA 系统有 " 普通区域 " , " DMA 区域 " , 那么备用区域列表如下 { 普通区域 , DMA 区域 } ;...-4.12\include\linux\mmzone.h#545 三、zoneref 结构体 ---- struct zone *zone 成员 指向 内存区域 数据结构 ; int zone_idx...*zone; /* Pointer to actual zone */ int zone_idx; /* zone_idx(zoneref->zone) */ }; 源码路径 : linux-4.12...区域 借用 物理页 ; 注意 : 低类型区域 无法从 高类型区域 借用 物理页 ; 如 : DMA 区域 无法从 普通区域 借用物理页 ;

1.1K30

Linux 内核 内存管理】分区伙伴分配器 ⑥ ( zone 结构体中水线控制相关成员 | 在 Ubuntu 中查看内存区域水位线 )

Linux 内核 内存管理】分区伙伴分配器 ⑤ ( 区域水线 | 区域水线数据结构 zone_watermarks 枚举 | 内存区域 zone 中的区域水线 watermark 成员 ) 中讲解了...-4.12\include\linux\mmzone.h#255 一、zone 结构体中水线控制相关成员 ( managed_pages | spanned_pages | present_pages...) ---- 在 linux 内核源码中 描述 " 内存区域 " 的结构体 struct zone 中 , 有几个重要的参数 , 用于 控制 区域水线水位 : managed_pages 成员 表示...区域的信息如下 : Node 0, zone DMA32 pages free 43834 min 12202 low 15252...区域的信息如下 : Node 0, zone DMA per-node stats nr_inactive_anon 10820 nr_active_anon 320858

2.4K30
领券