我正在使用2.6.35.3内核的嵌入式Linux系统。在ARM上增加Linux DMA_ZONE内存i.MX287
在设备内部,我们需要一个4MB + 192kB连续的DMA缓存器用于我们的数据采集驱动器之一。驱动程序使用SPI传输将数据复制到此缓冲区。
用户空间应用程序发出一个mmap系统调用,将缓冲区映射到用户空间,然后直接读取可用数据。
使用“alloc_bootmem_low_pages”调用分配缓冲区,因为使用其他方法(如kmalloc)不可能分配超过4 MB的缓冲区。
但是,由于最近的升级,我们需要将缓冲区空间增加到22MB + 192kB。据我所知,Linux内核只有16MB的DMA内存。因此,理论上这是不可能的,除非有办法调整这个设置。
如果有人知道如何执行此操作,请让我知道?
这是一个好主意还是会使系统不稳定?
理想情况下,alloc_bootmem_pages应根据[link](https://www.kernel.org/doc/gorman/html/understand/understand008.html)从ZONE_NORMAL分配内存。但是,就我而言,当我这样做时,我在启动过程中遇到内核恐慌,并且在分析转储时,我发现恐慌是由dma_alloc_coherent调用触发的。如果alloc_bootmem_pages从ZONE_NORMAL分配内存,那么这种内核恐慌会如何发生?我想这应该是一个单独的问题。 –
我假设你的驱动程序不直接调用'dma_alloc_coherent'。内核恐慌中的错误信息是什么,并且回溯显示''dma_alloc_coherent'是从驱动程序中调用的(特别是在'alloc_bootmem_pages'调用中)?另外,这是什么嵌入式架构? –
这不是我的驱动程序,是什么导致内核恐慌是一些以太网驱动程序调用dma_alloc_coherent。就好像,由于我已经分配了所有内存,系统中的其他一些驱动程序无法分配它所需的DMA缓冲区。内核恐慌说,内存不足。我的架构是ARM iMX287。 –