На поверхности это кажется глупым вопросом. Некоторое терпение, пожалуйста..:-) Структурируем это qs на 2 части:
Часть 1: Я полностью понимаю, что RAM платформы отображается в сегмент ядра; esp на 64-битных системах это будет работать хорошо. Таким образом, каждый виртуальный адрес ядра действительно является просто смещением от физической памяти (DRAM).
Кроме того, я понимаю, что поскольку Linux - это современная операционная память, все адреса рассматриваются как виртуальные адреса и должны "идти" через аппаратное обеспечение - TLB/MMU - во время выполнения, а затем переводить TLB/MMU через таблицы подкачки ячеек. Опять же, это легко понять для процессов пользовательского режима.
ОДНАКО, как насчет виртуальных адресов ядра? Для эффективности было бы проще просто направить их (и отображение идентичности действительно настроено с PAGE_OFFSET и далее). Но все же, во время выполнения, виртуальный адрес ядра должен проходить через TLB/MMU и получить перевод правильно??? Это на самом деле? Или это виртуальный перевод ядра только для расчета смещения?? (Но как это может быть, поскольку мы должны пройти через аппаратное обеспечение TLB/MMU?). В качестве простого примера рассмотрим:
char *kptr = kmalloc(1024, GFP_KERNEL);
Теперь kptr - это виртуальный адрес ядра. Я понимаю, что virt_to_phys() может выполнять расчет смещения и возвращать физический адрес DRAM. Но здесь реальный вопрос: это невозможно сделать с помощью программного обеспечения - это было бы патетически медленным! Итак, вернемся к моему предыдущему моменту: он должен быть переведен через аппаратное обеспечение (TLB/MMU). Это действительно так?
Часть 2: Хорошо, скажем так, и мы используем подкачку в ядре, чтобы сделать это, мы должны, конечно, настроить таблицы подкачки ядра; Я понимаю, что это связано с swapper_pg_dir.
(Я также понимаю, что vmalloc() в отличие от kmalloc() - это особый случай - это чистый виртуальный регион, который подкрепляется физическими кадрами только при ошибке страницы).
Если (в части 1) мы заключаем, что преобразование виртуального адреса ядра выполняется через таблицы подкачки ячеек, то как именно таблица подкачки ядра (swapper_pg_dir) получает "присоединенную" или "сопоставленную" к процессу пользовательского режима?? Это должно произойти в коде контекстного переключения? Как? Где?
Eg.
На x86_64 2 процесса A и B являются живыми, 1 процессор.
A работает, поэтому он имеет более высокий канонический addr
0xFFFF8000 00000000 through 0xFFFFFFFF FFFFFFFF
"карта" к сегменту ядра, а нижний канонический адр
0x0 through 0x00007FFF FFFFFFFF
сопоставить с ним частное пользовательское пространство.
Теперь, если мы переводим контекст A- > B, то нижний канонический регион B процесса является уникальным. Но он должен "отображать" одно ядро! Как именно это происходит? Как мы "автоматически" ссылаемся на таблицу подкачки ядра, когда в режиме ядра? Или это неправильное утверждение?
Спасибо за ваше терпение, действительно оценил бы хорошо продуманный ответ!