stringtranslate.com

Ядро (операционная система)

Чрезмерное упрощение того, как ядро ​​подключает прикладное программное обеспечение к оборудованию компьютера.

Ядро это компьютерная программа, лежащая в основе операционной системы компьютера , которая, как правило, полностью контролирует все в системе. Ядро также отвечает за предотвращение и смягчение конфликтов между различными процессами. [1] Это часть кода операционной системы, которая всегда находится в памяти [2] и обеспечивает взаимодействие между аппаратными и программными компонентами. Полное ядро ​​контролирует все аппаратные ресурсы (например, ввод-вывод, память, криптография) через драйверы устройств , разрешает конфликты между процессами, касающимися таких ресурсов, и оптимизирует использование общих ресурсов, например, использование ЦП и кэша , файловых систем и сетевых сокетов. В большинстве систем ядро ​​— одна из первых программ, загружаемых при запуске (после загрузчика ). Оно обрабатывает остальную часть запуска, а также память, периферийные устройства и запросы ввода-вывода (I/O) от программного обеспечения , преобразуя их в инструкции по обработке данных для центрального процессора .

Критический код ядра обычно загружается в отдельную область памяти, которая защищена от доступа прикладного программного обеспечения или других менее важных частей операционной системы. Ядро выполняет свои задачи, такие как запуск процессов, управление аппаратными устройствами, такими как жесткий диск , и обработка прерываний, в этом защищенном пространстве ядра . Напротив, прикладные программы, такие как браузеры, текстовые процессоры или аудио- или видеоплееры, используют отдельную область памяти, пользовательское пространство . Такое разделение предотвращает вмешательство пользовательских данных и данных ядра друг в друга и приводит к нестабильности и замедлению [1] , а также предотвращает влияние неисправных приложений на другие приложения или сбой всей операционной системы. Даже в системах, где ядро ​​включено в адресные пространства приложений , защита памяти используется для предотвращения несанкционированного изменения ядра приложениями.

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

Существуют различные конструкции архитектуры ядра. Монолитные ядра работают полностью в одном адресном пространстве с процессором, работающим в режиме супервизора , в основном для скорости. Микроядра запускают большинство, но не все свои службы в пользовательском пространстве, [3] как это делают пользовательские процессы, в основном для устойчивости и модульности . [4] MINIX 3 является ярким примером конструкции микроядра. Ядро Linux является как монолитным, так и модульным, поскольку оно может вставлять и удалять загружаемые модули ядра во время выполнения.

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

Оперативная память

Оперативная память (ОЗУ) используется для хранения как программных инструкций, так и данных. [a] Обычно для выполнения программы в памяти должны присутствовать оба эти элемента. Часто нескольким программам требуется доступ к памяти, часто требуя больше памяти, чем доступно компьютеру. Ядро отвечает за решение о том, какую память может использовать каждый процесс, и определяет, что делать, если памяти недостаточно.

Устройства ввода/вывода

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

Управление ресурсами

Ключевые аспекты, необходимые в управлении ресурсами, — это определение домена выполнения ( адресного пространства ) и механизма защиты, используемого для посредничества в доступе к ресурсам внутри домена. [5] Ядра также предоставляют методы для синхронизации и межпроцессного взаимодействия (IPC). Эти реализации могут быть расположены внутри самого ядра, или ядро ​​может также полагаться на другие процессы, которые оно запускает. Хотя ядро ​​должно предоставлять IPC для предоставления доступа к средствам, предоставляемым друг другом, ядра также должны предоставлять работающим программам метод для выполнения запросов на доступ к этим средствам. Ядро также отвечает за переключение контекста между процессами или потоками.

Управление памятью

Ядро имеет полный доступ к памяти системы и должно разрешать процессам безопасно получать доступ к этой памяти по мере необходимости. Часто первым шагом в этом является виртуальная адресация , обычно достигаемая путем подкачки страниц и/или сегментации . Виртуальная адресация позволяет ядру сделать заданный физический адрес похожим на другой адрес, виртуальный адрес. Виртуальные адресные пространства могут быть разными для разных процессов; память, к которой один процесс обращается по определенному (виртуальному) адресу, может отличаться от той, к которой другой процесс обращается по тому же адресу. Это позволяет каждой программе вести себя так, как будто она единственная (кроме ядра) запущенная, и таким образом предотвращает сбои приложений друг друга. [6]

Во многих системах виртуальный адрес программы может ссылаться на данные, которые в данный момент не находятся в памяти. Уровень косвенности, предоставляемый виртуальной адресацией, позволяет операционной системе использовать другие хранилища данных, такие как жесткий диск , для хранения того, что в противном случае должно было бы оставаться в основной памяти ( ОЗУ ). В результате операционные системы могут разрешать программам использовать больше памяти, чем физически доступно системе. Когда программе требуются данные, которые в данный момент не находятся в ОЗУ, ЦП сигнализирует ядру, что это произошло, и ядро ​​отвечает, записывая содержимое неактивного блока памяти на диск (при необходимости) и заменяя его данными, запрошенными программой. Затем программу можно возобновить с точки, на которой она была остановлена. Эта схема обычно известна как подкачка по требованию .

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

Управление устройством

Для выполнения полезных функций процессам необходим доступ к периферийным устройствам , подключенным к компьютеру, которые контролируются ядром через драйверы устройств . Драйвер устройства — это компьютерная программа, инкапсулирующая, контролирующая и управляющая аппаратным устройством (через его интерфейс HSI) от имени ОС. Он предоставляет операционной системе API, процедуры и информацию о том, как управлять и взаимодействовать с определенным элементом оборудования. Драйверы устройств являются важной и жизненно важной зависимостью для всех ОС и их приложений. Целью разработки драйвера является абстракция; функция драйвера — преобразовывать предписанные ОС вызовы абстрактных функций (программные вызовы) в вызовы, специфичные для устройства. Теоретически устройство должно работать правильно с подходящим драйвером. Драйверы устройств используются, например, для видеокарт, звуковых карт, принтеров, сканеров, модемов и сетевых карт.

На аппаратном уровне общие абстракции драйверов устройств включают в себя:

А на программном уровне абстракции драйверов устройств включают в себя:

