2013-07-03 78 views
0

malloc()分配內存塊,該內存塊在進程內存空間內虛擬連續。 malloc()將大小作爲參數以字節爲單位並返回指向已分配內存空間的指針,但如果要求分配4k對齊的內存,該怎麼辦?如何分配4K對齊的內存

+0

你可能是指'對齊'而不是'aliened' –

+0

也許你應該[讀這個問題](http://stackoverflow.com/questions/227897/solve-the-memory-alignment-in-c-interview-question -that-stumped-me/227900#227900)這是一個非常類似的問題,儘管對於一般的(而不是Linux特定的)域。 – Jubatian

回答

1

由於4KB的往往是一個頁面的大小(見sysconf(3)_SC_PAGESIZE還是老getpagesize(2)系統調用),你可以使用系統調用mmap(2)(用於通過mallocposix_memalign),以獲得4Kaligned內存。

+0

請注意,如果直接使用'mmap()',則可能會發現自己的內存較少。在最簡單的情況下,從'mmap()'分配4個KiB塊給出了最大256Mb的總內存分配量,因爲'mmap()'區域的數量有2^16個限制。 –

+1

我不認爲對於mmap編輯段的數量有2^16的限制。我的[manydl.c](http://starynkevitch.net/Basile/manydl.c)示例能夠創建數十萬個'dlopen'(並且它們每個都使用多個'mmap' -ed段)。 –

0

你不能在用戶空間分配物理上連續的內存。因爲在用戶空間內核總是從highmem區域分配內存。但是,如果您正在編寫內核模塊或系統空間代碼,則可以使用_get_page()或_get_pages()。

+0

函數posix_memalign()分配大小字節並將分配的內存地址放置在* memptr中。分配內存的地址將是多重對齊,它必須是2的冪和sizeof(void *)的倍數。如果size爲0,那麼放置在* memptr中的值可以是NULL,也可以是稍後可以成功傳遞給free(3)的唯一指針值。 – LtWorf