Каков наилучший способ зарезервировать очень большое виртуальное адресное пространство (ТБ) в ядре?
Я пытаюсь вручную обновить TLB для перевода новых страниц виртуальной памяти в определенный набор физических страниц в пространстве ядра. Я хочу сделать это в do_page_fault
так что всякий раз, когда инструкция загрузки / сохранения происходит в определенном виртуальном диапазоне адресов (еще не назначен), он заранее помещает запись таблицы страниц в TLB. Перевод прост. Например, я хотел бы, чтобы следующий фрагмент кода работал правильно:
int d;
int *pd = (int*)(&d + 0xffff000000000000);
*pd = 25; // A page fault occurs and TLB is updated
printk("d = %d\n", *pd); // No page fault (TLB is already up-to-date)
Таким образом, перевод является лишь вычитанием 0xffff000000000000
, Мне было интересно, как лучше всего реализовать функциональность обновления TLB?
Изменить: Основная причина для этого заключается в том, чтобы иметь возможность зарезервировать большое пространство виртуальной памяти в ядре. Я просто хочу обрабатывать ошибки страниц в определенном диапазоне адресов в ядре. Итак, сначала я должен зарезервировать диапазон адресов (возможно, превышает ограничение в 100 ТБ). Затем я должен реализовать кеш страниц для этого конкретного диапазона. Если это невозможно, что является лучшим решением для этого?