Миникс 3 - Minix 3

Minix 3
Талисман Рокки Енот из MINIX 3.jpg
Minix 3.png
Minix 3 работает под управлением X11 с twm в качестве оконного менеджера
Разработчик Эндрю С. Таненбаум и др.
Написано в C , язык ассемблера
Семейство ОС Unix-подобный
Рабочее состояние Заброшенный
Исходная модель Открытый исходный код
Первый выпуск 24 октября 2005 г . ; 15 лет назад ( 2005-10-24 )
Репозиторий
Маркетинговая цель Встроенные системы , образование
Доступно в английский
Платформы ИА-32 , АРМ
Тип ядра Микроядро
Userland MINIX, NetBSD

Пользовательский интерфейс по умолчанию
пепел
Лицензия 2005: BSD-3-Clause
Оригинал: BSD-3-Clause
Предшествует Minix 1.0, 1.5 и 2.0
Официальный веб-сайт www .minix3 .org

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 находится в разработке.

Дистрибутив поставляется на live CD и может быть загружен как живой образ USB- накопителя. Последний выпуск - «minix_R3.4.0rc6-d5e4fc0.iso.bz2» (9 мая 2017 г.).

Предполагается, что MINIX 3 используется в Intel Management Engine (ME) в концентраторе контроллеров платформы Intel, начиная с введения ME 11, который используется с процессорами Skylake и Kaby Lake .

Его использование в Intel ME может сделать его наиболее широко используемой ОС на процессорах x86 / AMD64 , начиная с 2015 года, с большим количеством установок, чем Microsoft Windows, Linux или macOS.

Цели проекта

Структура монолитного ядра и операционных систем на базе микроядра соответственно

Отражая природу систем на основе монолитного ядра , где драйвер (который, по словам создателя MINIX Таненбаума , примерно в 3–7 раз больше ошибок, чем обычная программа) может вывести из строя всю систему, MINIX 3 направлен на создание операционной системы. система, которая является «надежным самовосстанавливающимся многосерверным клоном Unix».

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

В монолитной системе ошибка в драйвере может легко привести к сбою всего ядра. В MINIX 3 это гораздо менее вероятно.

История

MINIX 3 версии
Версия Дата выхода Описание
3.1.0
( OSDI3 )
2005-10-18
  • Первый выпуск MINIX 3 (выпуск книги) под BSD-3-Clause .
3.1.1
(SOSP)
2005-10-24
3.1.2 2006-04-18
3.1.2a 2006-05-29
  • Новый менеджер пакетов Packman.
  • Исправлена ​​проблема установки с автоматическим разбиением дисков на разделы.
3.1.3 2007-04-13
3.1.3a 2007-06-08
  • Исправление ошибок.
3.1.4 2009-06-09
3.1.5 2009-11-05
  • Улучшения производительности
  • Общая память
  • функция setitimer
  • Файловая система ISO 9660
  • Открытая звуковая система
  • Теперь перехватить NULL-доступ, для удобства пользователя
  • Улучшенная обработка сигналов
  • Лучшая поддержка отладчиков ( улучшения ptrace и т. Д.)
  • Автоопределение сетевой карты (для поддерживаемых карт PCI ), улучшенная сетевая конфигурация
3.1.6 2010-02-08
3.1.7 2010-06-16
  • Планирование пространства пользователя и сервер планирования
  • Надлежащая поддержка нескольких карт Ethernet одного типа
  • Загрузочный монитор позволяет загружать изображения> 16 МБ
  • Поддержка Buildsystem для сборки MINIX с GCC
  • Поддержка Windows-1251 и KOI8-U кодировок
3.1.8 2010-10-04
  • Новая инфраструктура управления пакетами: pkgsrc и pkgin
  • Поддержка сокетов домена Unix
  • Поддержка мультизагрузки
  • поддержка ext2
  • Драйвер ACPI
  • полный режим APIC, включая APIC ввода / вывода
  • Экспериментальная поддержка AHCI
