Как kmalloc () и vmalloc () используются в 32-битных и 64-битных системах? - PullRequest
2 голосов
/ 29 мая 2019

Архитектура: X86, Linux

Я прошел несколько потоков, связанных с kmalloc() и vmalloc(), и я знаю основные различия между ними, но у меня все еще есть некоторые сомнения.Мне нужна ваша помощь, чтобы понять основы.

Итак, поскольку мы знаем, что в 32-разрядных системах виртуальное адресное пространство разделено между пользователем и ядром.Высокие адреса памяти 1 ГБ выделяются для ядра, а нижние 3 ГБ - для пространства пользователя.

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

  1. Таким образом, из 1 ГБ 896 МБ отображается в 1: 1 (физически смежно) с логическим адресом ядра, а 128 МБ используется дляДоступ к старшим адресам памяти означает доступ к физическому (ОЗУ) за пределами 896 МБ путем сопоставления его с 128 МБ с использованием vmalloc()?(давайте рассмотрим, что у нас 2 ГБ ОЗУ)

  2. И что произойдет, если у нас будет только 1 ГБ физической ОЗУ в точке 1. 896 МБ - это соотношение 1: 1 между логическим адресом ядра и физическимадреса, достигнутые с помощью kmalloc ().Тогда какой смысл использовать 128 МБ, зачем нам больше vmalloc()?Допустим, если у нас есть 1 ГБ ОЗУ, доступ к которому полностью возможен через логический адрес ядра, то это означает, что это возможно только тогда, когда объем памяти, запрашиваемый потоком / процессом, может быть выделен в физически смежных адресах.И если нет доступной физической смежной памяти, в этом случае выделенная память не будет физически смежной, поэтому нам нужно использовать vmalloc(), чтобы отобразить ее в 128 МБ пространства и получить к ней доступ через нее?

  3. Что происходит, когда мы используем 64-битную систему?Правда ли, что и kmalloc(), и vmalloc() могут иметь огромное количество адресного пространства и иметь доступ ко всей оперативной памяти?

...