【记录】DMA

概要

直接存储器访问,Direct Memory Access,DMA。DMA是一个硬件控制器,负责为RAM和IO设备开辟单独的数据传输通道,可以将IO寄存器中的数据直接复制到指定的地址RAM中。
而在没有DMA控制器的系统中,这种IO寄存器中的数据必须由CPU通过通用寄存器复制到RAM中的。

所以,当只是数据传输,没有逻辑处理时,可以考虑使用DMA控制器代替CPU实现RAM和IO之间数据的传输。
CPU善于执行逻辑运算,DMA善于数据传输,各有所长。

特性:

  • 每个控制器有8个数据流,每个数据流有最多支持8个通道
  • 数据流间可设置优先级
  • 数据传输数据长度可设置
  • 数据传输宽度可设置(通过FIFO缓冲实现)
  • 5个事件标志

这里写图片描述

配置

通道选择

这里写图片描述

DMA数据流

这里写图片描述

源和目标地址

这里写图片描述

流配置

这里写图片描述

可能的DMA流配置

这里写图片描述

DMA中断

这里写图片描述

DMA操作方法

  1. 使能DMA时钟
  2. 设置源地址
  3. 设置外设地址
  4. 设置传输数据大小
  5. 设置DMA数据流
  6. 启动DMA

实验要求

按键触发,将RAM中的数据发送到串口

参考

STM32F3与 F4 系列 Cortex M4 内核编程手册
STM32F4xxx中文参考手册
STM32F4xxx英文参考手册
STM32F4 开发指南(寄存器版)

### 3.1 DMA 隐藏技术的实现原理 DMA 隐藏技术通常利用 DMA 的直接内存访问能力,在操作系统和安全机制无法察觉的情况下访问或篡改内存数据。这种技术常用于恶意攻击或隐蔽的系统监控,其核心原理包括以下几个方面: - **DMA 缓冲区映射与地址欺骗** 通过 DMA 控制器将外设的数据直接写入系统内存,攻击者可以构造特定的 DMA 缓冲区地址,绕过正常的内存访问权限检查。例如,利用 DMA 受保护区域(PTR)和受保护内存区域(PMR)的配置缺陷,跳过 TXT 技术的安全验证机制,从而访问敏感数据[^1]。 - **DMA 通道劫持** 在固件层面,DMA 通道的配置权限通常由设备驱动控制。攻击者可通过篡改固件,修改 DMA 通道的配置寄存器,将原本用于合法数据传输的通道重定向到恶意指定的内存区域,实现数据窃取或代码注入。 - **中断劫持与隐藏传输** DMA 传输完成后通常会触发中断通知 CPU。攻击者可以通过修改中断处理程序或将 DMA 传输嵌入正常中断流程中,使恶意数据传输过程对操作系统不可见。例如,在正常设备驱动中插入隐藏的 DMA 操作,使数据传输与系统任务混合执行,从而规避检测[^2]。 - **DMA 缓存与延迟提交** 利用 DMA 缓冲区的延迟提交特性,攻击者可以将数据先写入缓存区域,再在系统空闲时一次性提交,避免在实时监控中暴露异常内存访问行为。 ### 3.2 DMA 相关的安全防护措施 为了防止 DMA 隐藏技术被滥用,系统设计者和安全研究人员提出了多种防护机制: - **DMA 地址验证与访问控制** 现代系统通过 IOMMU(如 Intel VT-d 或 AMD-Vi)实现 DMA 地址空间的映射和访问控制。IOMMU 可以将设备的 DMA 请求转换为受保护的物理地址,并限制设备只能访问特定内存区域,从而防止地址欺骗和非法访问[^1]。 - **启用 DMA 受保护区域(PTR)与 PMR** 支持 TXT 技术的芯片提供了 DMA 受保护区域(Protected Memory Region, PMR),可以将敏感数据存储在受保护内存中,防止未经授权的 DMA 访问。系统应在启动时正确配置 PTR 和 PMR,确保关键内存区域不被外部设备访问[^1]。 - **固件完整性校验与签名验证** 由于固件在 DMA 操作中具有高度控制权,攻击者常通过篡改固件实现隐藏行为。为防止此类攻击,设备制造商应在固件更新时启用签名验证机制,并在运行时定期进行完整性校验,确保固件未被非法修改[^2]。 - **DMA 传输监控与异常检测** 系统可以部署 DMA 监控模块,实时记录 DMA 传输的源地址、目标地址、数据长度等信息,并结合行为分析模型检测异常传输模式。例如,发现非预期的内存写入行为或大量数据从受保护区域读取时,可触发安全警报。 - **硬件级中断隔离与中断签名** 为防止中断劫持,操作系统可启用硬件级中断隔离机制,确保每个中断源与对应的 DMA 操作具有唯一标识。同时,可对中断处理程序进行签名验证,防止恶意代码替换合法中断处理逻辑。 - **安全启动与可信执行环境(TEE)集成** 在系统启动过程中,Tboot 等可信启动组件可以清除敏感信息,并在可信执行环境中加载 DMA 配置。通过将 DMA 操作限制在 TEE 内部执行,可有效防止外部攻击者利用 DMA 进行内存访问或篡改。 ### 示例代码:DMA 地址映射与 IOMMU 配置(基于 Linux 内核) ```c #include <linux/dma-mapping.h> #include <linux/iommu.h> struct device *dev; // 设备指针 dma_addr_t dma_handle; void *buffer; // 分配一致性DMA缓冲区 buffer = dma_alloc_coherent(dev, BUFFER_SIZE, &dma_handle, GFP_KERNEL); if (!buffer) { // 处理分配失败 } // 设置DMA地址映射 if (iommu_map(dev, dma_handle, virt_to_phys(buffer), BUFFER_SIZE, IOMMU_READ | IOMMU_WRITE)) { // 映射失败,释放缓冲区 dma_free_coherent(dev, BUFFER_SIZE, buffer, dma_handle); } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值