Например, чтобы показать пользователю что-либо на экране, приложение должно сделать запрос к ядру, которое перенаправит запрос своему драйверу дисплея, который затем будет отвечать за фактическую отрисовку символа/пикселя. [6]

Ядро должно поддерживать список доступных устройств. Этот список может быть известен заранее (например, во встроенной системе , где ядро ​​будет переписано, если доступное оборудование изменится), настроен пользователем (типично для старых ПК и систем, не предназначенных для личного использования) или обнаружен операционной системой во время выполнения (обычно называется plug and play ). В системах plug and play диспетчер устройств сначала выполняет сканирование различных периферийных шин , таких как Peripheral Component Interconnect (PCI) или Universal Serial Bus (USB), для обнаружения установленных устройств, а затем ищет соответствующие драйверы.

Поскольку управление устройствами — это тема, сильно зависящая от ОС , эти драйверы обрабатываются по-разному в каждом виде архитектуры ядра, но в каждом случае ядро ​​должно предоставлять ввод -вывод , чтобы позволить драйверам физически получать доступ к своим устройствам через какой-либо порт или область памяти. При проектировании системы управления устройствами необходимо принимать важные решения, поскольку в некоторых проектах доступ может включать переключение контекста , что делает операцию очень интенсивной для ЦП и легко приводит к значительному снижению производительности. [ необходима цитата ]

Системные вызовы

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

Системный вызов — это механизм, который используется прикладной программой для запроса службы у операционной системы. Они используют инструкцию машинного кода , которая заставляет процессор менять режим. Примером может служить переход из режима супервизора в защищенный режим. Здесь операционная система выполняет такие действия, как доступ к аппаратным устройствам или блоку управления памятью . Обычно операционная система предоставляет библиотеку, которая находится между операционной системой и обычными пользовательскими программами. Обычно это библиотека C, такая как Glibc или Windows API. Библиотека обрабатывает низкоуровневые детали передачи информации ядру и переключения в режим супервизора. Системные вызовы включают close, open, read, wait и write.

Чтобы фактически выполнять полезную работу, процесс должен иметь возможность доступа к службам, предоставляемым ядром. Это реализуется по-разному каждым ядром, но большинство из них предоставляют библиотеку C или API , которые, в свою очередь, вызывают соответствующие функции ядра. [7]

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

Решения по проектированию ядра

Защита

Важным соображением при проектировании ядра является поддержка, которую оно обеспечивает для защиты от сбоев ( отказоустойчивость ) и от вредоносного поведения ( безопасность ). Эти два аспекта обычно не различаются четко, и принятие этого различия в проектировании ядра приводит к отказу от иерархической структуры для защиты . [5]

Механизмы или политики, предоставляемые ядром, можно классифицировать по нескольким критериям, включая: статические (применяемые во время компиляции ) или динамические (применяемые во время выполнения ); упреждающие или пост-обнаруживающие; в соответствии с принципами защиты, которым они удовлетворяют (например, Деннинг [8] [9] ); поддерживаются ли они оборудованием или основаны на языке; являются ли они в большей степени открытым механизмом или политикой привязки; и многое другое.

Поддержка иерархических доменов защиты [10] обычно реализуется с использованием режимов ЦП .

Многие ядра предоставляют реализацию «возможностей», т. е. объектов, которые предоставляются пользовательскому коду, которые разрешают ограниченный доступ к базовому объекту, управляемому ядром. Типичным примером является обработка файлов: файл — это представление информации, хранящейся на постоянном запоминающем устройстве. Ядро может иметь возможность выполнять множество различных операций, включая чтение, запись, удаление или выполнение, но приложению уровня пользователя может быть разрешено выполнять только некоторые из этих операций (например, ему может быть разрешено только читать файл). Типичная реализация этого заключается в том, что ядро ​​предоставляет объект приложению (обычно так называемый «дескриптор файла»), над которым приложение может затем вызывать операции, действительность которых ядро ​​проверяет во время запроса операции. Такая система может быть расширена для охвата всех объектов, которыми управляет ядро, и, конечно же, объектов, предоставляемых другими пользовательскими приложениями.

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

Альтернативный подход заключается в имитации возможностей с использованием обычно поддерживаемых иерархических доменов. В этом подходе каждый защищенный объект должен находиться в адресном пространстве, к которому приложение не имеет доступа; ядро ​​также поддерживает список возможностей в такой памяти. Когда приложению необходимо получить доступ к объекту, защищенному возможностью, оно выполняет системный вызов, а затем ядро ​​проверяет, предоставляет ли возможность приложения разрешение на выполнение запрошенного действия, и если это разрешено, выполняет доступ для него (либо напрямую, либо путем делегирования запроса другому процессу уровня пользователя). Стоимость производительности переключения адресного пространства ограничивает практичность этого подхода в системах со сложными взаимодействиями между объектами, но он используется в современных операционных системах для объектов, к которым нечасто обращаются или которые не должны выполняться быстро. [12] [13]

Если прошивка не поддерживает механизмы защиты, можно имитировать защиту на более высоком уровне, например, имитируя возможности манипулирования таблицами страниц , но это повлияет на производительность. [14] Однако отсутствие аппаратной поддержки может не быть проблемой для систем, которые решили использовать защиту на основе языка. [15]

Важным решением при проектировании ядра является выбор уровней абстракции, на которых должны быть реализованы механизмы и политики безопасности. Механизмы безопасности ядра играют важную роль в поддержке безопасности на более высоких уровнях. [11] [16] [17] [18] [19]

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

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

По мнению разработчиков Mars Research Group, отсутствие изоляции является одним из основных факторов, подрывающих безопасность ядра. [20] Они предлагают свою структуру изоляции драйверов для защиты, в первую очередь в ядре Linux. [21] [22]

Аппаратная или языковая защита

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

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

Преимущества такого подхода включают в себя:

К недостаткам можно отнести:

Примерами систем с языковой защитой являются JX и Singularity от Microsoft .

Процесс сотрудничества

Эдсгер Дейкстра доказал, что с логической точки зрения атомарные операции блокировки и разблокировки, работающие на двоичных семафорах, являются достаточными примитивами для выражения любой функциональности взаимодействия процессов. [24] Однако этот подход обычно считается недостаточным с точки зрения безопасности и эффективности, тогда как подход с передачей сообщений является более гибким. [25] Также доступен ряд других подходов (как более низкого, так и более высокого уровня), при этом многие современные ядра обеспечивают поддержку таких систем, как общая память и удаленные вызовы процедур .

