Что такое порядок без знака int на странице структуры функции * alloc_pages () - PullRequest
0 голосов
/ 03 апреля 2019

struct page* alloc_pages(gfp_t gfp_mask, unsigned int order) - функция, используемая для выделения страницы в ядре. Так что это выделит 2 смежных физических страницы порядка. Таким образом, это означает, что страницы будут распределяться в порядке 1,2,4,8,16 и так далее. Что делать, если нужны только 3 страницы или 5, 9 и т. Д.

Ответы [ 3 ]

1 голос
/ 03 апреля 2019

С ссылка предоставлена ​​tkausl :

Порядок - это количество двух страниц, выделяемых

Так alloc_pages(gfp_mask, 3) выделит 8 страниц. alloc_pages(gfp_mask, 4) выделит 16 страниц и т. Д.

0 голосов
/ 04 апреля 2019

Если вам нужно точное количество страниц, звоните 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() выглядит следующим образом:

  1. Используйте указанный размер в байтах, чтобы определить мощность двух «порядка страниц» для выделения.
  2. Позвоните alloc_page() (через __get_free_pages()), чтобы выделить одну «составную страницу» определенного порядка страниц, которая состоит из степени двух чисел отдельных страниц.
  3. Позвоните split_page(), чтобы разделить составную страницу на отдельные страницы.
  4. Позвоните free_page() на любых ненужных страницах в конце выделения.

Реализация free_pages_exact() использует указанный размер (который должен соответствовать размеру, переданному в alloc_pages_exact()), чтобы определить количество отдельных страниц, которые нужно освободить, и освобождает столько смежных страниц (путем вызова free_page()), начиная с указанный виртуальный адрес.

0 голосов
/ 03 апреля 2019

alloc_pages выделяет непрерывную страницу кадров из физической памяти.Разумеется, ядро ​​Linux имеет этот псевдоним.

Я полагаю, что оно использует распределитель друзей .

В большинстве случаев вам даже не нужны непрерывные рамки страницы.Это в основном необходимо только для оборудования, которое выполняет передачу DMA или подобное.Очень маловероятно, что вам понадобится 9 непрерывных кадров.Если вы действительно это сделаете, вы выделите 16 страниц и освободите оставшиеся 7, например order=0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...