3

Привет Я новичок в разработке ядра Linux. Поэтому хочу получить некоторую ясность для следующего утверждения.В linux каждому процессу предоставляется 4 ГБ виртуального адресного пространства, учитывая 32-битную архитектуру

*> В памяти, каждый процесс дается 4 Гб виртуального адресного пространства

с учетом 32-разрядной архитектурой. Нижние виртуальные адреса 3Гба доступных для пользователя пространства части процесса и верхнего 1Гба доступно для ядра пространства части. *

  1. Означает ли это, что каждый процесс в Linux выделяется, что многое память 1 ГБ + 3 ГБ?
  2. Если да, то есть сотни процессов в Linux, поэтому 100 * 4 ГБ пространства, откуда система получает столько места в памяти?
  3. Какое отношение имеет отношение к стеку ядра и стек пользователя?
  4. У каждого процесса в Linux есть ядро ​​и пользовательский стек?
+3

Вы должны знать, как виртуальная память работает. Существует физическая память (фактическая ОЗУ) и виртуальная память (сопоставление с ОЗУ, которое может существовать или нет). 4Gb - предел отображений (что не обязательно использовать полностью). – myaut

ответ

3

Введение

Linux, как и большинство современных операционных систем, использует виртуальные страницы, предоставляемые большинство современных архитектур, включая семейство x86.

В системе с виртуальной памятью физическая память (фактический ресурс ОЗУ) является абстрактной из процесса, выполняющегося в системе. Адресное пространство - это всего лишь номера, в которых память может be.

пейджинга

памяти может быть отображен (поместить по адресу) в страниц которых является архитектура зависит размер куска памяти. Поэтому, если вы хотите поместить память на какой-то адрес, чтобы процесс мог его использовать, вам нужно будет выбрать выравниваемый номер страницы (кратный размеру страницы) и разместить по крайней мере одну страницу.

Защита

Виртуальная память позволяет также для защиты памяти, которая устанавливает, какие разрешения процесса будет иметь. Когда исполняемая память процесса отображается (инструкции, которые она выполняет для выполнения каких-либо действий), это только чтение/выполнение. Это означает, что процессор может выполнить эту память, и вы можете прочитать ее, но вы не можете ее записать.

Когда процесс загружается с диска (в Linux с системным вызовом exec), он помещается в память с уже отображенными областями памяти. Эти регионы являются исполняемым кодом из программы, разделов данных и стека. Процесс может потребовать больше памяти для отображения позже с помощью системных вызовов mmap или brk.

Когда процесс пытается получить доступ к памяти, он не отображен, он вызывает печально известную ошибку SEGFAULT, и ядро ​​будет убивать вашу программу. В других случаях аппаратное обеспечение будет виновато, но программа имеет карту памяти, это связано с тем, что ядро ​​отменило ее, чтобы сохранить ее до тех пор, пока она не понадобится. Здесь происходит остановка процесса, ядро ​​переназначает память, и ваш процесс запускается снова, как ничего не произошло.

Адресное пространство

Так размер адресного пространства лишь верхний предел памяти вы могли бы, если бы программа отображается каждый адрес он, возможно, мог бы в реальной оперативной памяти.

Один гиг адресное пространство на части ядра о мета-данных процесса, что ядро ​​отслеживает. Например, он будет хранить список открытых файлов и сопоставленную память в заголовках процессов. Он также сохранит заголовки потоков. Опять же, все это не отображается, только то, что ему нужно.

Обратите внимание, что каждый процесс имеет свою собственную вселенную адресов, он никогда не видит, что другой процесс отображается на эти адреса. Таким образом, процесс может действовать так, как если бы он был единственным процессом на машине, отображая память на любой адрес, который он выбирает.

Также обратите внимание, что число 4gb связано с тем, что аппаратное обеспечение, которое выполняет адресацию, поддерживает только 32-разрядные номера, наибольшее число, которое может содержать 32-битное число, составляет 2^32 = 4 294 967 296. Это 4 ГБ. Таким образом, можно отображать 4gb адресов в память.

Это просто дерьмовый интро, пожалуйста, сделать некоторые погуглите на виртуальной памяти.

+0

Этот вопрос теперь, но мой вопрос в том, что есть много процессов, выполняющихся одновременно, например, firefox chrome, работающих одновременно в Linux. Но если 4 gb выделяется хром, как firefox получит память для его работы. – Dpk

+0

Также, что размер стека ядра ограничен до 8 КБ.и каково его отношение к 1 ГБ пространства. – Dpk

+0

@Dpk Вот что я пытался сказать. Процесс не имеет 4 ГБ оперативной памяти, выделенной для него. Каждый процесс начинается с очень небольшого объема памяти (несколько страниц, страница на x86_64 равна 4kb), поскольку она выделяет больше памяти, добавляется больше страниц. Каждый процесс работает сам по себе (исключительно на собственном ядре) и заменяется на другие процессы, когда он поменяется (запланировано), память для этого процесса отображается в адресном пространстве. Таким образом, каждый процесс получает свое собственное адресное пространство 4gb, которое не сталкивается с другими программами. – cptaffe

0

Означает ли это, что каждому процессу в Linux выделяется столько памяти 1 ГБ + 3 ГБ?

Нет. Все процессы имеют одно и то же пространство ядра. Кроме того, это максимальные теоретические пределы. Их можно дополнительно ограничить системными настройками, настройками процесса и размером файла страницы. Даже если система позволила процессу расти до максимальной стороны, процессы обычно начинаются с малого и должны расти, чтобы достичь максимума.

Если да, то есть сотни процессов в linux, поэтому 100 * 4 ГБ пространства, откуда система получает столько места в памяти?

См. Выше. Если это разрешено, такое пространство памяти будет находиться на диске в файле (разделе) страницы.

Какое отношение имеет отношение к стеку ядра и стек пользователя?

Они являются отдельными стеками. Стек ядра находится в пространстве ядра, а стек пользователя находится в пользовательском пространстве. Процессор использует стек ядра при выполнении в режиме ядра и стек пользователя в режиме пользователя. Переключатель является автоматическим как часть аппаратного переключения между режимами.

У каждого процесса в linux есть ядро ​​и пользовательский стек?

Да. Для каждого потока есть один. Ядра ядра имеют тенденцию быть маленькими.

+0

Что такое размер стека ядра, ограниченный до 8 КБ. и каково его отношение к 1 ГБ пространства. Также как узнать размер пользовательского стека для процесса? – Dpk

+0

Я считаю, что Linux ограничивает стек ядра до 2 страниц (8 КБ). Стек ядра делает относительно простые вещи, поэтому он не должен быть большим. Все стеки ядра находятся в пределах 1 ГБ системного пространства. Размер стека для потока или процесса может измениться. – user3344003

+0

Как узнать размер пользовательского стека для процесса/потока в Linux. – Dpk

Смежные вопросы