我在具有2.6.35.3内核的嵌入式Linux系统中工作。
在设备中,我们需要一个4MB + 192kB连续DMA缓冲区,用于我们的数据捕获驱动程序之一。驱动程序使用SPI传输将数据复制到此缓冲区中。
用户空间应用程序发出mmap系统调用以将缓冲区映射到用户空间,然后直接读取可用数据。
使用“alloc_bootmem_low_pages”调用分配缓冲区,因为使用其他方法(例如kmalloc)无法分配超过4 MB的缓冲区。
但是,由于最近的升级,我们需要将缓冲区空间增加到22MB + 192kB。正如我所读到的,Linux内核只有16MB的DMA内存。因此,理论上除非有办法调整此设置,否则这是不可能的。
如果有人知道如何执行此操作,请告诉我?
这是一个好主意还是会使系统不稳定?
答案 0 :(得分:2)
ZONE_DMA
16MB限制是由某些设备的硬件限制强加的。具体来说,在过去的PC架构中,执行DMA的ISA卡需要在物理地址空间的前16MB中分配缓冲区,因为ISA接口有24条物理地址线,只能处理前2个^ 24 = 16MB的物理内存。因此,这些卡的设备驱动程序将在ZONE_DMA
区域中分配DMA缓冲区以适应此硬件限制。
根据您的嵌入式系统和设备硬件,您的设备是否受此限制。如果它受此限制,则没有可用于允许您的设备寻址22MB内存块的软件修复,如果您修改内核以将DMA地址空间扩展到16MB以上,那么当然< / em>系统将变得不稳定。
另一方面,如果您的设备不受此限制(这是它可能写入22MB缓冲区的唯一方式),则没有理由在ZONE_DMA
中分配内存。在这种情况下,我认为如果您只是用alloc_bootmem_low_pages
调用替换alloc_bootmem_pages
调用,它应该可以正常分配您的22MB缓冲区。如果系统变得不稳定,那么可能是因为您的设备 受硬件限制,并且您无法使用22MB缓冲区。
答案 1 :(得分:0)
看起来我对答案的第一次尝试有点过于笼统。我认为对于您在评论中提到的特定i.MX287架构,DMA区域大小是可通过alloc_bootmem_low_pages
参数进行配置,该参数可以大到32Megs。相关配置选项应在&#34;系统类型 - &gt;下。飞思卡尔i.MXS实施 - &gt; DMA存储区大小&#34;。
在这个体系结构中,修改它似乎是安全的,因为它看起来没有解决硬件限制(它在x86体系结构上的方式),而只是确定如何布局内存。
如果您尝试将其设置为32Meg并在自己的驱动程序中测试{{1}}和{{1}},则其中一个可能会有效。
否则,我认为我没有想法。