Управление устройствами ввода-вывода

Идея ядра, в котором устройства ввода-вывода обрабатываются единообразно с другими процессами, как параллельные взаимодействующие процессы, была впервые предложена и реализована Бринчем Хансеном (хотя похожие идеи были предложены в 1967 году [26] [27] ). В описании этого Хансеном «общие» процессы называются внутренними процессами , в то время как устройства ввода-вывода называются внешними процессами . [25]

Подобно физической памяти, предоставление приложениям прямого доступа к портам и регистрам контроллера может привести к сбою контроллера или сбою системы. При этом, в зависимости от сложности устройства, некоторые устройства могут стать на удивление сложными для программирования и использовать несколько разных контроллеров. Из-за этого важно предоставить более абстрактный интерфейс для управления устройством. Этот интерфейс обычно выполняется драйвером устройства или уровнем абстракции оборудования. Часто приложениям требуется доступ к этим устройствам. Ядро должно поддерживать список этих устройств, запрашивая их у системы каким-либо образом. Это можно сделать через BIOS или через одну из различных системных шин (например, PCI/PCIE или USB). Используя пример видеодрайвера, когда приложение запрашивает операцию на устройстве, например, отображение символа, ядру необходимо отправить этот запрос текущему активному видеодрайверу. Видеодрайвер, в свою очередь, должен выполнить этот запрос. Это пример межпроцессного взаимодействия (IPC).

Подходы к проектированию на уровне ядра

Перечисленные выше задачи и функции могут быть реализованы многими способами, которые отличаются друг от друга по конструкции и реализации.

Принцип разделения механизма и политики является существенным различием между философией микро- и монолитных ядер. [28] [29] Здесь механизм является поддержкой, которая позволяет реализовать множество различных политик, в то время как политика является определенным «режимом работы». Пример:

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

В минимальном микроядре включены только некоторые самые основные политики, [29] и его механизмы позволяют тому, что работает поверх ядра (остальная часть операционной системы и другие приложения), решать, какие политики применять (например, управление памятью, высокоуровневое планирование процессов, управление файловой системой и т. д.). [5] [25] Монолитное ядро, напротив, имеет тенденцию включать множество политик, тем самым ограничивая остальную часть системы в использовании их.

Пер Бринч Хансен представил аргументы в пользу разделения механизма и политики. [5] [25] Неспособность должным образом выполнить это разделение является одной из основных причин отсутствия существенных инноваций в существующих операционных системах, [5] проблема, распространенная в компьютерной архитектуре. [30] [31] [32] Монолитный дизайн обусловлен архитектурным подходом к защите «режим ядра»/«пользовательский режим» (технически называемым иерархическими доменами защиты ), который распространен в обычных коммерческих системах; [33] фактически, каждый модуль, нуждающийся в защите, поэтому предпочтительно включать в ядро. [33] Эта связь между монолитным дизайном и «привилегированным режимом» может быть сведена к ключевому вопросу разделения механизма и политики; [5] фактически архитектурный подход «привилегированного режима» объединяет механизм защиты с политиками безопасности, в то время как основной альтернативный архитектурный подход, адресация на основе возможностей , четко различает их, что естественным образом приводит к микроядерному дизайну [5] (см. Разделение защиты и безопасности ).

В то время как монолитные ядра выполняют весь свой код в одном и том же адресном пространстве ( пространстве ядра ), микроядра пытаются запустить большую часть своих служб в пользовательском пространстве, стремясь улучшить удобство обслуживания и модульность кодовой базы. [4] Большинство ядер не вписываются точно в одну из этих категорий, а скорее находятся между этими двумя конструкциями. Они называются гибридными ядрами . Более экзотические конструкции, такие как наноядра и экзоядра, доступны, но редко используются в производственных системах. Например, гипервизор Xen является экзоядром.

Монолитные ядра

Схема монолитного ядра

В монолитном ядре все службы ОС работают вместе с основным потоком ядра, таким образом, также находясь в той же области памяти. Такой подход обеспечивает богатый и мощный доступ к оборудованию. Разработчик UNIX Кен Томпсон заявил, что «по [его] мнению, проще реализовать монолитное ядро». [34] Основными недостатками монолитных ядер являются зависимости между компонентами системы — ошибка в драйвере устройства может привести к сбою всей системы — и тот факт, что большие ядра могут стать очень сложными в обслуживании; Томпсон также заявил, что «[монолитному ядру] также проще превратиться в беспорядок в спешке по мере его изменения». [34]

Монолитные ядра, которые традиционно использовались в операционных системах типа Unix, содержат все основные функции операционной системы и драйверы устройств. Монолитное ядро ​​— это одна программа, которая содержит весь код, необходимый для выполнения каждой задачи, связанной с ядром. Каждая часть, к которой должно обращаться большинство программ, которые не могут быть помещены в библиотеку, находится в пространстве ядра: драйверы устройств, планировщик, обработка памяти, файловые системы и сетевые стеки. Множество системных вызовов предоставляется приложениям, чтобы позволить им получить доступ ко всем этим службам. Монолитное ядро, хотя изначально загружено подсистемами, которые могут не понадобиться, можно настроить до такой степени, что оно будет таким же быстрым или быстрее, чем то, которое было специально разработано для оборудования, хотя и более уместно в общем смысле.

Современные монолитные ядра, такие как ядро ​​Linux , ядро ​​FreeBSD , ядро ​​AIX , ядро ​​HP-UX и ядро ​​Solaris , все из которых относятся к категории Unix-подобных операционных систем, поддерживают загружаемые модули ядра , что позволяет загружать модули в ядро ​​во время выполнения, что позволяет легко расширять возможности ядра по мере необходимости, одновременно помогая минимизировать объем кода, работающего в пространстве ядра.

