Minix 3 — это небольшая Unix-подобная операционная система . Она опубликована под лицензией BSD-3-Clause [a] и является проектом-преемником более ранних версий Minix 1 и 2. [1]
Основная цель проекта — сделать систему отказоустойчивой, обнаруживая и устраняя неисправности на лету, без вмешательства пользователя. Предполагается, что основными сферами применения системы будут встроенные системы и образование. [2]
По состоянию на 2017 год [обновлять]Minix 3 поддерживает процессоры архитектуры IA-32 и ARM. [3] Он также может работать на эмуляторах или виртуальных машинах , таких как Bochs , [4] [5] VMware Workstation , [6] Microsoft Virtual PC , [7] Oracle VirtualBox , [8] и QEMU . Порт для архитектуры PowerPC находится в разработке. [9] Дистрибутив поставляется на live CD и не поддерживает live USB- установку. [10] Проект был бездействующим с 2018 года, [11] и последний релиз — 3.4.0 rc6 от 2017 года, [12] хотя группа обсуждения Minix 3 все еще активна. [13]
Считается, что Minix 3 вдохновил на создание ОС Intel Management Engine (ME), которая находится в Platform Controller Hub от Intel , начиная с появления ME 11, которая используется с процессорами Skylake и Kaby Lake . [14] [15] Было высказано мнение, что Minix могла бы стать наиболее широко используемой ОС на процессорах x86 / AMD64 , с большим количеством установок, чем Microsoft Windows, Linux или macOS , из-за ее использования в Intel ME. [16]
Размышляя о природе систем на основе монолитного ядра , где драйвер (который, по словам создателя Minix Таненбаума , имеет примерно в 3–7 раз больше ошибок, чем обычная программа) [17] может вывести из строя всю систему [18] , Minix 3 нацелен на создание операционной системы, которая является «надежным, самовосстанавливающимся, многосерверным клоном Unix». [19]
Чтобы достичь этого, код, работающий в ядре, должен быть минимальным, при этом файловый сервер, сервер процессов и каждый драйвер устройства должны работать как отдельные процессы пользовательского режима. Каждый драйвер тщательно отслеживается частью системы, называемой сервером реинкарнации . Если драйвер не отвечает на пинги с этого сервера, он отключается и заменяется новой копией драйвера.
В монолитной системе ошибка в драйвере может легко привести к краху всего ядра. Это гораздо менее вероятно в Minix 3. [20]
Minix 3 был публично анонсирован 24 октября 2005 года Эндрю Таненбаумом во время его вступительной речи на конференции Association for Computing Machinery (ACM) Symposium Operating Systems Principles. Хотя он по-прежнему служит примером для нового издания учебника Таненбаума и Вудхалла, он был полностью переработан, чтобы быть «пригодным для использования в качестве серьезной системы на компьютерах с ограниченными ресурсами и встроенных компьютерах, а также для приложений, требующих высокой надежности».
Первоначально выпущен под той же лицензией BSD-3-Clause , под которой лицензировался Minix с 2000 года. [23] [24] В конце 2005 года владелец авторских прав был изменен и был добавлен четвертый пункт. [1] [25] [28]
Одной из главных целей Minix 3 является надежность. Ниже обсуждаются некоторые из наиболее важных принципов, которые повышают ее надежность.
Монолитные операционные системы, такие как Linux и FreeBSD, а также гибриды, такие как Windows, имеют миллионы строк кода ядра . Напротив, Minix 3 имеет около 6000 строк исполняемого кода ядра, [29] что может облегчить поиск проблем в коде.
В монолитных ядрах драйверы устройств находятся в ядре. Таким образом, при установке нового периферийного устройства в ядро вставляется неизвестный, ненадежный код. Одна плохая строка кода в драйвере может вывести систему из строя.
Вместо этого в Minix 3 каждый драйвер устройства является отдельным процессом пользовательского режима. Драйверы не могут выполнять привилегированные инструкции, изменять таблицы страниц , выполнять произвольный ввод/вывод (I/O) или записывать в абсолютную память. Они должны делать вызовы ядра для этих служб, и ядро проверяет каждый вызов на предмет полномочий.
В монолитных ядрах драйвер может записать данные в любое слово памяти и таким образом случайно повредить пользовательские программы.
В Minix 3, когда пользователь ожидает данные, например, от файловой системы, он создает дескриптор, сообщающий, кто имеет доступ и по каким адресам. Затем он передает индекс этого дескриптора в файловую систему, которая может передать его драйверу. Затем файловая система или драйвер запрашивают ядро на запись через дескриптор, что делает невозможным для них запись по адресам за пределами буфера.
Разыменование плохого указателя в драйвере приведет к сбою процесса драйвера, но не окажет никакого влияния на систему в целом. Сервер реинкарнации автоматически перезапустит сбойный драйвер. Пользователи не заметят восстановления для некоторых драйверов (например, диск и сеть), но для других (например, аудио и принтер) они могут это заметить. В монолитных ядрах разыменование плохого указателя в драйвере обычно приводит к сбою системы.
Если драйвер попадает в бесконечный цикл , планировщик постепенно снижает его приоритет, пока он не станет бездействующим. В конце концов сервер реинкарнации увидит, что он не отвечает на запросы статуса, поэтому он убьет и перезапустит зацикленный драйвер. В монолитном ядре зацикленный драйвер может повесить систему.
Minix 3 использует сообщения фиксированной длины для внутренней связи, что устраняет определенные проблемы переполнения буфера и управления буфером. Кроме того, многие эксплойты работают путем переполнения буфера, чтобы обмануть программу и заставить ее вернуться из вызова функции, используя перезаписанный адрес возврата стека, указывающий на контролируемую злоумышленником память, обычно на переполненный буфер. В Minix 3 эта атака смягчается, поскольку пространство инструкций и данных разделено, и может быть выполнен только код в (только для чтения) пространстве инструкций, что называется защитой исполняемого пространства . Однако атаки, которые полагаются на запуск законно исполняемой памяти вредоносным способом ( возврат в libc , возвратно-ориентированное программирование ), не предотвращаются этим смягчением.
Драйверы устройств получают службы ядра (например, копирование данных в адресные пространства пользователей) путем выполнения вызовов ядра. Ядро Minix 3 имеет битовую карту для каждого драйвера, указывающую, какие вызовы ему разрешено выполнять. В монолитных ядрах каждый драйвер может вызывать любую функцию ядра, авторизованную или нет.
Ядро также поддерживает таблицу, сообщающую, к каким портам ввода-вывода может обращаться каждый драйвер. Таким образом, драйвер может касаться только своих собственных портов ввода-вывода. В монолитных ядрах глючный драйвер может обращаться к портам ввода-вывода, принадлежащим другому устройству.
Не каждый драйвер и сервер должны взаимодействовать с каждым другим драйвером и сервером. Соответственно, битовая карта каждого процесса определяет, в какие пункты назначения каждый процесс может отправлять данные.
Специальный процесс, называемый сервером реинкарнации, периодически пингует каждый драйвер устройства. Если драйвер умирает или не отвечает правильно на пинги, сервер реинкарнации автоматически заменяет его новой копией. Обнаружение и замена неработающих драйверов происходит автоматически, без каких-либо действий со стороны пользователя. Эта функция в настоящее время не работает для драйверов дисков, но в следующем выпуске система сможет восстанавливать даже драйверы дисков, которые будут затенены в оперативной памяти (ОЗУ). Восстановление драйвера не влияет на запущенные процессы.
Когда происходит прерывание , оно преобразуется на низком уровне в уведомление, отправляемое соответствующему драйверу. Если драйвер ожидает сообщения, он получает прерывание немедленно; в противном случае он получает уведомление в следующий раз, когда он делает a RECEIVE
для получения сообщения. Эта схема устраняет вложенные прерывания и упрощает программирование драйвера.
Как можно увидеть, на нижнем уровне находится микроядро , которое представляет собой около 4000 строк кода (в основном на языке C , плюс небольшое количество ассемблера ). Оно обрабатывает прерывания , планирование и передачу сообщений. Оно также поддерживает интерфейс прикладного программирования (API) из примерно 30 вызовов ядра, которые могут выполнять авторизованные серверы и драйверы. Пользовательские программы не могут выполнять эти вызовы. Вместо этого они могут выполнять системные вызовы POSIX , которые отправляют сообщения серверам. Вызовы ядра выполняют такие функции, как установка прерываний и копирование данных между адресными пространствами.
На следующем уровне находятся драйверы устройств , каждый из которых работает как отдельный процесс пользовательского пространства. Каждый из них управляет некоторым устройством ввода-вывода, например, диском или принтером. Драйверы не имеют доступа к пространству портов ввода-вывода и не могут напрямую выдавать инструкции ввода-вывода. Вместо этого они должны выполнять вызовы ядра, предоставляя список портов ввода-вывода для записи и записываемые значения. Хотя при этом есть небольшое количество накладных расходов (обычно 500 нс), эта схема позволяет ядру проверять авторизацию, так что, например, аудиодрайвер не может записывать на диск.
На следующем уровне находятся серверы . Именно здесь находится почти вся функциональность операционной системы. Пользовательские процессы получают файловый сервис, например, отправляя сообщения файловому серверу для открытия, закрытия, чтения и записи файлов. В свою очередь файловый сервер получает дисковый ввод-вывод, отправляя сообщения дисковому драйверу, который управляет диском.
Одним из ключевых серверов является сервер реинкарнации. Его задача — периодически опрашивать все остальные серверы и драйверы для проверки их работоспособности. Если компонент не отвечает правильно, завершает работу или попадает в бесконечный цикл , сервер реинкарнации (который является родительским процессом драйверов и серверов) убивает неисправный компонент и заменяет его новой копией. Таким образом, система автоматически становится самовосстанавливающейся, не мешая запущенным программам.
В настоящее время сервер реинкарнации, сервер процесса и микроядро являются частью доверенной вычислительной базы . Если любой из них выходит из строя, система падает. Тем не менее, сокращение доверенной вычислительной базы с 3-5 миллионов строк кода, как в системах Linux и Windows, до примерно 20 000 строк значительно повышает надежность системы. [ необходима цитата ]
Minix 1.0, 1.5 и 2.0 были разработаны как инструменты, помогающие людям изучить устройство операционных систем.
Minix 1.0, выпущенный в 1987 году, состоял из 12 000 строк на языке C и некоторого количества ассемблера x86 . Исходный код ядра, менеджера памяти и файловой системы Minix 1.0 напечатаны в книге. Таненбаум изначально разработал Minix для совместимости с микрокомпьютерами IBM PC и IBM PC/AT, доступными в то время.
Minix 1.5, выпущенный в 1991 году, включал поддержку систем MicroChannel IBM PS/2 и был также портирован на архитектуры Motorola 68000 и SPARC , поддерживая компьютерные платформы Atari ST , Commodore Amiga , Apple Macintosh и Sun Microsystems SPARCstation . Также была доступна версия Minix, работающая как пользовательский процесс под SunOS .
Minix 2.0, выпущенный в 1997 году, был доступен только для архитектур x86 и Solaris -hosted SPARC. Minix-vmd был создан двумя исследователями Vrije Universiteit и добавил виртуальную память и поддержку X Window System .
Minix 3 делает то же самое и предоставляет современную операционную систему со многими новыми инструментами и многими приложениями Unix . [30] Профессор Таненбаум однажды сказал:
Пожалуйста, имейте в виду, что MINIX 3 — это не MINIX вашего дедушки... MINIX 1 был написан как образовательный инструмент... MINIX 3 — это то же самое, плюс начало создания высоконадежной, самовосстанавливающейся, нераздутой операционной системы... MINIX 1 и MINIX 3 связаны между собой так же, как Windows 3.1 и Windows XP : одно и то же имя. [19]
С момента выпуска Minix 2 в структуру ядра было внесено множество улучшений, что сделало систему более надежной. [31] Версия Minix 3.1.5 была выпущена 5 ноября 2009 года. Она содержит X11 , Emacs , vi , cc, GCC , Perl , Python , Almquist shell , Bash , Z shell , FTP client , SSH client , Telnet client, Pine и более 400 других распространенных служебных программ Unix. С добавлением X11 эта версия знаменует собой переход от текстовой системы. Еще одной особенностью этой версии, которая будет улучшена в будущих версиях, является способность системы выдерживать сбои драйверов устройств и во многих случаях автоматически заменять их, не влияя на работающие процессы. Таким образом, Minix является самовосстанавливающимся и может использоваться в приложениях, требующих высокой надежности.
Minix 3.2.0 был выпущен в феврале 2012 года. Эта версия имеет много новых функций, включая компилятор Clang , экспериментальную поддержку симметричной многопроцессорной обработки , поддержку файловых систем procfs и ext2fs , а также отладчик GNU (GDB). Несколько частей NetBSD также интегрированы в релиз, включая загрузчик, libc и различные утилиты и другие библиотеки . [32]
Minix 3.3.0 был выпущен в сентябре 2014 года. Этот релиз является первой версией, поддерживающей архитектуру ARM в дополнение к x86. Он также поддерживает пользовательское пространство NetBSD , с тысячами пакетов NetBSD, работающих прямо из коробки.
Рокки Енот — талисман Minix 3. [33]
MINIXCon — это конференция по обмену докладами, разработками и исследованиями, связанными с Minix.
Проводился один раз в 2016 году. MINIXCon2017 был отменён из-за отсутствия представленных докладов. [34] [35]
Из раздела
Rebirth
: "Различные исследования показали, что программное обеспечение в целом содержит около 6-16 ошибок на 1000 строк кода, а драйверы устройств имеют в 3-7 раз больше ошибок, чем остальная часть операционной системы. В сочетании с тем фактом, что 70% типичной операционной системы состоит из драйверов устройств, становится ясно, что драйверы устройств являются большим источником проблем. Для
Windows XP
85% сбоев происходят из-за ошибок в драйверах устройств. Очевидно, чтобы сделать ОС надежными, нужно что-то сделать для борьбы с ошибочными драйверами устройств. Создание надежной системы, несмотря на неизбежные ошибки в драйверах устройств, было изначальной движущей силой Minix 3".
{{cite web}}
: CS1 maint: бот: исходный статус URL неизвестен ( ссылка )