подкачка x86 в ядре linux с помощью mmu

В архитектуре x86, ядро ​​Linux 2.6.x, 32-битная система

Я так понимаю, что виртуальный адрес 0xC0000000 ~ 0xFFFFFFFF

зарезервировано для ядра.

и этот виртуальный адрес может быть преобразован в физический адрес с помощью

вычитая 0xC0000000.

однако я думаю, что даже результат такой же, MMU переведет

виртуальный адрес ядра (например, 0xC0851000) на физический адрес путем просмотра таблицы страниц.

Такие как

CR3 -> каталог страниц -> таблица страниц -> PFN.

я прав или нет? Пожалуйста, поправьте меня, если я ошибаюсь.

Мне нужно разработать аппаратный монитор ядра в 32-битной системе x86, linux.

поэтому мне нужно знать эту проблему

пожалуйста помоги.


person daehee    schedule 23.07.2012    source источник
comment
и этот виртуальный адрес может быть преобразован в физический адрес путем вычитания 0xC0000000 --- нет, нет, нет. MMU переводит некоторый адрес в некоторый другой физический адрес. Смежные виртуальные адреса не обязательно являются непрерывными физическими адресами или в каком-либо конкретном диапазоне адресов. Только адреса на одной и той же странице размером 4 КБ (или 2 МБ с огромными страницами) действительно могут быть смежными друг с другом.   -  person Damon    schedule 23.07.2012
comment
ты уверен в этом? потому что я видел много статей, в которых описывается, в отличие от виртуальной памяти пользовательского пространства и области highmem, виртуальный адрес ядра (0xC0000000 ~ 0xFFFFFFFF) линейно отображается на физическую память ... (поэтому __va, __pa просты)   -  person daehee    schedule 24.07.2012
comment
Конечно, это возможно для простоты, и Linux может даже делать это на некоторых архитектурах. Но у вас нет гарантии, что это так, и нет гарантии, что это не изменится завтра. Как правило, логические адреса преобразуются в физические непонятным образом (непонятным для вас, а не для ОС), без четкого соотношения 1: 1 и без четких правил нахождения по определенному адресу (нет правил, о которых вы знаете) или рядом с адресом на любой другой странице.   -  person Damon    schedule 24.07.2012
comment
спасибо, кажется, ты прав!   -  person daehee    schedule 01.08.2012


Ответы (2)


Что касается логических адресов ядра, вы правы. Однако виртуальные адреса ядра, как и память, выделенная vmalloc, не обязательно имеют однозначное соответствие физическим адресам, которые характеризуют логическое адресное пространство.

Просто имейте в виду, что логические адреса ядра не всегда переводятся в физические путем вычитания смещения (это верно для x86, но не, скажем, AVR32).

person Michael Foukarakis    schedule 24.07.2012

"и этот виртуальный адрес может быть преобразован в физический адрес с помощью

вычитание 0xC0000000 "

поскольку таблицы страниц для виртуальных адресов ядра настроены таким образом, люди придумали упомянутый вами ярлык.

person appusajeev    schedule 29.10.2012