2

Я запутался об этом заявлении:Почему у ядра есть отдельный виртуальный адрес для пользовательской страницы?

http://web.stanford.edu/class/cs140/projects/pintos/pintos_4.html#SEC63 От:

В Pintos, каждая виртуальная страница пользователя псевдонимов ее ядро ​​виртуальной страницы.

Я думал, что ядро ​​просто сможет использовать виртуальный адрес пользователя, чтобы ссылаться на страницу пользователя, с виртуальными адресами ядра над ним. Например, на приведенном ниже изображении не будет весь VAS всего от 0 до 4 ГБ, а виртуальное адресное пространство пользователя будет ограничено адресами ниже PHYS_BASE, в то время как ядро ​​может также получить доступ к адресам, расположенным над ним?

virtual memory map
(от http://web.stanford.edu/class/cs140/cgi-bin/section/10sp-proj3.pdf)

Это не похоже, как это работает, хотя, как документация Pintos продолжает:

Вы должны управлять этими псевдонимами как-то. Например, ваш код может проверять и обновлять доступные и грязные биты для обоих адресов. В качестве альтернативы ядро ​​могло бы избежать этой проблемы, только используя пользовательские данные через виртуальный адрес пользователя.

Это означает, что ядро ​​может получить доступ к пользовательским данным через отдельный виртуальный адрес ядра. Я не уверен, почему два адреса будут разными.

Спасибо за любое разъяснение.

+0

Хм .. это ответ? «Ядро не может напрямую манипулировать памятью, которая не отображается в адресное пространство ядра. Другими словами, ядро ​​нуждается в собственном виртуальном адресе для любой памяти, к которой он должен коснуться напрямую. Таким образом, на протяжении многих лет максимальный объем физической памяти, может быть обработано ядром, это количество, которое может быть отображено в части ядра виртуального адресного пространства, за вычетом места, необходимого для самого кода ядра ». от [http://www.makelinux.net/ldd3/chp-15-sect-1](http://www.makelinux.net/ldd3/chp-15-sect-1) – newt

+0

Но как же могло бы ядро ​​«избежать проблемы, только обращаясь к пользовательским данным через виртуальный адрес пользователя»? – newt

ответ

1

Для доступа к странице ее необходимо сопоставить в текущем виртуальном адресном пространстве.

Так, если ядро ​​хочет получить доступ к странице пользователя есть два решения:

  • Карта проезда страницу в нашем текущем адресном пространстве, адресное пространство ядра, и убедитесь, что две страницы записей в таблице остаются последовательными (вам не обязательно держать это в соответствии, но вы действительно хотите).
  • Переключение в адресное пространство, где эта страница уже отображается, собственный адрес пользователя пространство

Ваше ядро, кажется, выбирая вариант 1, который является хорошей вещью для работы. Переход на другое адресное пространство и обратно занимает довольно много времени. Вместо этого он может выбрать вариант 2 и переключиться на адресное пространство пользователя каждый раз, когда захочет получить доступ к странице пользователя, это, возможно, упростит код, избегая некоторых бухгалтерских операций, но это будет ужасно медленным.

+0

Для варианта 2, если ядро ​​переключается на собственное адресное пространство пользователя для доступа к странице, это означает, что он находится в пользовательском режиме сейчас, правильно? Разве это не означает, что у него больше нет каких-либо привилегий ядра, чтобы делать то, что он хотел сделать на странице пользователя? – newt

+1

Нет, вы можете переключать адресное пространство, не переходя в пользовательский режим. На x86 для переключения адресного пространства вам просто нужно загрузить новое значение в cr3. Чтобы перейти к usermode, вам нужно сделать некоторые трюки с инструкцией iret. Совершенно разные вещи. cr3 - это регистр, который содержит указатель на структуру пейджинга верхнего уровня. – tux3

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