3.2.0 2012-02-29
3.2.1 2013-02-21
3.3.0 2014-09-15
  • Поддержка архитектуры ARM; кросс-компилируемый
  • Поддержка mmap()механизма ввода-вывода; позволяет использовать общие динамические библиотеки и снизить потребности в памяти
  • Новая инфраструктура ввода: сервер ввода и драйвер клавиатуры отделены от TTY
  • VND: драйвер блока vnode disk (loopback)
  • LLVM Bitcode сборка системы
  • Импорт LLVM и clang в исходники
  • Единый блочный кеш, совместно используемый ФС и ВМ
  • Улучшенная совместимость с NetBSD: утилиты, вызовы, типы (много 64-битных), набор инструментов, кодовая база и пакеты.
  • Тип C для сообщений: чище, больше
  • Улучшенная модульность драйвера: UDS отдельно от PFS, PTY от TTY, один контроллер на экземпляр at_wini, журнал удален из образа загрузки
  • Пакеты теперь динамически связаны
3.4.0 rc6 2017-05-09 ?
  •   Выпуск книги
  •   Старый выпуск
  •   Текущая стабильная версия
  •   Текущая версия для разработки

MINIX 3 был публично объявлен 24 октября 2005 года Эндрю Таненбаумом во время его основного выступления на конференции «Принципы операционных систем» симпозиума Ассоциации вычислительной техники (ACM). Хотя он по-прежнему служит примером для нового издания учебника Таненбаума и Вудхалла, он полностью переработан, чтобы «можно было использовать в качестве серьезной системы на компьютерах с ограниченными ресурсами и встроенных компьютерах, а также для приложений, требующих высокой надежности».

Первоначально выпущен под той же лицензией BSD-3-Clause, по которой MINIX лицензировалась с 2000 года. В конце 2005 года владелец авторских прав был изменен, и был добавлен четвертый пункт.

Политика надежности

Одна из основных целей MINIX 3 - надежность. Ниже обсуждаются некоторые из наиболее важных принципов, повышающих его надежность.

Уменьшить размер ядра

Монолитные операционные системы, такие как Linux и FreeBSD, и гибриды, такие как Windows, содержат миллионы строк кода ядра . Напротив, MINIX 3 имеет около 6000 строк исполняемого кода ядра, что может облегчить поиск проблем в коде.

Уберите жуков в клетку

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

Вместо этого в MINIX 3 каждый драйвер устройства представляет собой отдельный процесс пользовательского режима. Драйверы не могут выполнять привилегированные инструкции, изменять таблицы страниц , выполнять произвольный ввод / вывод (I / O) или записывать в абсолютную память. Они должны выполнять вызовы ядра для этих служб, и ядро ​​проверяет каждый вызов на наличие полномочий.

Ограничить доступ драйверов к памяти

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

В MINIX 3, когда пользователь ожидает данные, например, от файловой системы, он создает дескриптор, сообщающий, у кого есть доступ и по каким адресам. Затем он передает индекс этого дескриптора файловой системе, которая может передать его драйверу. Затем файловая система или драйвер запрашивает у ядра запись через дескриптор, что делает невозможным запись по адресам вне буфера.

Выжить плохие указатели

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

Приручить бесконечные петли

Если драйвер попадает в бесконечный цикл , планировщик будет постепенно понижать свой приоритет, пока он не перейдет в режим ожидания. В конце концов сервер реинкарнации увидит, что он не отвечает на запросы статуса, поэтому он убьет и перезапустит драйвер цикла. В монолитном ядре драйвер цикла может подвесить систему.

Ограничить ущерб от переполнения буфера

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

Ограничить доступ к функциям ядра

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

Ограничить доступ к портам ввода / вывода

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

Ограничить взаимодействие с компонентами ОС

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

Реинкарнируйте мертвых или больных водителей

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

Интегрируйте прерывания и сообщения

Когда происходит прерывание , оно преобразуется на низком уровне в уведомление, отправляемое соответствующему драйверу. Если драйвер ожидает сообщения, он немедленно получает прерывание; в противном случае он получит уведомление в следующий раз, когда сделает это, RECEIVEчтобы получить сообщение. Эта схема исключает вложенные прерывания и упрощает программирование драйверов.

Архитектура

Архитектура MINIX 3

