Как kmalloc() и vmalloc() используются в 32-битных и 64-битных системах?
Архитектура: 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()
может иметь огромное количество адресного пространства и иметь доступ ко всей оперативной памяти?