Разница между виртуальным адресом ядра и логическим адресом ядра?

Я не могу точно разделить логический адрес ядра и виртуальный адрес. В книге драйверов устройств Linux говорится, что все логические адреса являются виртуальным адресом ядра, а виртуальный адрес не имеет никакого линейного отображения. Но логически разумно, когда мы говорим, что это логично, и когда мы говорим виртуально и в какой ситуации мы используем эти два?

Ответы

Ответ 1

Ядро Linux отображает большую часть виртуального адресного пространства, принадлежащего ядру, для выполнения отображения 1:1 со смещением первой части физической памяти. (немного меньше, чем для 1Gb для 32-битного x86, может быть другим для других процессоров или конфигураций). Например, для кода ядра на x86 адрес 0xc00000001 отображается на физический адрес 0x1.

Это называется логическое отображение - сопоставление 1:1 (со смещением), которое позволяет ядру получать доступ к большей части физической памяти машины.

Но этого недостаточно - иногда мы имеем физическую память размером более 1 ГБ на 32-битной машине, иногда мы хотим ссылаться на непересекающиеся блоки физической памяти как смежные, чтобы сделать вещи простыми, когда-то мы хотим отображать области IO с отображением памяти, которые являются а не ОЗУ.

Для этого ядро ​​держит область в верхней части своего виртуального адресного пространства, где она выполняет "случайную" страницу для сопоставления страниц. Отображение там не следует шаблону 1:1 области логического отображения. Это то, что мы называем виртуальным отображением.

Важно добавить, что на многих платформах (пример x86) логическое и виртуальное сопоставление выполняются с использованием того же аппаратного механизма (TLB, управляющего виртуальной памятью). Во многих случаях "логическое отображение" фактически выполняется с использованием средства виртуальной памяти процессора, поэтому это может быть немного запутанным. Разница, таким образом, является шаблоном, согласно которому выполняется сопоставление: 1:1 для логического, что-то случайное для виртуального.

Ответ 2

В основном существует 3 вида адресации, а именно

  • Логическая адресация: Адрес формируется базой и смещением. Это не что иное, как сегментированная адресация, где адрес (или смещение) в программе всегда используется с базовым значением в дескрипторе сегмента
  • Линейная адресация: также называется виртуальным адресом. Здесь адреса являются смежными, но физический адрес - нет. Для реализации этого используется пейджинг.
  • Физическая адресация: фактический адрес в основной памяти!

Теперь, в linux, память ядра (в адресном пространстве) превышает 3 ГБ (от 3 до 4 ГБ), то есть 0xc000000. Адреса, используемые ядром, не являются физическими адресами. Для сопоставления виртуального адреса используется PAGE_OFFSET. Необходимо следить за тем, чтобы не выполнялся перевод страницы. т.е. эти адреса являются смежными по своей природе. Однако есть предел для этого, т.е. 896 МБ на x86. Помимо того, что для перевода используется пейджинг. Когда вы используете vmalloc, эти адреса возвращаются для доступа к выделенной памяти.

Короче говоря, когда кто-то ссылается на виртуальную память в контексте пользовательского пространства, то это происходит через пейджинг. Если упоминается виртуальная память ядра, это либо PAGE_OFFSETed, либо vmalloced адрес.

(Ссылка - понимание ядра Linux - на основе 2.6)

Шаш

Ответ 3

Логические адреса ядра - это сопоставления, доступные для кода ядра, через обычные функции доступа к памяти ЦП. В 32-битных системах существует только 4 ГБ логического адресного пространства ядра, даже если используется больше физической памяти. Логическое адресное пространство, поддерживаемое физической памятью, может быть выделено с помощью kmalloc.

Виртуальные адреса не обязательно имеют соответствующие логические адреса. Вы можете выделить физическую память с помощью vmalloc и вернуть виртуальный адрес, у которого нет соответствующего логического адреса (например, в 32-разрядных системах с PAE). Затем вы можете использовать kmap для назначения логического адреса этому виртуальному адресу.

Ответ 4

Проще говоря, виртуальный адрес будет включать в себя "высокую память", которая не выполняет сопоставление 1:1 для физического адреса, если размер вашей оперативной памяти больше, чем диапазон адресов ядра (как правило, для 1G/3G в X86, ваша оперативная память - 3G, но диапазон адресов ядра - 1G), а также возврат адреса от kmap() и vmalloc(), для чего ядро ​​должно установить таблицу страниц для сопоставления памяти. поскольку логический адрес всегда является памятью, отображаемой ядром (сопоставление 1:1), вам не нужно явно обращаться к API ядра, например set_pte, чтобы настроить запись таблицы страниц для конкретной страницы.

поэтому виртуальный адрес не может быть логическим адресом все время.