当前位置: 技术问答>linux和unix
Linux内核中怎样给DMA分配没有进行Cache映射的内存?
来源: 互联网 发布时间:2015-11-23
本文导语: 我使用的uClinux系统 我的系统有1MB的SDRAM没有进行Cache映射。 为了避免Cache 一致性问题,我需要在这1MB的SDRAM里为DMA分配内存。 GFP_DMA方式调用kmalloc只是分配的低16MB,但是在嵌入式系统里没有这个限制。所以用GFP_DMA也...
我使用的uClinux系统
我的系统有1MB的SDRAM没有进行Cache映射。
为了避免Cache 一致性问题,我需要在这1MB的SDRAM里为DMA分配内存。
GFP_DMA方式调用kmalloc只是分配的低16MB,但是在嵌入式系统里没有这个限制。所以用GFP_DMA也没意义。
使用dma_alloc_consistent 或 dma_map_single吗?这两种DMA映射具体是什么原理?
请问linux内核通用的解决方法是怎样的?
我的系统有1MB的SDRAM没有进行Cache映射。
为了避免Cache 一致性问题,我需要在这1MB的SDRAM里为DMA分配内存。
GFP_DMA方式调用kmalloc只是分配的低16MB,但是在嵌入式系统里没有这个限制。所以用GFP_DMA也没意义。
使用dma_alloc_consistent 或 dma_map_single吗?这两种DMA映射具体是什么原理?
请问linux内核通用的解决方法是怎样的?
|
UCLINUX中应该没有虚拟地址与物理地址的概念,对于DMA来说与普通内存区没什么分别吧??
唯一需要注意的就是开关CACHE的问题了,不晓得对于没有MMU的芯片来说也有CACHE这个东东吗??
如果又有CACHE的话,可能需要显示地操作协处理器来关掉一定内存地址段的CACHE功能,在有MMU的ARM中这是支持的,也就是在内核kmalloc函数中加入自定义的一个参数,这个参数的作用就是开关一定内存段的CACHE,也就是说需要修改kmalloc函数实现,或者是以模块方式另外加入一个专用函数,这个函数需要调用内核中的获取空闲页的那个函数,也就是说写一个类似于kmalloc的函数,不过这个函数的功能单一,就是获取空闲内存,然后操作协处理器去开关CACHE
以上的方法都比较笨,是在实在无法可施的情况下才用,我对UCLINUX一点都不熟悉,所以不能给出好的解决办法,希望熟悉UCLINUX的人给出一个好办法
唯一需要注意的就是开关CACHE的问题了,不晓得对于没有MMU的芯片来说也有CACHE这个东东吗??
如果又有CACHE的话,可能需要显示地操作协处理器来关掉一定内存地址段的CACHE功能,在有MMU的ARM中这是支持的,也就是在内核kmalloc函数中加入自定义的一个参数,这个参数的作用就是开关一定内存段的CACHE,也就是说需要修改kmalloc函数实现,或者是以模块方式另外加入一个专用函数,这个函数需要调用内核中的获取空闲页的那个函数,也就是说写一个类似于kmalloc的函数,不过这个函数的功能单一,就是获取空闲内存,然后操作协处理器去开关CACHE
以上的方法都比较笨,是在实在无法可施的情况下才用,我对UCLINUX一点都不熟悉,所以不能给出好的解决办法,希望熟悉UCLINUX的人给出一个好办法