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

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

Ответы [ 4 ]

29 голосов
/ 03 января 2012

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

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

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

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

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

18 голосов
/ 03 января 2012

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

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

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

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

(Справочник - Общие сведения о ядре Linux - 2.6)

Shash

9 голосов
/ 03 января 2012

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

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

1 голос
/ 21 апреля 2015

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

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

...