Большая часть работы в монолитном ядре выполняется через системные вызовы. Это интерфейсы, обычно хранящиеся в табличной структуре, которые обращаются к некоторой подсистеме внутри ядра, такой как дисковые операции. По сути, вызовы производятся внутри программ, и проверенная копия запроса передается через системный вызов. Следовательно, далеко ходить не надо. Монолитное ядро ​​Linux можно сделать чрезвычайно маленьким не только из-за его способности динамически загружать модули, но и из-за его простоты настройки. Фактически, есть некоторые версии, которые достаточно малы, чтобы поместиться вместе с большим количеством утилит и других программ на одном гибком диске и при этом обеспечить полностью функциональную операционную систему (одной из самых популярных является muLinux ). Эта возможность миниатюризации ядра также привела к быстрому росту использования Linux во встраиваемых системах .

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

При подходе на основе микроядра само ядро ​​обеспечивает только базовую функциональность, которая позволяет выполнять серверы — отдельные программы, которые берут на себя функции бывшего ядра, такие как драйверы устройств, серверы графического интерфейса и т. д.

Микроядра

Микроядро (также сокращенно μK или uK) — это термин, описывающий подход к проектированию операционной системы, при котором функциональность системы перемещается из традиционного «ядра» в набор «серверов», которые взаимодействуют через «минимальное» ядро, оставляя как можно меньше в «системном пространстве» и как можно больше в «пространстве пользователя». Микроядро, разработанное для определенной платформы или устройства, всегда будет иметь только то, что ему нужно для работы. Подход микроядра состоит в определении простой абстракции над оборудованием с набором примитивов или системных вызовов для реализации минимальных служб ОС, таких как управление памятью , многозадачность и межпроцессное взаимодействие . Другие службы, включая те, которые обычно предоставляются ядром, такие как сетевое взаимодействие , реализуются в программах пользовательского пространства, называемых серверами . Микроядра проще поддерживать, чем монолитные ядра, но большое количество системных вызовов и переключений контекста может замедлить работу системы, поскольку они обычно генерируют больше накладных расходов, чем простые вызовы функций.

Только те части, которые действительно требуют нахождения в привилегированном режиме, находятся в пространстве ядра: IPC (межпроцессное взаимодействие), базовый планировщик или примитивы планирования, базовая обработка памяти, базовые примитивы ввода-вывода. Многие критические части теперь работают в пространстве пользователя: полный планировщик, обработка памяти, файловые системы и сетевые стеки. Микроядра были изобретены как реакция на традиционную «монолитную» конструкцию ядра, в которой вся системная функциональность была помещена в одну статическую программу, работающую в специальном «системном» режиме процессора. В микроядре выполняются только самые фундаментальные задачи, такие как возможность доступа к некоторым (не обязательно всем) аппаратным средствам, управление памятью и координация передачи сообщений между процессами. Некоторые системы, использующие микроядра, — это QNX и HURD. В случае QNX и Hurd пользовательские сеансы могут быть полными снимками самой системы или представлениями, как их называют. Сама суть архитектуры микроядра иллюстрирует некоторые из ее преимуществ:

Большинство микроядер используют систему передачи сообщений для обработки запросов от одного сервера к другому. Система передачи сообщений обычно работает на основе порта с микроядром. Например, если отправляется запрос на больше памяти, порт открывается с микроядром и запрос отправляется через него. Попав в микроядро, шаги похожи на системные вызовы. Обоснованием было то, что это привнесет модульность в архитектуру системы, что повлечет за собой более чистую систему, более легкую для отладки или динамического изменения, настраиваемую под потребности пользователей и более производительную. Они являются частью операционных систем, таких как GNU Hurd , MINIX , MkLinux , QNX и Redox OS . Хотя микроядра сами по себе очень малы, в сочетании со всем необходимым вспомогательным кодом они, по сути, часто больше монолитных ядер. Сторонники монолитных ядер также отмечают, что двухуровневая структура микроядерных систем, в которой большая часть операционной системы не взаимодействует напрямую с оборудованием, создает немалые затраты с точки зрения эффективности системы. Эти типы ядер обычно предоставляют только минимальные услуги, такие как определение адресных пространств памяти, межпроцессное взаимодействие (IPC) и управление процессами. Другие функции, такие как запуск аппаратных процессов, не обрабатываются напрямую микроядрами. Сторонники микроядер отмечают, что эти монолитные ядра имеют тот недостаток, что ошибка в ядре может привести к сбою всей системы. Однако с микроядром, если процесс ядра выходит из строя, все еще возможно предотвратить сбой системы в целом, просто перезапустив службу, которая вызвала ошибку.

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

Однако недостатки микроядра существуют. Вот некоторые из них:

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

Микроядро позволяет реализовать оставшуюся часть операционной системы как обычную прикладную программу, написанную на языке высокого уровня , и использовать различные операционные системы поверх того же неизмененного ядра. Также возможно динамически переключаться между операционными системами и иметь более одной активной одновременно. [25]

Монолитные ядра против микроядер

По мере роста ядра компьютера растут и размер и уязвимость его доверенной вычислительной базы ; и, помимо снижения безопасности, существует проблема увеличения объема памяти . Это смягчается в некоторой степени путем совершенствования системы виртуальной памяти , но не все компьютерные архитектуры поддерживают виртуальную память. [b] Чтобы уменьшить объем памяти ядра, необходимо выполнить обширное редактирование для тщательного удаления ненужного кода, что может быть очень сложно из-за неочевидных взаимозависимостей между частями ядра с миллионами строк кода.

К началу 1990-х годов из-за различных недостатков монолитных ядер по сравнению с микроядрами монолитные ядра считались устаревшими практически всеми исследователями операционных систем. [ требуется ссылка ] В результате проектирование Linux как монолитного ядра, а не микроядра стало темой знаменитого спора между Линусом Торвальдсом и Эндрю Таненбаумом . [35] Аргументы, представленные в дебатах Таненбаума и Торвальдса , имеют свои достоинства с обеих сторон .

Производительность

Монолитные ядра спроектированы так, чтобы весь их код находился в одном адресном пространстве ( пространстве ядра ), что, по мнению некоторых разработчиков, необходимо для повышения производительности системы. [36] Некоторые разработчики также утверждают, что монолитные системы чрезвычайно эффективны, если они хорошо написаны. [36] Монолитная модель имеет тенденцию быть более эффективной [37] за счет использования общей памяти ядра, а не более медленной системы IPC микроядерных конструкций, которая обычно основана на передаче сообщений . [ требуется ссылка ]

