У меня есть список из 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 для справки, но должен признать, что там потерялся)
Спасибо!