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

Архитектура: 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() может иметь огромное количество адресного пространства и иметь доступ ко всей оперативной памяти?

0 ответов

Другие вопросы по тегам