直接内存访问¶
在软件层面,应用程序可以通过虚拟地址访问内存。在硬件层面,一些外设也有内存的需求,它们希望可以直接访问内存而不需要经过CPU,或者经过某种方式可以映射成CPU的视角,从而让CPU访问,实现与应用程序的交互。
在编写设备驱动时,一些设备要求分配一大块连续的内存,比如图像、视频等外设。内核提供了DMA mapping的功能,以便这些内存可以直接被设备访问。在某些应用场景下,不同设备之间可以共享内存,这就是DMA buffer sharing机制:
交换数据¶
1.单变量访问:
2.数组访问:
unsigned long copy_to_user(void *to, const void *from, unsigned long n);
unsigned long copy_from_user(void *to, const void *from, unsigned long n);
3.内存映射I/O访问
将硬件地址映射为虚拟地址:
void __iomem *ioremap(phys_addr_t phys_addr, size_t size);
void iounmap(volatile void __iomem *addr);
访问I/O虚拟地址: