2015-05-30 2 views
0

В 64-битном Linux, IA-32E paging используется с 4 уровней пейджинговых структур (PML4/PDPT/PD/PT). Записи в предыдущих трех структурах дают физический адрес соответствующей следующей структуры. Мой вопрос вопрос заключается в том, будут ли отображаться физические адреса всех этих структур поискового вызова в таблице поискового вызова? Если они отображаются, в каком режиме (User/Supervisor)? Огромное спасибо!Будут ли физические адреса всех пейджинговых структур в Linux быть отображены в таблицах страниц

Я захватил некоторые конкретные адреса памяти, к которым обращались vcpu в течение периода в KVM. Эти адреса находятся в форме gfn (гостевой номер физического кадра). Я хотел сказать, были ли эти gfns отображены в ядре или в пользовательском пространстве. Поэтому я просмотрел таблицу подкачки гостя (виртуальная машина), чтобы найти соответствующие записи в таблице таблиц для этих gfns. См. Мой предыдущий вопрос here.

Я обнаружил, что физические адреса некоторых структур поискового вызова отображаются в таблице поискового вызова, а некоторые нет. То есть физические адреса некоторых структур поискового вызова (такие как адрес PT, заданный PDE), не имеют действительного соответствующего PTE в таблице страниц. Поскольку я часто менял механизм памяти , я боюсь, что, возможно, это явление вызвано моим кодом или, может быть, что-то не так с моим кодовым кодом.

Так что я хочу знать в нормальном Linux, как обрабатываются эти материалы.
Большое спасибо!

+0

Если это не так, как ядро ​​получить доступ к таблицам страниц, когда включена виртуальная память? –

+0

@AlexHoppus Да, я заметил это раньше. Но то, что показывает эксперимент, сбивает с толку, я хочу это подтвердить. Благодаря! – tamlok

ответ

2

В 64-разрядной версии Linux все физические адреса всегда сопоставляются с отображением Supervisor в половине ядра адресного пространства.

Вы можете преобразовать физический адрес в соответствующий виртуальный адрес в линейном сопоставлении ядра, добавив PAGE_OFFSET, который на x86-64 равен 0xffff880000000000.

Вы уверены, что используете правильную обработку 1 ГБ и 2 МБ "огромных страниц" в своем браузере?

+0

О, спасибо за подтверждение. Я запускаю 'getconf PAGE_SIZE' у гостя, и он сказал' 4096'. Таким образом, размер страницы составляет 4 КБ? Linux не будет смешивать страницы 4 КБ и 2 МБ одновременно, не так ли? Я попытаюсь сделать этот эксперимент в официальной базе KVM позже. Огромное спасибо! :) – tamlok

+1

Да, Linux действительно смешивает размеры страниц. В частности, когда он отображает всю физическую память для линейного отображения ядра, он использует самые большие сопоставления, которые он может уменьшить для давления TLB. – caf

+0

Удивительно! Раньше я этого не знал. Я проверил его только сейчас, и он показал, что существует 2MB огромных страниц. Итак, хотя я еще не подтвердил это, я думаю, что эти «отсутствующие» физические адреса пейджинговых структур могут быть расположены прямо в середине огромной страницы. Огромное спасибо! – tamlok

0

В обычном linux CR3 содержится PA кадра, содержащего PML4 таблицы страниц. последние бит виртуального адреса смещены в этом кадре. данные при этом смещении содержат PA для рамки страницы для следующего уровня. Таким образом осуществляется обращение к соответствующему кадру страницы, содержащему требуемые данные. Эти адреса, содержащие структуры РТ, не отображаются в любой таблице страниц.

В случае KVM гостевые физические страницы представляют собой виртуальные адреса, смонтированные ядром. Те адреса, которые используются гостем, нуждаются в сопоставлении с физическими кадрами, которые являются обязанностью и усмотрением ядра хоста. Таким образом, ядро ​​хоста может отображать некоторые страницы, а не другие в соответствии со своим собственным алгоритмом. Итак, если некоторые gfn отображаются, а другие - не вполне естественные и правильные явления.

 Смежные вопросы

  • Нет связанных вопросов^_^