Производительность микроядер была низкой как в 1980-х, так и в начале 1990-х годов. [38] [39] Однако исследования, которые эмпирически измеряли производительность этих микроядер, не анализировали причины такой неэффективности. [38] Объяснения этих данных были оставлены на усмотрение «фольклора», с предположением, что они были связаны с возросшей частотой переключений из «режима ядра» в «пользовательский режим», возросшей частотой межпроцессного взаимодействия и возросшей частотой переключений контекста . [38]

Фактически, как предполагалось в 1995 году, причинами плохой производительности микроядер могли быть: (1) фактическая неэффективность всего подхода микроядра , (2) конкретные концепции , реализованные в этих микроядрах, и (3) конкретная реализация этих концепций. Поэтому оставалось изучить, было ли решение для создания эффективного микроядра, в отличие от предыдущих попыток, применить правильные методы построения. [38]

С другой стороны, иерархическая архитектура доменов защиты , которая приводит к проектированию монолитного ядра [33], имеет существенный недостаток производительности каждый раз, когда происходит взаимодействие между различными уровнями защиты (т. е. когда процесс должен манипулировать структурой данных как в «режиме пользователя», так и в «режиме супервизора»), поскольку это требует копирования сообщений по значению . [40]

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

Гибридные (или модульные) ядра

Гибридные ядра используются в большинстве коммерческих операционных систем, таких как Microsoft Windows NT 3.1, NT 3.5, NT 3.51, NT 4.0, 2000, XP, Vista, 7, 8, 8.1 и 10. Собственная macOS от Apple использует гибридное ядро ​​под названием XNU , которое основано на коде из ядра OSF/1 Mach (OSFMK 7.3) [41] и монолитного ядра FreeBSD . Гибридные ядра похожи на микроядра, за исключением того, что они включают некоторый дополнительный код в пространстве ядра для повышения производительности. Эти ядра представляют собой компромисс, который был реализован некоторыми разработчиками для обеспечения основных преимуществ как монолитных, так и микроядер. Эти типы ядер являются расширениями микроядер с некоторыми свойствами монолитных ядер. В отличие от монолитных ядер, эти типы ядер не могут загружать модули во время выполнения самостоятельно. [ необходима цитата ] Это подразумевает запуск некоторых служб (таких как сетевой стек или файловая система ) в пространстве ядра для снижения накладных расходов на производительность традиционного микроядра, но при этом по-прежнему запуск кода ядра (например, драйверов устройств) в качестве серверов в пространстве пользователя.

Многие традиционно монолитные ядра теперь, по крайней мере, добавляют (или используют) возможность модуля. Наиболее известным из таких ядер является ядро ​​Linux. Модульное ядро ​​по сути может иметь части, встроенные в двоичный файл ядра или двоичные файлы, которые загружаются в память по требованию. Модуль с испорченным кодом может дестабилизировать работающее ядро. Можно написать драйвер для микроядра в совершенно отдельном пространстве памяти и протестировать его перед «выходом» в эксплуатацию. Когда модуль ядра загружается, он обращается к пространству памяти монолитной части, добавляя в него то, что ему нужно, тем самым открывая дверь для возможного загрязнения. Несколько преимуществ модульного (или) гибридного ядра:

Модули, как правило, взаимодействуют с ядром, используя модульный интерфейс некоторого рода. Интерфейс является обобщенным (хотя и специфичным для данной операционной системы), поэтому не всегда возможно использовать модули. Часто драйверам устройств может потребоваться больше гибкости, чем предоставляет модульный интерфейс. По сути, это два системных вызова, и часто проверки безопасности, которые должны быть выполнены только один раз в монолитном ядре, теперь могут быть выполнены дважды. Некоторые из недостатков модульного подхода:

Наноядра

Наноядро делегирует практически все службы, включая даже самые базовые, такие как контроллеры прерываний или таймер  , драйверам устройств , что делает требования к памяти ядра еще меньше, чем у традиционного микроядра. [42]

Экзоядра

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

Экзоядра сами по себе чрезвычайно малы. Однако они сопровождаются библиотечными операционными системами (см. также unikernel ), предоставляя разработчикам приложений функциональные возможности обычной операционной системы. Это сводится к тому, что каждый пользователь пишет свою собственную остальную часть ядра практически с нуля, что является очень рискованным, сложным и довольно пугающим заданием — особенно в ограниченной по времени производственной среде, поэтому экзоядра так и не прижились. [ необходима цитата ] Главным преимуществом систем на основе экзоядра является то, что они могут включать несколько библиотечных операционных систем, каждая из которых экспортирует свой API , например, один для разработки пользовательского интерфейса высокого уровня и один для управления в реальном времени .

Многоядерные

Многоядерная операционная система рассматривает многоядерную машину как сеть независимых ядер, как если бы это была распределенная система . Она не предполагает общей памяти, а скорее реализует межпроцессное взаимодействие как передачу сообщений . [43] [44] Barrelfish была первой операционной системой, которая была описана как многоядерная.

История разработки ядра

Ранние ядра операционных систем

Строго говоря, операционная система (и, следовательно, ядро) не требуется для запуска компьютера. Программы могут быть напрямую загружены и выполнены на машине «голого железа» , при условии, что авторы этих программ готовы работать без какой-либо аппаратной абстракции или поддержки операционной системы. Большинство ранних компьютеров работали таким образом в 1950-х и начале 1960-х годов, которые сбрасывались и перезагружались между выполнением различных программ. В конце концов, небольшие вспомогательные программы, такие как загрузчики программ и отладчики, оставались в памяти между запусками или загружались из ПЗУ . По мере их разработки они сформировали основу того, что стало ранними ядрами операционных систем. Подход «голого железа» все еще используется сегодня на некоторых игровых консолях и встроенных системах , [45] но в целом более новые компьютеры используют современные операционные системы и ядра.

В 1969 году многопрограммная система RC 4000 представила философию проектирования системы на основе небольшого ядра, «на котором операционные системы для различных целей могли бы быть построены упорядоченным образом» [46] , что впоследствии было названо подходом микроядра.

Операционные системы с разделением времени

