Действительно ли возможно поддерживать несколько процессов без поддержки Виртуальной памяти?

В древние времена ядро было трудно кодировано для знания устройства главное/незначительное число корневой фс и смонтировало, что устройство после инициализации всех драйверов устройств, которые были встроены в ядро. rdev утилита могла использоваться для изменения числа корневого устройства в изображении ядра, не имея необходимость перекомпилировать его.

В конечном счете загрузчики пришли и могли передать командную строку ядру. Если root= аргумент был передан, который сказал ядро, где корневая фс была вместо созданного в значении. Драйверы должны были получить доступ, это все еще должно было быть встроено в ядро. В то время как аргумент похож на нормальный узел устройства в /dev каталог, очевидно, существует нет /dev каталог перед корневой фс смонтирован, таким образом, ядро не может искать dev узел там. Вместо этого определенные известные имена устройств трудно кодируются в ядро, таким образом, строка может быть переведена в номер устройства. Из-за этого ядро может распознать вещи как /dev/sda1, но не более экзотические вещи как /dev/mapper/vg0-root или объем UUID.

Позже, initrd вошел в изображение. Наряду с ядром, загрузчик загрузился бы initrd изображение, которое было некоторым изображением сжатой файловой системы (изображение gzipped ext2, gzipped romfs изображение, squashfs наконец стало доминирующим). Ядро распаковало бы это изображение в электронный диск и смонтировало бы электронный диск как корневую фс. Это изображение содержало некоторые дополнительные драйверы и сценарии начальной загрузки вместо реального init. Эти сценарии начальной загрузки выполнили различные задачи распознать аппаратные средства, активировать вещи как массивы RAID и LVM, обнаружить UUID и проанализировать командную строку ядра для нахождения реального корня, который мог теперь быть указан UUID, меткой тома и другими усовершенствованными вещами. Это затем смонтировало реальную корневую фс в /initrd, затем выполняемый pivot_root системный вызов, чтобы иметь подкачку ядра / и /initrd, затем должностное лицо /sbin/init на реальном корне, который затем размонтировался бы /initrd и освободите электронный диск.

Наконец, сегодня мы имеем initramfs. Это подобно initrd, но вместо того, чтобы быть изображением сжатой файловой системы, которое загружается в электронный диск, это - сжатый архив cpio. tmpfs смонтирован как корень, и архив извлечен там. Вместо использования pivot_root, который рассматривался как грязный взлом, initramfs сценарии начальной загрузки монтируют реальный корень в /root, удалите все файлы в корне tmpfs, затем chroot в /root, и должностное лицо /sbin/init.

8
24.02.2011, 08:04
3 ответа

Можно выполнить операционную систему мультипроцесса даже без поддержки оборудования (никакой MMU) со всеми указателями, представляющими физический адрес. Вы действительно однако теряете несколько основных характеристик, обычно обеспечиваемых через MMU:

  • Так как указатель всегда указывает на определенное место в RAM, у Вас не может быть подкачки (или только очень ограниченным способом). Обычно, MMU повышает исключение, когда он не может найти физическую страницу для данного виртуального адреса, и обеспеченный ОС обработчик исключений выбирает страницу от подкачки.
  • Так как указатель разыменовывается без проверки, каждый процесс может получить доступ к памяти других процессов и памяти ядра. Обычно, MMU повышает исключение, когда он не может найти физическую страницу для данного виртуального адреса, и обеспеченный ОС обработчик исключений завершает процесс для попытки недопустимого доступа.
  • Так как тот же указатель имеет то же значение в различных процессах, Вы не можете легко реализовать ветвление. Обычно, эффект fork должен сделать копию ¹ физической памяти процесса и создать новую карту виртуальной памяти от тех же виртуальных адресов до новых физических адресов.

Существуют подобные Unix операционные системы, которые работают над системами без MMU.

¹ В современных нельдах, это обычно делается лениво (копия на записи), которая снова полагается на MMU повышение исключения, когда это не может найти физическую страницу.

10
27.01.2020, 20:11

Это, конечно, возможно с некоторыми ограничениями как защита памяти, которая была бы проблемой, как уже указано. Например, µClinux http://www.uclinux.org/ поддерживает несколько процессов, не реализовывая виртуальную память. Обратите внимание, что некоторые центральные процессоры, по крайней мере, как Аналоговые устройства Blackfin действительно обеспечивают MPU (Единица Защиты памяти) http://docs.blackfin.uclinux.org/doku.php?id=bfin:mpu. Это позволяет виртуальной памяти меньше операционных систем, чтобы все еще позволить памяти быть разделенной.

2
27.01.2020, 20:11

Это зависит от того, как Вы определяете процесс по сравнению с потоками с точки зрения памяти.

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

0
27.01.2020, 20:11
  • 1
    Да и нет. Возможно осуществить разделение памяти без виртуальной памяти. Некоторые микроконтроллеры имеют аппаратную защиту памяти, но не виртуальную память (см. ответ jlliagre). И даже без поддержки оборудования, можно осуществить разделение памяти посредством статического анализа (это не легко, но это выполнимо). –  Gilles 'SO- stop being evil' 02.01.2011, 15:32

Теги

Похожие вопросы