如何创建 100M 字节缓冲区

发布于 2024-11-04 04:51:16 字数 113 浏览 0 评论 0原文

我正在测试 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

送舟行 2024-11-11 04:51:16

我认为 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 use ioremap.

For example, if you have 2GB, you can pass mem=1GB to forbid the kernel from using the upper 1GB, and later call ioremap(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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文