В десятилетие, предшествовавшее Unix , компьютеры невероятно выросли в мощности — до такой степени, что операторы компьютеров искали новые способы заставить людей использовать свое свободное время на своих машинах. Одним из главных достижений в эту эпоху было разделение времени , когда несколько пользователей получали небольшие куски компьютерного времени, с такой скоростью, что казалось, что каждый из них подключен к своей собственной, более медленной машине. [47]

Разработка систем с разделением времени привела к ряду проблем. Одна из них заключалась в том, что пользователи, особенно в университетах, где разрабатывались системы, хотели взломать систему, чтобы получить больше процессорного времени. По этой причине безопасность и контроль доступа стали основными направлениями проекта Multics в 1965 году. [48] Другой постоянной проблемой было правильное управление вычислительными ресурсами: пользователи проводили большую часть своего времени, уставившись в терминал и думая о том, что ввести, вместо того, чтобы фактически использовать ресурсы компьютера, и система с разделением времени должна была предоставлять процессорное время активному пользователю в эти периоды. Наконец, системы обычно предлагали иерархию памяти в несколько слоев, и разделение этого дорогостоящего ресурса привело к серьезным разработкам в системах виртуальной памяти .

Амига

Commodore Amiga был выпущен в 1985 году и был одним из первых — и, безусловно, самых успешных — домашних компьютеров с усовершенствованной архитектурой ядра. Исполнительный компонент ядра AmigaOS, exec.library , использует микроядерную архитектуру передачи сообщений, но есть и другие компоненты ядра, такие как graphics.library , которые имеют прямой доступ к оборудованию. Защита памяти отсутствует, и ядро ​​почти всегда работает в пользовательском режиме. В режиме ядра выполняются только специальные действия, а приложения пользовательского режима могут запрашивать у операционной системы выполнение своего кода в режиме ядра.

Unix

Диаграмма взаимосвязи семейства предшественник/последователь для Unix-подобных систем

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

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

В модели Unix операционная система состоит из двух частей: во-первых, огромного набора служебных программ, которые управляют большинством операций; во-вторых, ядра, которое запускает программы. [49] В Unix, с точки зрения программирования, различие между ними довольно тонкое; ядро ​​— это программа, работающая в режиме супервизора, [c] которая действует как загрузчик программ и супервизор для небольших служебных программ, составляющих остальную часть системы, а также обеспечивает блокировку и службы ввода-вывода для этих программ; за пределами этого ядро ​​вообще не вмешивалось в пространство пользователя .

С годами вычислительная модель изменилась, и подход Unix ко всему как к файлу или потоку байтов больше не был столь универсальным, как раньше. Хотя терминал можно было рассматривать как файл или поток байтов, который печатается или считывается, то же самое, по-видимому, не было верно для графического пользовательского интерфейса . Сетевые технологии представляли собой еще одну проблему. Даже если сетевое взаимодействие можно сравнить с доступом к файлам, низкоуровневая пакетно-ориентированная архитектура имела дело с отдельными фрагментами данных, а не с целыми файлами. По мере роста возможностей компьютеров Unix становился все более загроможденным кодом. Это также связано с тем, что модульность ядра Unix широко масштабируется. [50] В то время как в семидесятых и восьмидесятых годах ядра могли иметь 100 000 строк кода , ядра, такие как Linux , современных преемников Unix, таких как GNU , имеют более 13 миллионов строк. [51]

Современные производные Unix, как правило, основаны на монолитных ядрах с загрузкой модулей. Примерами этого являются ядро ​​Linux во многих дистрибутивах GNU , IBM AIX , а также варианты ядер Berkeley Software Distribution, такие как FreeBSD , DragonFly BSD , OpenBSD , NetBSD и macOS . Помимо этих альтернатив, разработчики-любители поддерживают активное сообщество разработчиков операционных систем , заполненное самописными ядрами-любителями, которые в основном в конечном итоге разделяют многие функции с ядрами Linux, FreeBSD, DragonflyBSD, OpenBSD или NetBSD и/или совместимы с ними. [52]

Классическая Mac OS и macOS

Apple впервые выпустила свою классическую Mac OS в 1984 году в комплекте с персональным компьютером Macintosh . Apple перешла на дизайн наноядра в Mac OS 8.6. Напротив, современная macOS (первоначально называвшаяся Mac OS X) основана на Darwin , который использует гибридное ядро ​​под названием XNU , которое было создано путем объединения ядра 4.3BSD и ядра Mach . [53]

Майкрософт Виндоус

Microsoft Windows впервые была выпущена в 1985 году как дополнение к MS-DOS . Из-за своей зависимости от другой операционной системы, первые выпуски Windows, до Windows 95, считались операционной средой (не путать с операционной системой ). Эта линейка продуктов продолжала развиваться в течение 1980-х и 1990-х годов, с серией Windows 9x, добавившей 32-битную адресацию и упреждающую многозадачность; но закончилась с выпуском Windows Me в 2000 году.

Microsoft также разработала Windows NT , операционную систему с очень похожим интерфейсом, но предназначенную для высококлассных и бизнес-пользователей. Эта линейка началась с выпуска Windows NT 3.1 в 1993 году и была представлена ​​обычным пользователям с выпуском Windows XP в октябре 2001 года, заменив Windows 9x на совершенно другую, гораздо более сложную операционную систему. Эта линейка продолжается в Windows 11 .

Архитектура ядра Windows NT считается гибридным ядром, поскольку само ядро ​​содержит такие задачи, как диспетчер окон и диспетчеры IPC, с многоуровневой моделью подсистемы клиент/сервер. [54] Оно было разработано как модифицированное микроядро , поскольку ядро ​​Windows NT находилось под влиянием микроядра Mach , но не соответствует всем критериям чистого микроядра.

Руководитель IBM

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

Исторически этот термин в основном ассоциировался с линейкой операционных систем для мэйнфреймов IBM , начиная с OS/360 . В других операционных системах супервизор обычно называется ядром.

В 1970-х годах IBM еще больше абстрагировала состояние супервизора от оборудования, что привело к появлению гипервизора , который обеспечивал полную виртуализацию , т. е. возможность запускать несколько операционных систем на одной машине совершенно независимо друг от друга. Поэтому первая такая система была названа Virtual Machine или VM .

Разработка микроядер