Как можно видеть, на нижнем уровне находится микроядро , которое составляет около 4000 строк кода (в основном на C , плюс небольшое количество ассемблера ). Он обрабатывает прерывания , планирование и передачу сообщений. Он также поддерживает интерфейс прикладного программирования (API), содержащий около 30 вызовов ядра, которые могут выполнять авторизованные серверы и драйверы. Пользовательские программы не могут выполнять эти вызовы. Вместо этого они могут выполнять системные вызовы POSIX, которые отправляют сообщения на серверы. Вызовы ядра выполняют такие функции, как установка прерываний и копирование данных между адресными пространствами.

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

На следующем уровне находятся серверы . Здесь расположены почти все функциональные возможности операционной системы. Пользовательские процессы получают файловую службу, например, отправляя сообщения на файловый сервер для открытия, закрытия, чтения и записи файлов. В свою очередь, файловый сервер получает дисковый ввод-вывод, отправляя сообщения драйверу диска, который управляет диском.

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

В настоящее время сервер реинкарнации, сервер обработки и микроядро являются частью доверенной вычислительной базы . Если какой-либо из них выйдет из строя, система выйдет из строя. Тем не менее, сокращение доверенной вычислительной базы с 3-5 миллионов строк кода, как в системах Linux и Windows, примерно до 20 000 строк, значительно повышает надежность системы.

Отличия MINIX 3 от предыдущих версий

Схема взаимоотношений между несколькими Unix-подобными системами

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 году, был доступен только для архитектур SPARC на базе x86 и Solaris . Minix-vmd был создан двумя исследователями Vrije Universiteit и добавил виртуальную память и поддержку X Window System .

MINIX 3 делает то же самое и предоставляет современную операционную систему с множеством новых инструментов и многих приложений Unix . Профессор Таненбаум однажды сказал:

Имейте в виду, что MINIX 3 - это не MINIX вашего дедушки ... MINIX 1 был написан как образовательный инструмент ... MINIX 3 - это плюс это начало создания высоконадежной, самовосстанавливающейся операционной системы без раздувания ... MINIX 1 и MINIX 3 связаны так же, как Windows 3.1 и Windows XP : одно и то же имя.

Со времени выпуска MINIX 2 в структуру ядра также было внесено множество улучшений, что сделало систему более надежной. MINIX версии 3.1.5 был выпущен 5 ноября 2009 года. Он содержит X11 , Emacs , vi , cc, GCC , Perl , Python , оболочку Almquist , Bash , оболочку Z , FTP-клиент , SSH-клиент , Telnet- клиент, Pine и более 400 других. общие служебные программы Unix. С добавлением X11 эта версия знаменует собой переход от текстовой системы. Еще одна особенность этой версии, которая будет улучшена в будущих, - это способность системы противостоять сбоям драйверов устройств и, во многих случаях, их автоматическая замена без влияния на запущенные процессы. Таким образом, MINIX является самовосстанавливающимся и может использоваться в приложениях, требующих высокой надежности.

MINIX 3.2.0 был выпущен в феврале 2012 года. Эта версия имеет много новых функций, включая компилятор Clang , экспериментальную поддержку симметричной многопроцессорной обработки, поддержку файловых систем procfs и ext2fs и отладчик GNU (GDB). Некоторые части NetBSD также интегрированы в выпуск, включая загрузчик, libc, различные утилиты и другие библиотеки .

MINIX 3.3.0 был выпущен в сентябре 2014 года. Этот выпуск является первой версией, которая поддерживает архитектуру ARM в дополнение к x86. Он также поддерживает пользовательскую среду NetBSD с тысячами пакетов NetBSD, запускаемых прямо из коробки.

Талисман

Рокки Енот, талисман MINIX 3.

Рокки Енот - талисман MINIX 3.

MINIXCon

MINIXCon - это конференция, посвященная обмену мнениями, усилиями и исследованиями, связанными с MINIX.

Он проводился один раз в 2016 году. MINIXCon2017 был отменен из-за отсутствия представленных переговоров.

Смотрите также

Примечания

использованная литература

дальнейшее чтение

внешние ссылки