Если вам нужно точное количество страниц, звоните alloc_pages_exact()
. Он принимает желаемый размер в байтах и флаги GFP и возвращает выровненный адрес страницы. Вызовите free_pages_exact()
с тем же размером, который был передан alloc_pages_exact()
, чтобы освободить память.
#define MY_BUF_SIZE 20000 /* size in bytes */
...
mydev->buf = alloc_pages_exact(MY_BUF_SIZE, GFP_KERNEL);
...
if (mydev->buf)
free_pages_exact(mydev->buf, MY_BUF_SIZE);
Обратите внимание, что реализация alloc_pages_exact()
выглядит следующим образом:
- Используйте указанный размер в байтах, чтобы определить мощность двух «порядка страниц» для выделения.
- Позвоните
alloc_page()
(через __get_free_pages()
), чтобы выделить одну «составную страницу» определенного порядка страниц, которая состоит из степени двух чисел отдельных страниц.
- Позвоните
split_page()
, чтобы разделить составную страницу на отдельные страницы.
- Позвоните
free_page()
на любых ненужных страницах в конце выделения.
Реализация free_pages_exact()
использует указанный размер (который должен соответствовать размеру, переданному в alloc_pages_exact()
), чтобы определить количество отдельных страниц, которые нужно освободить, и освобождает столько смежных страниц (путем вызова free_page()
), начиная с указанный виртуальный адрес.