Хотя Mach , разработанный Ричардом Рашидом в Университете Карнеги-Меллона , является самым известным микроядром общего назначения, были разработаны и другие микроядра с более конкретными целями. Семейство микроядер L4 (в основном ядра L3 и L4) было создано для демонстрации того, что микроядра не обязательно медленные. [55] Более новые реализации, такие как Fiasco и Pistachio, способны запускать Linux рядом с другими процессами L4 в отдельных адресных пространствах. [56] [57]

Кроме того, QNX — это микроядро, которое в основном используется во встраиваемых системах [58] , а программное обеспечение с открытым исходным кодом MINIX , изначально созданное для образовательных целей, теперь ориентировано на то, чтобы стать высоконадежной и самовосстанавливающейся микроядерной ОС.

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

Примечания

  1. ^ Это может зависеть от архитектуры компьютера.
  2. ^ Виртуальная адресация чаще всего достигается с помощью встроенного блока управления памятью .
  3. ^ Наивысший уровень привилегий имеет различные названия в разных архитектурах, например, режим супервизора, режим ядра, CPL0, DPL0, кольцо 0 и т. д. Для получения дополнительной информации см. Кольцо защиты .

Ссылки

  1. ^ ab "Kernel". Linfo . Bellevue Linux Users Group. Архивировано из оригинала 8 декабря 2006 года . Получено 15 сентября 2016 года .
  2. ^ Рэндал Э. Брайант; Дэвид Р. О'Халларон (2016). Компьютерные системы: точка зрения программиста (третье изд.). Пирсон. стр. 17. ISBN 978-0-13-409266-9.
  3. ^ см. Демон (вычисления)
  4. ^ ab Roch 2004
  5. ^ abcdefg Вульф, 1974, стр. 337–345.
  6. ^ ab Silberschatz 1991
  7. ^ Таненбаум, Эндрю С. (2008). Современные операционные системы (3-е изд.). Prentice Hall. стр. 50–51. ISBN 978-0-13-600663-3. . . . почти все системные вызовы [вызываются] из программ на языке C путем вызова библиотечной процедуры . . . Библиотечная процедура . . . выполняет инструкцию TRAP для переключения из пользовательского режима в режим ядра и запуска выполнения . . .
  8. ^ Деннинг 1976
  9. ^ Swift 2005, стр. 29 цитата: «изоляция, контроль ресурсов, проверка решений (проверка) и устранение ошибок».
  10. ^ Шредер 72
  11. ^ ab Линден 76
  12. ^ Эраниан, Стефан; Мосбергер, Дэвид (2002). "Виртуальная память в ядре Linux IA-64". Ядро Linux IA-64: проектирование и реализация . Prentice Hall PTR. ISBN 978-0-13-061014-0.
  13. ^ Зильбершатц и Гэлвин, Концепции операционных систем, 4-е изд., стр. 445 и 446
  14. ^ Хох, Чарльз; Дж. К. Браун (июль 1980 г.). «Реализация возможностей PDP-11/45». Обзор операционных систем ACM SIGOPS . 14 (3): 22–32. doi : 10.1145/850697.850701 . S2CID  17487360.
  15. ^ ab Шнайдер, Фред Б.; Морриссетт, Грег; Харпер, Роберт. «Подход к безопасности на основе языка» (PDF) . Архивировано (PDF) из оригинала 22.12.2018.
  16. ^ abc Loscocco, PA; Smalley, SD; Muckelbauer, PA; Taylor, RC; Turner, SJ; Farrell, JF (октябрь 1998 г.). «Неизбежность отказа: ошибочное предположение о безопасности в современных вычислительных средах». Труды 21-й Национальной конференции по безопасности информационных систем . стр. 303–314. Архивировано из оригинала 21-06-2007.
  17. ^ Лепро, Джей; Форд, Брайан; Хиблер, Майк (1996). "Постоянная релевантность локальной операционной системы для глобальных приложений". Труды 7-го семинара по ACM SIGOPS European workshop Systems support for global applications - EW 7. стр. 133–140. doi : 10.1145/504450.504477 . ISBN 978-1-4503-7339-5. S2CID  10027108.
  18. ^ Андерсон, Дж. (октябрь 1972 г.). Исследование планирования технологий компьютерной безопасности (PDF) (отчет). Том II. Подразделение электронных систем ВВС. ESD-TR-73-51, том II. Архивировано (PDF) из оригинала 21.07.2011.
  19. ^ Джерри Х. Зальцер; Майк Д. Шредер (сентябрь 1975 г.). «Защита информации в компьютерных системах». Труды IEEE . 63 (9): 1278–1308. CiteSeerX 10.1.1.126.9257 . doi :10.1109/PROC.1975.9939. S2CID  269166. Архивировано из оригинала 2021-03-08 . Получено 2007-07-15 . 
  20. ^ "Мелкозернистая изоляция ядра". mars-research.github.io . Получено 15 сентября 2022 г. .
  21. ^ Фетцер, Мэри. «Автоматическая изоляция драйверов устройств защищает от ошибок в операционных системах». Университет штата Пенсильвания через techxplore.com . Получено 15 сентября 2022 г.
  22. ^ Хуан, Юнчжэ; Нараянан, Викрам; Детвейлер, Дэвид; Хуан, Кайминг; Тан, Ганг; Йегер, Трент; Бурцев, Антон (2022). "KSplit: Автоматизация изоляции драйверов устройств" (PDF) . Получено 20 декабря 2023 г.
  23. ^ Джонатан С. Шапиро; Джонатан М. Смит; Дэвид Дж. Фарбер (1999). "EROS". Обзор операционных систем ACM Sigops . 33 (5): 170–185. doi :10.1145/319344.319163.
  24. ^ Дейкстра, Э. В. Взаимодействующие последовательные процессы . Матем. каф., Технологический университет, Эйндховен, сентябрь 1965 г.
  25. ^ abcde Бринч Хансен 70, стр. 238–241
  26. ^ Харрисон, MC; Шварц, JT (1967). "SHARER, система разделения времени для CDC 6600". Сообщения ACM . 10 (10): 659–665. doi : 10.1145/363717.363778 . S2CID  14550794.
  27. ^ Хакстейбл, ДХР; Уорик, МТ (1967). «Динамические супервизоры — их проектирование и строительство». Труды симпозиума ACM по принципам операционных систем — SOSP '67 . стр. 11.1–11.17. doi : 10.1145/800001.811675 . ISBN 978-1-4503-7370-8. S2CID  17709902 . Получено 20.12.2023 .
  28. ^ Байарди 1988
  29. ^ ab Левин 75
  30. ^ Деннинг 1980
  31. ^ Немер, Юрген (1991). «Бессмертие операционных систем, или: оправданы ли исследования в области операционных систем?». Lecture Notes In Computer Science; Vol. 563. Proceedings of the International Workshop on Operating Systems of the 90s and Beyond . pp. 77–83. doi :10.1007/BFb0024528. ISBN 3-540-54987-0. Последние 25 лет показали, что исследования архитектуры операционных систем оказали незначительное влияние на существующие основные [ sic ] системы.
  32. ^ Levy 84, стр. 1 цитата: «Хотя сложность компьютерных приложений увеличивается с каждым годом, базовая аппаратная архитектура приложений остается неизменной на протяжении десятилетий».
  33. ^ abc Levy 84, стр. 1 цитата: «Обычные архитектуры поддерживают единственный привилегированный режим работы. Эта структура приводит к монолитной конструкции; любой модуль, требующий защиты, должен быть частью единого ядра операционной системы. Если бы вместо этого любой модуль мог выполняться в защищенном домене, системы могли бы быть построены как набор независимых модулей, расширяемых любым пользователем».
  34. ^ ab "Open Sources: Voices from the Open Source Revolution". 1-56592-582-3 . 29 марта 1999 г. Архивировано из оригинала 1 февраля 2020 г. Получено 24 марта 2019 г.
  35. Записи дебатов между Торвальдсом и Таненбаумом можно найти на dina.dk Архивировано 03.10.2012 на Wayback Machine , groups.google.com Архивировано 26.05.2013 на Wayback Machine , oreilly.com Архивировано 21.09.2014 на Wayback Machine и на сайте Эндрю Таненбаума Архивировано 05.08.2015 на Wayback Machine
  36. ^ ab Matthew Russell. "What Is Darwin (and How It Powers Mac OS X)". O'Reilly Media . Архивировано из оригинала 2007-12-08 . Получено 2008-12-09 . Тесно связанная природа монолитного ядра позволяет ему очень эффективно использовать базовое оборудование [...] Микроядра, с другой стороны, запускают гораздо больше основных процессов в пользовательском пространстве. [...] К сожалению, эти преимущества достигаются ценой того, что микроядру приходится передавать большой объем информации в пространство ядра и из него через процесс, известный как переключение контекста. Переключение контекста приводит к значительным накладным расходам и, следовательно, к снижению производительности.
  37. ^ "Операционные системы/Модели ядра - Викиверситет". en.wikiversity.org . Архивировано из оригинала 2014-12-18 . Получено 2014-12-18 .
  38. ^ abcd Лидтке 95
  39. ^ Härtig 97
  40. ^ Хансен 73, раздел 7.3 стр.233 " взаимодействие между различными уровнями защиты требует передачи сообщений по значению "
  41. Маги, Джим. WWDC 2000, сессия 106 – Mac OS X: ядро. 14 минут. Архивировано из оригинала 30 октября 2021 г.
  42. ^ "Архитектура KeyKOS Nanokernel". Архивировано из оригинала 2011-06-21.
  43. ^ Бауманн, Эндрю; Бархэм, Пол; Даган, Пьер-Эварист; Харрис, Тим; Айзекс, Ребекка; Питер, Саймон; Роско, Тимоти; Шупбах, Адриан; Сингхания, Ахилеш (2009). Многоядро: новая архитектура ОС для масштабируемых многоядерных систем (PDF) . 22-й симпозиум по принципам операционных систем.
  44. ^ «Операционная система Barrelfish».
  45. ^ Болл: Проекты встроенных микропроцессоров, стр. 129
  46. ^ Хансен 2001 (ос), стр. 17–18.
  47. ^ "BSTJ-версия статьи C.ACM Unix". bell-labs.com . Архивировано из оригинала 2005-12-30 . Получено 2006-08-17 .
  48. ^ Корбато, Ф. Дж .; Высоцкий, В. А. Введение и обзор системы Multics. Объединенная компьютерная конференция осени 1965 г. Архивировано из оригинала 09.07.2011.
  49. ^ ab "The Single Unix Specification". The Open Group . Архивировано из оригинала 2016-10-04 . Получено 2016-09-29 .
  50. ^ "Unix's Revenge". asymco.com . 29 сентября 2010 г. Архивировано из оригинала 9 ноября 2010 г. Получено 2 октября 2010 г.
  51. Уилер, Дэвид А. (12 октября 2004 г.). «Linux Kernel 2.6: It's Worth More!».
  52. ^ Это сообщество в основном собирается на Bona Fide OS Development (архивировано 17.01.2022 на Wayback Machine) , на доске объявлений Mega-Tokyo (архивировано 25.01.2022 на Wayback Machine) и на других сайтах энтузиастов операционных систем.
  53. ^ Сингх, Амит (декабрь 2003 г.). "XNU: The Kernel". Архивировано из оригинала 2011-08-12.
  54. ^ "Windows - Официальный сайт Microsoft Windows 10 Home & Pro OS, ноутбуков, ПК, планшетов и многого другого". windows.com . Архивировано из оригинала 20-08-2011 . Получено 24-03-2019 .
  55. ^ "Семейство микроядер L4 - Обзор". os.inf.tu-dresden.de . Архивировано из оригинала 2006-08-21 . Получено 2006-08-11 .
  56. ^ "Микроядро Fiasco - Обзор". os.inf.tu-dresden.de . Архивировано из оригинала 2006-06-16 . Получено 2006-07-10 .
  57. ^ Zoller (неактивен), Heinz (7 декабря 2013 г.). "L4Ka - L4Ka Project". www.l4ka.org . Архивировано из оригинала 19 апреля 2001 г. . Получено 24 марта 2019 г. .
  58. ^ "Операционные системы QNX". blackberry.qnx.com . Архивировано из оригинала 2019-03-24 . Получено 2019-03-24 .

Источники

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

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