DMA与 kmallloc

来源:互联网 发布:telnet for linux 编辑:程序博客网 时间:2024/05/22 23:59

DMA控制器是一个硬件设备,只能访问特殊的物理地址。在mips架构下,分配出的逻辑地址需要转换成其对应的物理地址,然后才能交给DMA控制器来使用。


最近在GMAC DMA驱动层的实现中发现DMA的内存分配需要调用kmalloc函数而不是最常用的malloc函数来进行。


在网上查到的资料如下:

在设备驱动程序或者内核模块中动态开辟内存,不是用malloc,而是kmalloc ,vmalloc,或者用get_free_pages直接申请页。释放内存用的是kfree,vfree,或free_pages. kmalloc函数返回的是虚拟地址(线性地址). kmalloc特殊之处在于它分配的内存是物理上连续的,这对于要进行DMA的设备十分重要. 而用vmalloc分配的内存只是线性地址连续,物理地址不一定连续,不能直接用于DMA.