ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

5、驱动性能分析与优化--内存管理对驱动的影响

5、驱动性能分析与优化--内存管理对驱动的影响 5.1 DMA缓冲区:别让数据走冤枉路DMA(直接内存访问)说白了就是让外设直接读写内存,不经过CPU。这招能大幅降低CPU占用率。但有个坑——缓冲区怎么分配?我个人习惯用dma_alloc_coherent()来分配一致性缓冲区。但要注意,这个函数返回的是物理地址连续的内存。如果你的设备不支持分散-聚集DMA,那就必须用这个。核心原则:DMA缓冲区必须物理连续,且不能是栈上或堆上的普通变量。普通变量可能被换出,DMA操作时数据就飞了。// 正确做法:使用DMA API分配 dma_addr_t dma_handle; void *cpu_addr = dma_alloc_coherent(dev, size, dma_handle, GFP_KERNEL); // 错误做法:直接用kmalloc或栈变量 void *bad_buf = kmalloc(size, GFP_KERNEL); // 可能不连续 char stack_buf[256]; // 绝对不行我在项目中遇到过一个问题:某网卡驱动用kmalloc分配了发送缓冲区,结果在高负载下频繁丢包。查了两天才发现,kmalloc返回的内存虽然虚拟地址连续,但物理页可能不连续。网卡DMA引擎不支持分散-聚集,直接就崩了。避坑指南:如果你的设备支持SG(Scatter-Gat
返回列表