Начиная с Linux 4.14, pgd
можно преобразовать в физический адрес страницы глобального каталога страниц, который будет использоваться в cr3
, вызвав __sme_pa
и передав ему pgd
.Обратите внимание, что младшие 12 битов возвращаемого значения (которые представляют ASID) равны нулю.Таким образом, ASID должен быть ИЛИ с ним.
До Linux 4.14 можно использовать __pa
вместо __sme_pa
, который не поддерживается.Обратите внимание, что __pa
эквивалентно __sme_pa
на процессорах Intel, поскольку SME доступно только на процессорах AMD.
По крайней мере, начиная с Linux 2.6, pgd
и cr3
могут быть или не быть эквивалентными в зависимости отдва фактора:
- Является ли
pgd
больше, чем виртуальный базовый адрес образа ядра __START_KERNEL_map
. phys_base
, что представляет собой разницу между временем компиляциифизический базовый адрес образа ядра и физический базовый адрес образа во время выполнения.Если изображение было перемещено, phys_base
не будет равно нулю.
Процесс перевода выполняется с помощью функции __ phys_addr , к которой вы можете обратиться, чтобы следовать следующим примерам.
Я проверял это на двух системах.В Linux 4.4.0 я получил следующие значения:
cr3 = 0x3581E000
pgd = 0x3581E000
__pa(pgd) = 0x3581E000
__START_KERNEL_map = 0x80000000
phys_base = 0x00000000
В этом случае pgd
и cr3
эквивалентны.В Linux 4.15:
cr3 = 0x8980A005
pgd = 0xC980A000
__pa(pgd) = 0x8980A000
__START_KERNEL_map = 0x80000000
phys_base = 0xEC000000