XNU (X is Not UNIX)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 10:02, 2 ноября 2018.
XNU kernel
Разработчик Apple Inc.
Написана на C, C++ (язык программирования)
Линейка ОС Unix-like, UNIX
Состояние разработки Действующая
Исходный код Открытый код
Дата первого релиза December 1996 (1996-12)
Доступно в Английский и другие
Платформы IA-32, x86-64, ARM (Advanced RISC Machine)
Ядро (тип) Гибридный
Лицензия Apple Public Source License 2.0
Официальный веб-сайт opensource.apple.com/source/xnu

XNU - это ядро компьютерной операционной системы, разработанное в Apple Inc. с декабря 1996 года для использования в операционной системе macOS и выпущенное как бесплатное программное обеспечение с открытым исходным кодом как часть операционной системы Darwin. Он также используется в качестве ядра для программ Apple TV Software, Apple iOS, WatchOS, tvOS и audioOS. XNU является аббревиатурой X не является UNIX или XNU не является UNIX.

Архитектура ядра

Рисунок 1 – OS X kernel архитектура

XNU – это гибридное ядро, которое сочетает в себе множество преимуществ, а также недостатков, монолитных и микроядерных ОС. Собственно, XNU, как можно видеть на рисунке 1, состоит из микроядра Mach, разработанного институтом Карнеги Мелоуна, подсистемы Posix из BSD 4.3 (позже эта часть синхронизировалась с последней веткой FreeBSD, дописывалась самой Apple, а также 3-ми лицами), и объектно-ориентированного фреймворка IOKit, на который положена ответственность взаимодействовать с аппаратной частью Mac’ов. Стоит упомянуть, что ядро mach предоставляет операционной системе следующие сервисы: планировщик потоков и процессов, вытесняющую многозадачность (pre-emptive), механизм виртуальной памяти, защиту памяти, mach-IPC (через передачу сообщений), отладчик ядра.[Источник 1]

Начиная с 2007 года, XNU работает на процессорах ARM, IA-32 и x86-64, как на одном процессоре, так и на моделях с симметричной мультипроцессорностью (SMP (Symmetric Multiprocessing)). Поддержка PowerPC удаляется с версии 10 (т.е. Mac OS X 10.6).

Mach

Основные сервисы и примитивы ядра OS X основаны на Mach 3.0. Apple изменила и расширила Mach, чтобы лучше соответствовать функциональным целям OS X и производительности.

Mach 3.0 первоначально был задуман как простое, расширяемое коммуникационное микроядро. Он может работать как автономное ядро ​​с другими традиционными операционными системами, такими как I / O, файловые системы и сетевые стеки, работающие как серверы режима пользователя.

Однако в OS X Mach связан с другими компонентами ядра в одно адресное пространство ядра. Это сделано прежде всего для повышения производительности; гораздо быстрее сделать прямой вызов между связанными компонентами, чем отправлять сообщения или делать удаленные вызовы процедур (RPC) между отдельными задачами. Эта модульная структура приводит к более надежной и расширяемой системе, чем позволяет монолитное ядро ​​без ущерба для производительности чистого микроядра.

Таким образом, в OS X Mach не является главным узлом связи между клиентами и серверами. Вместо этого его ценность состоит из его абстракций, расширяемости и гибкости. В частности, Mach обеспечивает:

  • объектные API (Application Programming Interface) с каналами связи (например, порты) в качестве объектных ссылок
  • высокопараллельное выполнение, включая преднамеренно запланированные потоки и поддержку SMP (Symmetric Multiprocessing)
  • гибкая структура планирования с поддержкой использования в режиме реального времени
  • полный набор примитивов IPC, включая обмен сообщениями, RPC, синхронизацию и уведомление
  • поддержка больших виртуальных адресных пространств, областей разделяемой памяти и объектов памяти, поддерживаемых постоянным хранилищем
  • проверенную расширяемость и переносимость, например, в архитектуре набора команд и в распределенных средах
  • безопасность и управление ресурсами как основополагающий принцип проектирования; все ресурсы виртуализированы[Источник 2]

BSD

Над уровнем Mach, уровень BSD предоставляет API-интерфейсы и службы ОС. Уровень BSD (Berkeley Software Distribution) основан на ядре BSD, в первую очередь FreeBSD. Компонент BSD обеспечивает:

  • файловые системы
  • сети (за исключением уровня аппаратного устройства)
  • Модель безопасности UNIX
  • поддержка syscall
  • модель процесса BSD, включая идентификаторы процессов и сигналы
  • API-интерфейсы ядра FreeBSD
  • многие из API POSIX
  • поддержка ядра для pthreads (потоки POSIX)[Источник 3]

