Чтобы ответить на ваш вопрос, вам нужно больше узнать о ядре и методах, которые оно использует для управления ресурсами (ЦП, памятью, ...) и обеспечить элегантную абстракцию программам приложения.
Во-первых, я хочу пояснить, что « Виртуальная память » - это метод управления памятью, используемый в современных операционных системах; который обеспечивает различные преимущества, такие как изоляция процессов, то есть защита, позволяет запускать несколько программ вместе, позволяет программам, размер которых больше, чем физическая память, присутствующая в системе.
В соответствии с этой техникой снова есть два термина «Виртуальная память» и «Виртуальное адресное пространство»; которые не одинаковы, но все же тесно связаны.
(Вам будет интересно, как виртуальная память является одновременно и техникой, и концепцией, но да, это правильно, и вы поймете это ниже)
В информатике слово « память » имеет два значения. Первый - это то, что вы можете использовать для хранения данных (регистры, кэш, RAM, ROM, HDD и т. Д.). Второй - для синонима первичной памяти (то есть RAM ).
Когда вы заменяете слово на слово, «Виртуальный Память » - это не что иное, как «Виртуальный ОЗУ ». Это общий объем доступного пространства в системе, в течение которого программы загружаются для выполнения. Так что это не что иное, как физическая память RAM + память подкачки на вторичной памяти, выделенной ядром.
Таким образом, если у вас есть 2 ГБ ОЗУ и 4 ГБ пространства подкачки, выделенного ядром во время установки, то Виртуальная память вашей системы составляет 6 ГБ. Я не собираюсь объяснять больше о памяти подкачки здесь, поскольку это больше отошло бы от темы.
Переход к виртуальному адресному пространству.
Поэтому, чтобы понять это, вам нужно немного настроить свой разум. Как говорит само название «Виртуал», адресного пространства на самом деле нет! Это всего лишь иллюзия, созданная ядром для программистов приложений (для достижения многих преимуществ, как я упоминал в параграфе 2)
Таким образом, каждому процессу ядру предоставляется отдельное виртуальное адресное пространство. (Если бы в системе не было Ядра, и если бы вы запустили свою прикладную программу на оборудовании, тогда она использовала бы физическое адресное пространство, то есть RAM, в качестве своего адресного пространства)
Таким образом, на машине с 32-разрядными адресными регистрами ядро может предоставить виртуальное адресное пространство 2 ^ 32 = 4 ГБ для каждого процесса. (Таким образом, этот диапазон виртуального адресного пространства изменяется с архитектурой HW. Последние процессоры имеют 48-битные регистры адресов, поэтому они могут обеспечить виртуальное адресное пространство 2 ^ 48 = 256 ТБ)
И, что важно, это виртуальное адресное пространство просто в воздухе !! Вы бы сейчас подумали, если оно просто в воздухе, как вообще можно выполнить код, данные процесса. Да, это должно быть сопоставлено с физической памятью. То, как оно сопоставляется с физической памятью, управляется ядром с помощью концепции, называемой подкачкой.
Итак, теперь вы можете увидеть, как ядро достигло изоляции процесса с помощью виртуального адресного пространства. Таким образом, адрес, который может генерировать каждый процесс, составляет от 0 до 4 ГБ (при условии, что для простоты система имеет 32-разрядный адресный регистр), то есть в пределах своей полноты. И он ничего не знает ни о каком другом процессе, запущенном в системе. Так что каждый процесс упакован в отдельном пространстве.
Так что код ядра также похож на другой процесс / сущность. Так что, если бы ядро находилось в совершенно другом адресном пространстве. Тогда не было средств для взаимодействия прикладных программ с ядром. Если приложение не может обмениваться данными с ядром, а ядро не может обмениваться данными с приложением, тогда ядро не может управлять системой.
Итак, вопрос теперь - Как заставить процессы приложения взаимодействовать с ядром? Возможен вариант: если код ядра присутствует в виртуальном адресном пространстве процесса приложения, они могут взаимодействовать друг с другом. Вот почему код ядра присутствует в каждом виртуальном адресном пространстве процесса, потому что каждый процесс должен взаимодействовать с ядром. Не волнуйтесь, код ядра физически не дублируется для каждого процесса. Как я упоминал ранее, VAS - это всего лишь иллюзия, поэтому в физической памяти будет только одна копия кода ядра, и на него будут ссылаться все виртуальные адресные пространства (через пейджинг).
В случае Linux ядро будет помещено в верхнее адресное пространство между C000 0000 и FFFF FFFF (то есть причина, по которой 1 ГБ зарезервировано для ядра в VAS), а остальные 3 ГБ (от 0000 0000 до BFFF FFFF) разрешены прикладной программе для использовать. Виртуальное адресное пространство, в котором находится ядро, называется пространством ядра, а место, в котором находится прикладная программа, называется пространством пользователя.
Если бы вы внимательно наблюдали, то у вас возник бы вопрос: если код приложения и код ядра находятся в одном и том же виртуальном адресном пространстве, и поскольку ядро находится в хорошо предопределенном адресном расположении, то это невозможно для кода приложения, чтобы повредить код ядра! Ой, поначалу это кажется возможным, но это невозможно.
Причина - это защищено с помощью HW. На процессоре будет установлен флажок, который указывает, является ли режим выполнения режимом SUPERVISOR или режимом пользователя. Код пространства ядра должен выполняться в режиме SUPERVISOR (установка соответствующего флага), а код пространства пользователя должен выполняться в режиме пользователя. Так что, если вы находитесь в режиме USER и пытаетесь получить доступ / изменить код в пространстве ядра, возникает исключение! (процессор узнает его по адресу, к которому пытается обратиться инструкция. Если он выше C000 0000, он может легко обнаружить, что пытается получить доступ к коду пространства ядра, и текущий режим выполнения не имеет соответствующих разрешений, поскольку флаг устанавливается с разрешения USER MODE). Просто примечание: в режиме SUPERVISOR процессор обеспечивает доступ к дополнительному набору команд.
Я надеюсь, что если вы поймете эту концепцию, вы сможете ответить на свой вопрос. Я ответил прямо на многие ваши вопросы, объясняя саму концепцию.