Linux 中的 DMA 与网络驱动开发
1. 可移植 PCI 驱动与 DMA 接口
对于需要编写可移植 PCI 驱动的开发者来说,示例代码中的sysdep.h包含了一个简单的 2.4 DMA 接口实现,该实现可用于较旧的内核。ISA 接口自 Linux 2.0 以来几乎没有变化,毕竟它是一种旧架构,无需进行大量更新。唯一的新增内容是在 2.2 版本中引入了 DMA 自旋锁,在此之前,无需防止对 DMA 控制器的冲突访问。这些功能的版本已在sysdep.h中定义,它们会禁用并恢复中断,但不执行其他功能。
2. 内存处理相关符号与函数
2.1<linux/mm.h>头文件
所有与内存管理相关的函数和结构都在这个头文件中进行了原型声明和定义。以下是一些重要的函数和宏:
#include <linux/mm.h> // 此函数是 mmap 的核心,它将从 phys_addr 开始的 size 字节物理地址映射到虚拟地址 virt_add,虚拟空间的保护位在 prot 中指定 int remap_page_range(unsigned long virt_add, unsigned long phys_add, unsigned long size, pgprot_t prot); // 这些宏用于在内核逻辑地址和其关联的内存映射条目之间进行转换,page_address 仅适用于低内存页面或已显式映射的高内存页面 struct page *virt_to_pa