Также BSD предоставляет множество дополнительных функций, в том числе:

  • Упреждающая многозадачность с динамической настройкой приоритета. Гладкое и справедливое распределение компьютерных ресурсов между приложениями и пользователями обеспечивается даже при самых тяжелых нагрузках.
  • Многопользовательский доступ. Многие люди могут использовать систему OS X одновременно для самых разных целей. Это означает, например, что системные периферийные устройства, такие как принтеры и диски, должным образом распределяются между всеми пользователями в системе или в сети и что отдельные ограничения ресурсов могут быть размещены на пользователях или группах пользователей, защищая критические системные ресурсы от чрезмерного использования.
  • Сильная сеть TCP/IP (Transmission Control Protocol/Internet Protocol) с поддержкой отраслевых стандартов, таких как SLIP (Serial Line Internet Protocol), PPP (Point-to-Point Protocol) и NFS (Network File System). OS X может легко взаимодействовать с другими системами, а также выступать в качестве корпоративного сервера, обеспечивая жизненно важные функции, такие как NFS (удаленный доступ к файлам) и почтовые службы, или интернет-услуги, такие как HTTP, FTP, маршрутизация и услуги брандмауэра (безопасности).
  • Защита памяти. Приложения не могут мешать друг другу. Одна из проблемных приложений не влияет на других.
  • Виртуальная память и распределение динамической памяти. Приложения с большими аппетитами для памяти удовлетворяются, сохраняя при этом интерактивный ответ пользователям. С системой виртуальной памяти в OS X каждое приложение имеет доступ к своему 4 ГБ адресному пространству памяти; это должно удовлетворять даже большинству голодных приложений.
  • Поддержка потоков ядра на основе потоков Mach. Потоки потоков пользовательского уровня реализуются поверх потоков ядра. Каждый поток ядра представляет собой независимо запланированный объект. Когда поток из пользовательского процесса блокируется в системном вызове, другие потоки из того же процесса могут продолжать выполняться на том или другом процессоре. По умолчанию процесс в обычном смысле имеет один поток, основной поток. Пользовательский процесс может использовать API-интерфейс потока POSIX для создания других пользовательских потоков.
  • Поддержка SMP. Поддержка включена для компьютеров с несколькими процессорами.
  • Исходный код. Разработчики получают максимальную степень контроля над средой программирования BSD.[Источник 4]

K32/K64

XNU в Mac OS X Snow Leopard, v10.6, (Darwin version 10) поставляется в двух вариантах: 32-битная версия под названием K32 и 64-разрядная версия под названием K64. K32 может запускать 64-битные приложения в userland. Что нового в Mac OS X 10.6 - это возможность запуска XNU в 64-битном пространстве ядра. K32 был ядром по умолчанию для сервера 10.6 при использовании на всех машинах, кроме моделей Mac Pro и Xserve, начиная с 2008 года и может запускать 64-разрядные приложения. K64 имеет несколько преимуществ по сравнению с K32:

  • Может управлять более чем 32 ГБ оперативной памяти, так как карта памяти будет потреблять непропорционально большую площадь 32-битного пространства ядра.
  • Размер буфера кэша может быть больше, чем позволяет 32-битное пространство ядра, что потенциально увеличивает производительность ввода-вывода.
  • Производительность повышается при использовании высокопроизводительных сетевых устройств или нескольких графических процессоров (графических процессоров), поскольку ядро может отображать все устройства в 64-битном пространстве, даже если у нескольких есть очень большие буферы прямого доступа к памяти (DMA).

Загрузка при удержании 6 и 4 заставляет машину загружать K64 на машинах, поддерживающих 64-разрядные ядра. K64 будет запускать 32-битные приложения, но он не будет запускать 32-разрядные расширения ядра (KEXT), поэтому их необходимо портировать на K64, чтобы они могли загружаться.

XNU в Mac OS X Lion, v10.7 и более поздних версиях обеспечивает только 64-битное ядро.

Ввод / вывод

