Введение
Операционная система типа Unix Minix 3 - это небольшая операционная система типа Unix. Он опубликован под лицензией BSD 3 Clause и является проектом-преемником предыдущих версий, Minix 1 и 2. По состоянию на 2017 год, Minix 3 поддерживает процессоры архитектуры IA 32 и ARM. Он также может работать на эмуляторах или виртуальных машинах, таких как Bochs, VMware Workstation, Microsoft Virtual PC, Oracle VirtualBox и QEMU. Порт на архитектуру PowerPC находится в разработке. Дистрибутив поставляется на живом CD и не поддерживает установку на живом USB. Проект был в состоянии покоя с 2018 года, и последним релизом является 3.4.0 rc6 от 2017 года, хотя дискуссионная группа Minix 3 все еще активна. Minix 3, как полагают, вдохновил операционную систему Intel Management Engine (ME), найденную в платформе Intel Platform Controller Hub, начиная с введения ME 11, которая используется с процессорами Skylake и Kaby Lake. Было обсуждено, что Minix могла бы быть наиболее широко используемой ОС на процессорах x86/AMD64, с большим количеством установок, чем Microsoft Windows, Linux или macOS, из-за ее использования в Intel ME.
Minix 3 is a small, Unix like operating system. It is published under a BSD 3 Clause license and is a successor project to the earlier versions, Minix 1 and 2.
as of 2017, Minix 3 supports IA 32 and ARM architecture processors. It can also run on emulators or virtual machines, such as Bochs, VMware Workstation, Microsoft Virtual PC, Oracle VirtualBox, and QEMU. A port to PowerPC architecture is in development. The distribution comes on a live CD and does not support live USB installation. The project has been dormant since 2018, and the latest release is 3.4.0 rc6 from 2017, although the Minix 3 discussion group is still active. Minix 3 is believed to have inspired the Intel Management Engine (ME) OS found in Intel's Platform Controller Hub, starting with the introduction of ME 11, which is used with Skylake and Kaby Lake processors. It was debated that Minix could have been the most widely used OS on x86/AMD64 processors, with more installations than Microsoft Windows, Linux, or macOS, because of its use in the Intel ME.
Цели проекта
Отражая природу монолитных систем на основе ядра, где драйвер (который, по словам создателя Minix Таненбаума, примерно в 37 раз больше ошибок, чем обычная программа) может сбить всю систему, Minix 3 стремится создать операционную систему, которая является "надежным, самовосстанавливающимся, мультисерверным клоном Unix". Для достижения этого код, запускаемый в ядре, должен быть минимальным, при этом файловый сервер, процессовый сервер и каждый драйвер устройства должны работать как отдельные процессы пользовательского режима. Каждый водитель внимательно контролируется частью системы, называемой сервером реинкарнации. Если драйвер не отвечает на пинг-сообщения с этого сервера, он отключается и заменяется новой копией драйвера. В монолитной системе, ошибка в драйвере может легко сбить все ядро. Это гораздо менее вероятно в Minix 3.
Политика надежности
Одна из главных целей Minix 3 - надежность. Ниже приведены некоторые из наиболее важных принципов, которые повышают ее надежность.
Уменьшить размер ядра
Монолитовые операционные системы, такие как Linux и FreeBSD, и гибриды, такие как Windows, имеют миллионы строк кода ядра. В отличие от Minix 3 имеет около 6000 строк исполняемого кода ядра, что может облегчить поиск проблем в коде.
В клетку жуков
В монолитных ядрах драйверы устройств находятся в ядре. Таким образом, когда устанавливается новое периферийное устройство, в ядро вставляется неизвестный, ненадежный код. Одна плохая строка кода в драйвере может вывести систему из строя. Вместо этого, в Minix 3, каждый драйвер устройства является отдельным процессом пользовательского режима. Драйверы не могут выполнять привилегированные инструкции, изменять таблицы страниц, выполнять произвольные вводы/выводы (I/O) или записывать в абсолютную память. Они должны совершать вызовы ядра для этих служб, и ядра проверяет каждый вызов для авторизации.
Ограничить доступ драйверов к памяти
В монолитных ядрах драйвер может писать в любое слово памяти и таким образом случайно повредить пользовательские программы. В Minix 3, когда пользователь ожидает данные, например, из файловой системы, он создает дескриптор, сообщающий, кто имеет доступ и на каких адресах. Затем он передает индекс этого дескриптора в файловую систему, которая может передать его драйверу. Затем файловая система или драйвер просит ядро писать через дескриптор, что делает невозможным для них написание адресов за пределами буфера.
Выживать в плохих указателях
Отмена указателя в драйвере приведет к сбою процесса драйвера, но не повлияет на систему в целом. Сервер реинкарнации перезапустит поврежденный драйвер автоматически. Пользователи не будут замечать восстановление для некоторых драйверов (например, диска и сети), но для других (например, аудио и принтера), они могут. В монолитных ядрах, дереференцирование плохой указатель в драйвере обычно приводит к сбоям системы.
Одомашнить бесконечные петли
Если водитель попадает в бесконечную петлю, планировщик постепенно снижает приоритет, пока не станет неактивным. В конце концов, сервер реинкарнации увидит, что он не отвечает на запросы о статусе, поэтому он убьет и перезапустит драйвер цикла. В монолитном ядре, драйвер с петлей может повесить систему.
Ограничить повреждение от переполнения буфера
Minix 3 использует сообщения с фиксированной длиной для внутренней связи, что устраняет определенные переполнения буфера и проблемы управления буфером. Кроме того, многие эксплойты работают путем перезапуска буфера, чтобы обмануть программу, чтобы она вернулась из вызова функции, используя перезаписанный адрес возврата стека, указывающий на контролируемую атакующим памятью, обычно буфер перезапуска. В Minix 3 эта атака смягчена, потому что пространство инструкций и данных разделено, и только код в (только для чтения) пространстве инструкций может быть выполнен, называемый защитой исполняемого пространства. Однако атаки, которые полагаются на запуск законно исполняемой памяти вредоносным образом (возвращение к libc, возвращение ориентированного программирования), не предотвращаются этим смягчением.
Ограничить доступ к функциям ядра
Драйверы устройств получают услуги ядра (такие как копирование данных в адресные пространства пользователей) путем вызова ядра. Ядро Minix 3 имеет бит-карту для каждого драйвера, указывающую, какие вызовы он уполномочен совершать. В монолитных ядрах каждый драйвер может вызвать каждую функцию ядра, авторизованную или нет.
Ограничить доступ к портам ввода/вывода
Ядро также сохраняет таблицу, в которой указаны порты ввода-вывода, к которым может получить доступ каждый драйвер. Таким образом, драйвер может касаться только своих собственных ввода-вывода портов. В монолитных ядрах драйвер с ошибками может получить доступ к вводно-выводному портам, принадлежащим другому устройству.
Ограничить связь с компонентами ОС
Не каждый драйвер и сервер должны общаться с каждым другим драйвером и сервером. Соответственно, битовая карта по процессу определяет, к каким пунктам назначения может отправляться каждый процесс.
Водители , которые умерли или заболели , перевоплощаются .
Специальный процесс, называемый реинкарнационным сервером, периодически отслеживает каждый драйвер устройства. Если водитель умирает или не отвечает правильно на пинг, сервер реинкарнации автоматически заменяет его новой копией. Выявление и замена неработающих драйверов происходит автоматически, без необходимости вмешательства пользователя. Эта функция не работает для дисковых драйверов в настоящее время, но в следующем выпуске система сможет восстановить даже дисковые драйверы, которые будут затенены в памяти случайного доступа (RAM). Восстановление драйвера не влияет на текущие процессы.
Интеграция прерываний и сообщений
При возникновении перерыва он преобразуется на низком уровне в уведомление, отправляемое соответствующему водителю. Если водитель ждет сообщения, он получает прерывание сразу; в противном случае он получает уведомление в следующий раз, когда он делает РЕЦИВ, чтобы получить сообщение. Эта схема устраняет вложенные прерывания и облегчает программирование драйверов.
Архитектура
Как видно, на нижнем уровне находится микроядро, которое состоит из около 4000 строк кода (в основном на C, плюс небольшое количество языка сборки). Он справляется с перерывами, планированием и передачей сообщений. Он также поддерживает интерфейс прикладного программирования (API) из около 30 вызовов ядра, которые могут совершать авторизованные серверы и драйверы. Пользовательские программы не могут совершать эти вызовы. Вместо этого они могут выпускать системные вызовы POSIX, которые отправляют сообщения на серверы. Звонки ядра выполняют такие функции, как установка прерываний и копирование данных между адресными пространствами. На следующем уровне есть драйверы устройств, каждый из которых работает как отдельный процесс пользователя. Каждый из них управляет некоторым устройством ввода-вывода, таким как диск или принтер. Драйверы не имеют доступа к I/O-порту и не могут выдавать инструкции по вводу/выводу напрямую. Вместо этого они должны совершать вызовы ядра, давая список портов ввода-вывода для записи и значения, которые должны быть записаны. Хотя это требует небольшого объема накладных затрат (обычно 500 нс), эта схема позволяет ядру проверять авторизацию, так что, например, аудио драйвер не может записывать на диск. На следующем уровне есть серверы. Здесь находится почти вся функциональность операционной системы. Пользовательские процессы получают файловую службу, например, путем отправки сообщений на файловый сервер для открытия, закрытия, чтения и записи файлов. В свою очередь, файловый сервер получает выполнение ввода/вывода диска путем отправки сообщений дисковому драйверу, который управляет диском. Один из ключевых серверов - это сервер реинкарнации. Его задача - опросить всех остальных серверов и водителей, чтобы периодически проверять их состояние. Если компонент не реагирует правильно, выходит или попадает в бесконечный цикл, сервер реинкарнации (который является родительским процессом драйверов и серверов) убивает неисправный компонент и заменяет его новой копией. Таким образом, система автоматически исцеляется, не вмешиваясь в работающие программы. В настоящее время сервер реинкарнации, процессовый сервер и микроядро являются частью надежной вычислительной базы. Если кто-то из них потерпит неудачу, система рухнет. Тем не менее, сокращение доверенной вычислительной базы с 35 миллионов строк кода, как в системах Linux и Windows, до около 20 000 строк значительно повышает надежность системы.
Различия между Minix 3 и предыдущими версиями
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, размещенных на архитектуре SPARC. Minix vmd был создан двумя исследователями из Vrije Universiteit и добавил виртуальную память и поддержку X Window System. Minix 3 делает то же самое и предоставляет современную операционную систему со многими новыми инструментами и многими приложениями Unix. Профессор Таненбаум однажды сказал: цитата: "Будьте внимательны, MINIX 3 не ваш дедушка MINIX 1 был написан как образовательный инструмент MINIX 3 это плюс начало создания высоко надежной, самовосстанавливающейся, свободной от вздутия операционной системы MINIX 1 и MINIX 3 связаны таким же образом, как Windows 3.1 и Windows XP: одно и то же имя. Версия Minix 3.1.5 была выпущена 5 ноября 2009 года. Он содержит X11, Emacs, vi, cc, GCC, Perl, Python, Almquist shell, Bash, Z shell, FTP-клиент, SSH-клиент, Telnet-клиент, Pine и более 400 других распространенных утилит Unix. С добавлением X11 эта версия знаменует собой переход от текстовой системы. Еще одна особенность этой версии, которая будет улучшена в будущих версиях, - это способность системы выдерживать сбои драйверов устройств и во многих случаях автоматически заменять их, не влияя на работающие процессы. Таким образом, Minix является самовосстанавливающимся и может использоваться в приложениях, требующих высокой надежности. Minix 3.2.0 был выпущен в феврале 2012 года. Эта версия имеет много новых функций, включая компилятор Clang, экспериментальную поддержку симметричной мультипроцессировки, поддержку файловой системы procfs и ext2fs и GNU Debugger (GDB). В релиз также интегрированы несколько частей NetBSD, включая загрузчик, libc и различные утилиты и другие библиотеки. Minix 3.3.0 был выпущен в сентябре 2014 года. Эта версия является первой версией, поддерживающей архитектуру ARM в дополнение к x86. Он также поддерживает NetBSD userland, с тысячами пакетов NetBSD, работающих прямо из коробки.
cquote|Please be aware that MINIX 3 is not your grandfather's MINIX MINIX 1 was written as an educational tool MINIX 3 is that plus a start at building a highly reliable, self healing, bloat free operating system MINIX 1 and MINIX 3 are related in the same way as Windows 3.1 and Windows XP are: same first name. Minix version 3.1.5 was released 5 Nov 2009. It contains X11, Emacs, vi, cc, GCC, Perl, Python, Almquist shell, Bash, Z shell, FTP client, SSH client, Telnet client, Pine, and over 400 other common Unix utility programs. With the addition of X11, this version marks the transition away from a text only system. Another feature of this version, which will be improved in future ones, is the ability of the system to withstand device driver crashes, and in many cases having them automatically replaced without affecting running processes. In this way, Minix is self healing and can be used in applications demanding high reliability. Minix 3.2.0 was released in February 2012. This version has many new features, including the Clang compiler, experimental symmetric multiprocessing support, procfs and ext2fs filesystem support, and GNU Debugger (GDB). Several parts of NetBSD are also integrated in the release, including the bootloader, libc and various utilities and other libraries. Minix 3.3.0 was released in September 2014. This release is the first version to support the ARM architecture in addition to x86. It also supports a NetBSD userland, with thousands of NetBSD packages running right out of the box.
Талисман
Рокки-Ракун - талисман Миникс 3.
MINIXCon
MINIXCon - это конференция по обмену разговорами, усилиями и исследованиями, связанными с Minix. Он проводился один раз в 2016 году. MINIXCon2017 был отменен из-за отсутствия представленных докладов.