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