我正在测试Linux上接口的吞吐量。我正在使用DMA todo进行数据传输。 DMA需要连续的内存位置。但是kmalloc无法分配超过1MB。有没有其他方法可以创建高达100M Bytes的大缓冲区位置?
答案 0 :(得分:5)
我认为kmalloc无法分配超过128kB,你是如何分配1MB的呢?
无论如何,假设您正在使用刚刚启动的系统,您最多可以保留2048个连续页面。页面一般是4k,所以这个8MB。
_get_free_pages(_GFP_DMA, get_order(2048));
但是,如果需要更多内存,则应在启动时进行分配。
如果您正在编写驱动程序,可以使用alloc_bootmem_*
函数来实现。
如果您正在编写模块,则必须将mem=
参数传递给内核,然后再使用ioremap
。
例如,如果你有2GB,你可以通过mem=1GB
来禁止内核使用上面的1GB,然后再调用ioremap(0x40000000, 0x40000000)
来访问上面的1GB,只为你。 / p>
但是你知道,你应该将你的巨大缓冲区拆分成许多小缓冲区,它会更容易,更像现实生活中的应用程序。