Подтвердить что ты не робот

Почему для ядра требуется виртуальная адресация?

В Linux каждый процесс имеет свое виртуальное адресное пространство (например, 4 ГБ в случае 32-разрядной системы, где 3 ГБ зарезервировано для процесса и 1 ГБ для ядра). Этот механизм виртуальной адресации помогает изолировать адресное пространство каждого процесса. Это понятно в случае процесса, поскольку существует много процессов. Но так как у нас есть только 1 ядро, почему нам нужна виртуальная адресация для ядра?

4b9b3361

Ответ 1

Причина, по которой ядро ​​является "виртуальным", заключается не в том, чтобы обрабатывать пейджинг как таковой, потому что процессор может работать только в одном режиме за раз. Поэтому, как только вы включите отображение постраничной памяти (бит 31 в CR0 на x86), процессор ожидает, что ВСЕ обращения к памяти пройдут через механизм отображения страниц. Поэтому, поскольку мы хотим получить доступ к ядру даже после того, как мы включили пейджинг (виртуальную память), он должен существовать где-то в виртуальном пространстве.

"Сохранение" памяти больше связано с "простым способом определить, является ли адрес ядром или пользовательским пространством", чем что-либо еще. Было бы вполне возможно поставить немного ядра по адресу 12345-34121, еще один бит ядра на 101900-102400 и еще один бит ядра на 40000000-40001000. Но это сделало бы жизнь трудной для каждого аспекта ядра и пользовательского пространства - были бы пробелы/дыры, с которыми можно было бы справиться [уже есть такие дыры/зазоры, но больше не будет точно помогать вещи]. Установив фиксированный предел для "пользовательского пространства отсюда до здесь, ядро ​​от конца пользовательского пространства до X", это делает жизнь намного проще в этом отношении. Мы можем просто сказать kernel = 0; if (address > max_userspace) kernel=1; в некотором коде.

Конечно, ядро ​​n занимает столько же ФИЗИЧЕСКОЙ памяти, сколько и будет на самом деле - так общее рассуждение о том, что "это отходы, чтобы взять целый гигабайт для ядра", неверно - ядро ​​само по себе - дюжина или около того для очень "большого" ядра) мегабайт. Загружаемые модули могут легко добавлять до нескольких мегабайт, а графические драйверы от ATI и nVidia - это просто несколько мегабайт только для модульного ядра для этого самого. Ядро также использует некоторые бит памяти для хранения "данных ядра", таких как задачи, очереди, семафоры, файлы и другие "вещи", с которыми имеет дело ядро. Для этого также используется несколько мегабайт.

Ответ 2

Управление виртуальной памятью - это функция Linux, которая обеспечивает многозадачность в системе без каких-либо ограничений. задачи или объема памяти, используемой каждой задачей. Подсистема Linux Memory Manager (наряду с оборудованием MMU) облегчает поддержку VMM, к которой осуществляется доступ к памяти или mem-сопоставленному устройству через виртуальные адреса. Внутри Linux все, как ядро, так и пользовательские компоненты, работает с виртуальным адресом, за исключением случаев использования реального оборудования. Это, когда Memory Manager занимает свое место, выполняет преобразование виртуального физического адреса и указывает на физическое расположение mem/dev.

Процесс представляет собой абстрактный объект, определенный ядром, для которого выделяются системные ресурсы для выполнения программы. В Linux Process Management ядро ​​является интегрированной частью карты памяти процесса. Процесс имеет две основные области, такие как две грани одной монеты:

  • Пользовательское пространство - содержит разделы пользовательской программы (код, данные, стек, куча и т.д.), используемые процессом
  • Просмотр пространства ядра - содержит структуры данных ядра, которые поддерживают информацию (PID. States, FD, Resource Usage и т.д.) о процессе

    enter image description here

Каждый процесс в системе Linux имеет уникальный и отдельный регион пользовательского пространства. Эта функция Linux VMM изолирует все разделы программы процесса от одного и другого. Но все процессы в системе разделяют общую область пространства ядра. Когда процессу требуется служба из ядра, он должен выполнить код ядра в этом регионе, или, другими словами, ядро ​​выполняет от имени запроса пользовательского процесса.