Мое мнение - да, это так, потому что все полезное воздействие внешнего мира (режим непривилегированного процессора) сначала потребует процесса, выполняющегося во внешнем мире. Для этого потребуется файловая система, даже временная файловая система в оперативной памяти.
Другой инженер не согласен со мной, но я не могу доказать это за пределами всех (неизвестных мне) случаев.
Зависит ли ответ на этот вопрос от определения «бег»?
filesystems
linux-kernel
Питер Л.
источник
источник
useful exposure to the outside world
init
(первый процесс в пространстве пользователя), и это не удастся.Ответы:
Это довольно странный вопрос, потому что вы не запускаете ядро, как вы запускаете программу. Ядро - это платформа для запуска программ. Конечно, есть код установки и завершения работы, но невозможно запустить ядро самостоятельно. Всегда должен быть основной процесс init. И ядро будет паниковать, если его там нет. Если init попытается выйти, ядро также запаникует.
В эти дни процесс инициализации напоминает systemd. Если не указано иное, ядро будет пытаться запустить программу из списка мест, начинающихся с
/sbin/init
. См. Параметр init здесь http://man7.org/linux/man-pages/man7/bootparam.7.html в чрезвычайной ситуации, с которой вы можете загрузить Linuxinit=/bin/bash
. Но обратите внимание, как вы всегда указываете файл в файловой системе для запуска.Таким образом, ядро будет паниковать, если оно запускается и не имеет файловой системы, потому что без нее нет способа загрузить init.
Некоторая путаница может возникнуть из-за ситуации, когда ядро должно загружать драйверы для доступа к своей файловой системе. Чтобы обойти это, начальный виртуальный диск загружается из образа на диске, содержащего важные драйверы и установочные сценарии. Они выполняются до загрузки файловой системы. Но не заблуждайтесь, исходный ramdisk сам по себе является файловой системой. С начальным виртуальным диском
/init
называется (который хранится на начальном виртуальном диске). Во многих дистрибутивах это в конечном счете то, что вызывает/sbin/init
. Опять же без файловой системы это невозможно.источник
init.$DEV.rc
сценария.Ответ будет зависеть от того, имеете ли вы в виду буквально без файловой системы, или вопрос предназначен для интерпретации немного отличается от того, как он на самом деле сформулирован. Ответы на небольшие различия в интерпретации вопроса:
Причины, по которым вам придется переписывать части кода ядра, чтобы сделать работающую систему без файловой системы:
execve
системным вызовом, которому нужен исполняемый файл из файловой системы.После запуска программы с помощью
execve
она может отменить отображение исполняемого файла, из которого она была запущена, хотя для того, чтобы сделать это без немедленного сбоя, сначала необходимо создать отображение исполняемой памяти, которое не поддерживается файлом, и он должен инициализировать это с помощью некоторого полезного кода, прежде чем перейти к нему и отменить отображение исполняемого файла.Таким образом, работающая программа пользовательского режима может существовать в состоянии, в котором у нее нет отображений памяти, поддерживаемых файлами, и она может закрыть все файловые дескрипторы, поддерживаемые файлами. Он не может перестать иметь корневой каталог и текущий рабочий каталог, но он может воздерживаться от них.
Поэтому, хотя в этом состоянии вы могли бы реализовать код ядра, чтобы вырвать файловую систему из-под программы и заставить ее продолжать работать, это не похоже на то, что это полезно. А переход в это конечное состояние без прохождения промежуточного состояния использования файловой системы будет еще большей работой без какой-либо полезной выгоды.
Полезная настройка для некоторых специализированных случаев использования
Избегание использования блочных устройств может быть полезным. Во время загрузки ядро создает файловую систему памяти и может также заполнить эту файловую систему содержимым из
cpio
архива перед выполнениемinit
. Таким образом, вы можете запустить систему полностью из файловой системы на основе памяти без какого-либо блочного устройства для ее поддержки.Это может быть полезно для систем, в которых вы не хотите сохранять какое-либо состояние, и например, когда система запускается с чистого листа после перезагрузки.
Конечно, ядро и архив cpio должны каким-то образом существовать в памяти, прежде чем ядру будет дан контроль. Как они туда попали - это работа для загрузчика. Загрузчик мог загрузить их с блочного устройства, даже если в окончательно работающей системе блочные устройства не используются. Но для загрузчика также возможно получить архив ядра и cpio без использования блочного устройства, например, при загрузке по сети.
источник
В Linux почти каждое устройство представляет собой файл , поэтому для его запуска необходима файловая система.
источник
eth0
иwlan0
т. Д.) Не являются, например.Ядро - это программа, как и любая другая. По умолчанию ядро Linux пытается получить доступ к файловой системе, однако это поведение может быть тривиально устранено путем модификации ядра (фактически просто добавлением функции «arch_call_rest_init ()»). Для того чтобы выполнить «полезную работу», мы ожидаем, что разработчик может включить потоки ядра (kthreads), которые могут быть использованы в собственном драйвере, для выполнения некоторой желаемой инициализации и рабочей нагрузки типа приложения. Ядро Linux уже содержит много kthreads, но в первую очередь для выполнения вспомогательных операций с ядром или драйверами. API, доступные в контексте ядра, сильно отличаются от тех, которые доступны в пользовательском пространстве Linux. Большая часть функциональности системных вызовов станет бесполезной в сценарии без файловой системы.
Да, Linux ожидает доступ к файловым системам по умолчанию. Нет, модифицированное ядро, безусловно, может быть сделано для выполнения полезной работы без любой файловой системы. Практическое использование Linux без файловой системы IMO довольно ограничено, но не ноль. FWIW, в прошлом многие ядра реального времени были встроены в то же пространство имен и двоичные файлы, что и приложения RT.
источник