2011-05-01 104 views
4

我正在測試Linux上接口的吞吐量。我正在使用DMA來處理數據傳輸。 DMA需要連續的內存位置。但是kmalloc無法分配更多的1MB。有沒有其他方法可以創建高達100M字節的大緩衝區?Howto創建100M字節緩衝區

+0

相關http://stackoverflow.com/questions/116343/what-is-the-difference-between-vmalloc-and-kmalloc – 2011-05-01 05:05:54

回答

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,僅供您使用。

但是你知道,你應該把你的巨大緩衝區分成許多小的緩衝區,它會更容易,更像真實的應用程序。

+0

謝謝Heandel。我正在寫司機。已經嘗試過使用便箋式方法,並且在中間沒有成功。讓我再試一次:) – Midson 2011-05-01 13:25:40

+0

最初,我也認爲,kmalloc不能分配更多,然後128KB。但在我的測試中,它分配了950KB。順便說一下,測試是在ARM上進行的。會不會有任何拱門特定差異? – Midson 2011-05-01 13:43:44