如何创建 100M 字节缓冲区
我正在测试 Linux 上接口的吞吐量。我正在使用 DMA 进行数据传输。 DMA 需要连续的内存位置。但 kmalloc 无法分配超过 1MB 的空间。有没有其他方法可以创建高达 100M 字节的大缓冲区位置?
I am testing the throughput of an interface on Linux. I am using the DMA todo the data transfer. DMA needs contiguous memory location. But the kmalloc is unable to allocate more then 1MB. Is there any other way to create big buffer location upto 100M Bytes?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我认为 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,专为您而设。但你知道,你应该将巨大的缓冲区分成许多小的缓冲区,这会更容易,而且更像现实生活中的应用程序。
I thought kmalloc couldn't allocate over 128kB, how did you get it to allocate 1MB ?
Anyway, assuming you're working on a freshly booted system, you can reserve up to 2048 contiguous pages. Pages are generally 4k, so this makes 8MB.
_get_free_pages(_GFP_DMA, get_order(2048));
However, if you need more memory, you should do the allocation at boot-time.
If you are writing a driver, this can be achieved with the
alloc_bootmem_*
functions.If you are writing a module, you have to pass
mem=
argument to your kernel and later useioremap
.For example, if you have 2GB, you can pass
mem=1GB
to forbid the kernel from using the upper 1GB, and later callioremap(0x40000000, 0x40000000)
to get access to the upper 1GB, just for you.But you know, you should just split your huge buffer into many small ones, it'll be much easier and much more like real-life applications.