Я думал, что kmalloc не может выделить более 128 КБ, как вы получили его, чтобы выделить 1 МБ?
В любом случае, если вы работаете над недавно загруженной системой, вы можете зарезервировать до 2048 непрерывных страниц.Страницы обычно имеют размер 4 КБ, поэтому это составляет 8 МБ.
_get_free_pages(_GFP_DMA, get_order(2048));
Однако, если вам требуется больше памяти, вы должны выполнить выделение во время загрузки.Если вы пишете драйвер, это может быть достигнуто с помощью функций alloc_bootmem_*
.Если вы пишете модуль, вам нужно передать аргумент mem=
в ваше ядро, а затем использовать ioremap
.
Например, если у вас есть 2 ГБ, вы можете передать mem=1GB
, чтобы запретить ядруиспользуя верхний 1 ГБ, а затем позвоните ioremap(0x40000000, 0x40000000)
, чтобы получить доступ к верхнему 1 ГБ, только для вас.
Но вы знаете, вы должны просто разделить ваш огромный буфер на множество маленьких, это будет оченьпроще и намного больше, как в реальных приложениях.