IOKit – это наследие NeXT Computer. IOKit – это объектно-ориентированный фреймворк реализующий драйверную модель Mac OS X. Написан IOKit на С++, вернее на его урезанной версии – Embedded C++ [Источник 5]. Проще говоря, это старый добрый С++ без множественного наследования, RTTI, шаблонов и исключений. Также в IOKit запрещается определять конструкторы и деструкторы классов. Ранее IOKit был написан на Objective C, как и фреймворк Cocoa, и назывался Driver Kit. Однако, для упрощения разработки драйверов 3-ми лицами, Driver Kit переписали на C++. Впрочем, по словам одного из основных разработчиков IOKit, Годфри ван дер Линдена (Godfrey van der Linden), это решение было ошибочным. Тем не менее, в IOKit можно невооруженным взглядом увидеть наследие Objective C, к примеру механизм подсчета ссылок и retain/release, именование классов (приставки OS и IO), именование методов классов и многое другое. Еще один интересный факт: Godfrey van der Linden — студент университета Nicta, того самого австралийского НИИ, который открыл исследовательский проект Darbat.

Многие драйверы могут быть записаны для запуска из пользовательского пространства, что дополнительно усиливает устойчивость системы. Если произойдет сбой драйвера пользовательского пространства, это не приведет к сбою ядра. Однако, если сбой ядра ядра упадет, это приведет к сбою ядра. Примеры драйверов ядра включают драйверы адаптера диска и сетевого адаптера, графические драйверы, драйверы для хост-контроллеров Universal Serial Bus (USB) и FireWire и драйверы для программного обеспечения виртуальной машины, такие как VirtualBox, Parallels Desktop для OS X и VMware Fusion.

С момента своего создания основной целью набора I / O было учесть и расширить собственные функции и возможности OS X, в особенности среды ядра. В качестве модели драйвера для OS X набор I / O поддерживает следующие функции:

  • Динамическая и автоматическая настройка устройства (plug-and-play)
  • Многие новые типы устройств, включая графическое ускорение и мультимедийные устройства
  • Управление питанием (например, режим «сна»)
  • Обеспечение ядра защищенной памятью - отдельные адресные пространства для программ ядра и пользователя
  • Упреждающая многозадачность
  • Симметричная многопроцессорная обработка
  • Общие абстракции, разделяемые между типами устройств
  • Усовершенствованный опыт разработки - новые драйверы должны быть легкими в написании

I / O Kit поддерживает эти функции ядра с новой моделью для драйверов устройств и добавляет некоторые дополнительные функции:

  • Объектно-ориентированная структура, реализующая общее поведение, распределенная между всеми драйверами и типами (семействами) драйверов
  • Компоненты потоков, связи и управления данными для решения проблем, связанных с многопроцессорной обработкой, управлением задачами и передачами ввода-вывода
  • Прочный, эффективный механизм сопряжения и нагрузки, который хорошо масштабируется для всех типов шин
  • Реестр ввода-вывода, база данных, которая отслеживает объекты, созданные экземпляром (например, экземпляры драйверов), и предоставляет информацию о них
  • Каталог I / O, база данных всех классов ввода / вывода, доступных в системе
  • Набор интерфейсов устройств - подключаемые механизмы, которые позволяют приложениям и другому программному обеспечению в «пространстве пользователя» взаимодействовать с драйверами
  • Отличная общая производительность
  • Поддержка произвольно сложного расслоения объектов клиента и поставщика[Источник 6]

Источник

  1. Основы работы с IOKit. Тонкости программирования драйверов / habr.com [2008] //URL: https://habr.com/post/36875/ (дата обращения: 19.10.2018)
  2. Mach Overview / developer.apple.com [2013] //URL: https://developer.apple.com/library/archive/documentation/Darwin/Conceptual/KernelProgramming/Mach/Mach.html#//apple_ref/doc/uid/TP30000905-CH209-TPXREF101 (дата обращения: 19.10.2018)
  3. Kernel Architecture Overview / developer.apple.com [2013] //URL: https://developer.apple.com/library/archive/documentation/Darwin/Conceptual/KernelProgramming/Architecture/Architecture.html#//apple_ref/doc/uid/TP30000905-CH1g-TPXREF104 (дата обращения: 19.10.2018)
  4. BSD Overview / developer.apple.com [2013] //URL: https://developer.apple.com/library/archive/documentation/Darwin/Conceptual/KernelProgramming/BSD/BSD.html#//apple_ref/doc/uid/TP30000905-CH214-TPXREF101 (дата обращения: 19.10.2018)
  5. Embedded C++ // Википедия. [2018]. Дата обновления: 30.05.2018. URL: https://en.wikipedia.org/wiki/Embedded_C%2B%2B (дата обращения: 31.10.2018)
  6. What Is the I/O Kit? // developer.apple.com. [2014] URL: https://developer.apple.com/library/archive/documentation/DeviceDrivers/Conceptual/IOKitFundamentals/Features/Features.html#//apple_ref/doc/uid/TP0000012-TPXREF101 (дата обращения: 31.10.2018)

Ссылки