как скопировать с одной физической страницы на другую в ядре - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть список из 16, 4K физических страниц (представленных struct page), которые я хочу собрать в одну непрерывную огромную страницу размером 64KB.Это, конечно, должно быть сделано в ядре.Прямо сейчас я делаю это следующим образом (ниже могут быть ошибки, это просто для идеи):

struct page *huge_page = alloc_pages(gfp_flags, get_order(16*PAGE_SIZE));
char *gather_buff = (char *)kmap(huge_page); 
for (i = 0; i < 16; i++) {
     char* tmp_addr = (char *)kmap(small_pages_arr[i]);
     memcpy(gather_buff + i*PAGE_SIZE, tmp_addr, PAGE_SIZE);
     kunmap(small_pages_arr[i]);
}
kunmap(huge_page);

Боюсь, что kmap / kunmap очень неэффективна в плане производительности и задалась вопросом,есть другой способ сделать это?(Посмотрел copy_on_write для справки, но должен признать, что там потерялся)

Спасибо!

1 Ответ

0 голосов
/ 09 декабря 2018

Я считаю, что kmap / kunmap представляет собой простую арифметическую операцию с указателем в системах x86_64, поэтому она не должна существенно влиять на производительность.

В этом вопросе есть еще несколько подробностей о высокой памяти в 64-битных системах.: Почему для 64-битного процессора не существует большой памяти?

...