Ios это linux или нет

Обновлено: 02.07.2024

Все в курсе, что мобильные девайсы Apple работают под управлением iOS. Многие знают, что iOS представляет собой облегченную версию настольной Mac OS X. Некоторые догадываются, что в основе Mac OS X лежит POSIX-совместимая ОС Darwin, а те, кто всерьез интересуется IT, в курсе, что основа Darwin — это ядро XNU, появившееся на свет в результате слияния микроядра Mach и компонентов ядра FreeBSD. Однако все это голые факты, которые ничего не скажут нам о том, как же на самом деле работает iOS и в чем ее отличия от настольного собрата.

Mac OS X

Операционная система, установленная сегодня на все маки и (в измененном виде) на айдевайсы, ведет свою историю аж с 1988 года, который в мире IT известен также тем, что стал годом выпуска первой бета-версии операционной системы NeXTSTEP. Сама NeXTSTEP была детищем команды разработчиков Стива Джобса, который к тому времени уже покинул Apple и основал компанию NeXT, которая занялась разработкой компьютеров для образовательных нужд.

В момент своего появления на свет NeXTSTEP была поистине передовой операционной системой, которая включала в себя множество технологических новаций. В основе ОС лежало модифицированное микроядро Mach, дополненное компонентами ядра FreeBSD, включая эталонную реализацию сетевого стека. Более высокоуровневые компоненты NeXTSTEP были написаны с использованием языка Objective-C и предоставляли разработчикам приложений богатый объектно-ориентированный API. Система была снабжена развитым и весьма удобным графическим интерфейсом (ключевые компоненты которого сохранились в OS X и даже iOS) и мощной средой разработки, включавшей в себя в том числе известный всем современным разработчикам визуальный дизайнер интерфейса.

После провала NeXT и возвращения Стива Джобса в компанию Apple в 1997 году NeXTSTEP легла в основу проекта Rhapsody, в рамках которого началась разработка системы-наследника Mac OS 9. В 2000 году из Rhapsody был выделен открытый проект Darwin, исходники которого опубликованы под лицензией APSL, а уже в 2001 году появилась на свет OS X 10.0, построенная на его основе. Спустя несколько лет Darwin лег в основу операционной системы для готовящегося к выпуску смартфона, о котором до 2007-го, кроме слухов, не было известно почти ничего.

Рабочий стол NeXTSTEP. Справа можно видеть док, который в OS X/ iOS переехал в нижнюю часть экрана

XNU и Darwin

Условно начинку OS X / iOS можно разделить на три логических уровня: ядро XNU, слой совместимости со стандартом POSIX (плюс различные системные демоны/сервисы) и слой NeXTSTEP, реализующий графический стек, фреймворк и API приложений. Darwin включает в себя первые два слоя и распространяется свободно, но только в версии для OS X. iOS-вариант, портированный на архитектуру ARM и включающий в себя некоторые доработки, полностью закрыт и распространяется только в составе прошивок для айдевайсов (судя по всему, это защита от портирования iOS на другие устройства).

По своей сути Darwin — это «голая» UNIX-подобная ОС, которая включает в себя POSIX API, шелл, набор команд и сервисов, минимально необходимых для работы системы в консольном режиме и запуска UNIX-софта. В этом плане он похож на базовую систему FreeBSD или минимальную установку какого-нибудь Arch Linux, которые позволяют запустить консольный UNIX-софт, но не имеют ни графической оболочки, ни всего необходимого для запуска серьезных графических приложений из сред GNOME или KDE.

Ключевой компонент Darwin — гибридное ядро XNU, основанное, как уже было сказано выше, на ядре Mach и компонентах ядра FreeBSD, таких как планировщик процессов, сетевой стек и виртуальная файловая система (слой VFS). В отличие от Mach и FreeBSD, ядро OS X использует собственный API драйверов, названный I/O Kit и позволяющий писать драйверы на C++, используя объектно-ориентированный подход, сильно упрощающий разработку.

iOS использует несколько измененную версию XNU, однако в силу того, что ядро iOS закрыто, сказать, что именно изменила Apple, затруднительно. Известно только, что оно собрано с другими опциями компилятора и модифицированным менеджером памяти, который учитывает небольшие объемы оперативки в мобильных устройствах. Во всем остальном это все то же XNU, которое можно найти в виде зашифрованного кеша (ядро + все драйверы/модули) в каталоге /System/Library/Caches/com.apple.kernelcaches/kernelcache на самом устройстве.

Уровнем выше ядра в Darwin располагается слой UNIX/BSD, включающий в себя набор стандартных библиотек языка си (libc, libmatch, libpthread и так далее), а также инструменты командной строки, набор шеллов (bash, tcsh и ksh) и демонов, таких как launchd и стандартный SSH-сервер. Последний, кстати, можно активировать путем правки файла /System/Library/LaunchDaemons/ssh.plist. Если, конечно, джейлбрейкнуть девайс.

На этом открытая часть ОС под названием Darwin заканчивается, и начинается слой фреймворков, которые как раз и образуют то, что мы привыкли считать OS X / iOS.

Слой Darwin

Описание фреймворков iOS на сайте Apple

Фреймворки

Darwin реализует лишь базовую часть Mac OS / iOS, которая отвечает только за низкоуровневые функции (драйверы, запуск/остановка системы, управление сетью, изоляция приложений и так далее). Та часть системы, которая видна пользователю и приложениям, в его состав не входит и реализована в так называемых фреймворках — наборах библиотек и сервисов, которые отвечают в том числе за формирование графического окружения и высокоуровневый API для сторонних и стоковых приложений

Как и во многих других ОС, API Mac OS и iOS разделен на публичный и приватный. Сторонним приложениям доступен исключительно публичный и сильно урезанный API, однако jailbreak-приложения могут использовать и приватный.

В стандартной поставке Mac OS и iOS можно найти десятки различных фреймворков, которые отвечают за доступ к самым разным функциям ОС — от реализации адресной книги (фреймворк AddressBook) до библиотеки OpenGL (GLKit). Набор базовых фреймворков для разработки графических приложений объединен в так называемый Cocoa API, своего рода метафреймворк, позволяющий получить доступ к основным возможностям ОС. В iOS он носит имя Cocoa Touch и отличается от настольной версии ориентацией на сенсорные дисплеи.

Далеко не все фреймворки доступны в обеих ОС. Многие из них специфичны только для iOS. В качестве примеров можно привести AssetsLibrary, который отвечает за работу с фотографиями и видео, CoreBlueTooth, позволяющий получить доступ к синезубу, или iAd, предназначенный для вывода рекламных объявлений в приложениях. Другие фреймворки существуют только в настольной версии системы, однако время от времени Apple переносит те или иные части iOS в Mac OS или обратно, как, например, случилось с фреймворком CoreMedia, который изначально был доступен только в iOS.

Все стандартные системные фреймворки можно найти в системном каталоге /System/Library/Frameworks/. Каждый из них находится в своем собственном каталоге, называемом бандлом (boundle), который включает в себя ресурсы (изображения и описание элементов интерфейса), хидеры языка си, описывающие API, а также динамически загружаемую библиотеку (в формате dylib) с реализацией фреймворка.

Одна из интересных особенностей фреймворков — их версионность. Один фреймворк может иметь сразу несколько разных версий, поэтому приложение, разработанное для устаревших версий системы, будет продолжать работать, даже несмотря на изменения, внесенные в новые версии ОС. Именно так реализован механизм запуска старых iOS-приложений в iOS 7 и выше. Приложение, разработанное для iOS 6, будет выглядеть и работать именно так, как если бы оно было запущено в iOS 6.

SpringBoard

Уровнем выше находятся приложения, системные и устанавливаемые из магазина приложений. Центральное место среди них занимает, конечно же, SpringBoard (только в iOS), реализующее домашний экран (рабочий стол). Именно оно запускается первым после старта системных демонов, загрузки в память фреймворков и старта дисплейного сервера (он же менеджер композитинга, он же Quartz Compositor), отвечающего за вывод изображения на экран.

SpringBoard — это связующее звено между операционной системой и ее пользователем, графический интерфейс, позволяющий запускать приложения, переключаться между ними, просматривать уведомления и управлять некоторыми настройками системы (начиная с iOS 7). Но также это и обработчик событий, таких как касание экрана или переворот устройства. В отличие от Mac OS X, которая использует различные приложения и демоны-агенты для реализации компонентов интерфейса (Finder, Dashboard, LaunchPad и другие), в iOS почти все базовые возможности интерфейса пользователя, в том числе экран блокировки и «шторка», заключены в одном SpringBoard.

В отличие от других стоковых приложений iOS, которые располагаются в каталоге /Applications, SpringBoard наравне с дисплейным сервером считается частью фреймворков и располагается в каталоге /System/Library/CoreServices/. Для выполнения многих задач он использует плагины, которые лежат в /System/Library/SpringBoardPlugins/. Кроме всего прочего, там можно найти, например, NowPlayingArtLockScreen.lockboundle, отвечающий за отображение информации о проигрываемой композиции на экране блокировки, или IncomingCall.serviceboundle, ответственный за обработку входящего звонка.

Начиная с iOS 6 SpringBoard разделен на две части: сам рабочий стол и сервис BackBoard, ответственный за коммуникации с низкоуровневой частью ОС, работающей с оборудованием (уровень HAL). BackBoard отвечает за обработку таких событий, как касания экрана, нажатия клавиш, получение показания акселерометра, датчика положения и датчика освещенности, а также управляет запуском, приостановкой и завершением приложений.

SpringBoard и BackBoard имеют настолько большое значение для iOS, что, если каким-либо образом их остановить, вся система застынет на месте и даже запущенное в данный момент приложение не будет реагировать на касания экрана. Это отличает их от домашнего экрана Android, который является всего лишь стандартным приложением, которое можно остановить, заменить или вообще удалить из системы (в этом случае на экране останутся вполне рабочие кнопки навигации и строка состояния со «шторкой»).

Приложения

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

Стандартный каталог хранения стоковых приложений — /Applications/. В iOS он абсолютно статичный и изменяется только во время обновлений системы; пользователь получить к нему доступ не может. Сторонние приложения, устанавливаемые из iTunes, напротив, хранятся в домашнем каталоге пользователя /var/mobile/Applications/ внутри подкаталогов, имеющих вид 4-2-2-2-4, где два и четыре — это шестнадцатеричные числа. Это так называемый GUID — уникальный идентификатор, который однозначно идентифицирует приложение в системе и нужен в том числе для создания изолированной песочницы (sandbox).

Sandbox

В iOS песочницы используются для изолирования сервисов и приложений от системы и друг от друга. Каждое стороннее приложение и большинство системных работают в песочнице. С технической точки зрения песочница представляет собой классический для мира UNIX chroot, усиленный системой принудительного контроля доступа TrustedBSD MAC (модуль ядра sandbox.kext), которая отрезает приложениям не только доступ к файлам за пределами домашнего каталога, но и прямой доступ к железу и многим системным функциям ОС.

В целом заключенное в sandbox приложение ограничено в следующих возможностях:

  • Доступ к файловой системе за исключением своего собственного каталога и домашнего каталога пользователя.
  • Доступ к каталогам Media и Library внутри домашнего каталога за исключением Media/DCIM/, Media/Photos/, Library/AddressBook/, Library/Keyboard/ и Library/Preferences/.
  • Доступ к информации о других процессах (приложение «считает» себя единственным в системе).
  • Прямой доступ к железу (разрешено использовать только Cocoa API и другие фреймворки).
  • Ограничение на использование оперативной памяти (контролируется механизмом Jatsam).

Все эти ограничения соответствуют sandbox-профилю (набору ограничивающих правил) container и применяются к любому стороннему приложению. Для стоковых приложений, в свою очередь, могут применяться другие ограничения, более мягкие или жесткие. В качестве примера можно привести почтовый клиент (профиль MobileMail), который в целом имеет такие же серьезные ограничения, как и сторонние приложения, но может получить доступ ко всему содержимому каталога Library/. Обратная ситуация — SpringBoard, вообще не имеющий ограничений.

Вторая проблема — это защита системы от самой себя и пользователя. Баги могут существовать как в стоковом софте от Apple, так и в головах юзеров. Sandbox защищает от обоих. Даже если злоумышленник найдет дыру в Safari и попытается ее эксплуатировать, он все равно останется в песочнице и не сможет навредить системе. А юзер не сможет «сломать свой любимый телефончик» и не напишет гневных отзывов в адрес Apple. К счастью, знающие люди всегда могут сделать jailbreak и обойти защиту sandbox (собственно, в этом и есть смысл джейлбрейка).

Многозадачность

Одна из самых спорных особенностей iOS — это реализация многозадачности. Она вроде бы и есть, а с другой стороны, ее нет. В сравнении с традиционными настольными ОС и пресловутым Android iOS не является многозадачной операционной системой в привычном смысле этого слова и не позволяет приложениям свободно работать в фоне. Вместо этого ОС реализует API, который приложение может использовать для выполнения отдельных задач, пока оно находится в фоновом режиме.

Впервые такой API появился в iOS 4 (до этого фоновые задачи могли выполнять только стоковые приложения) и наращивался по мере развития операционной системы. Сегодня (речь идет об iOS 7) так называемый Background API позволяет делать следующее:

  • проигрывать аудио;
  • совершать VoIP-звонки;
  • получать информацию о смене местоположения;
  • получать push-уведомления;
  • планировать отложенный вывод уведомлений;
  • запрашивать дополнительное время для завершения работы после перехода в фоновый режим;
  • обмениваться данными с подключенными к девайсу аксессуарами (в том числе Bluetooth);
  • получать и отправлять данные по сети (начиная с iOS 7).

Такие ограничения на работу в фоне необходимы в первую очередь для того, чтобы сохранить заряд батареи и избежать лагов интерфейса, так знакомых пользователям Android, где приложения могут делать в фоне все что захотят. На самом деле Apple настолько сильно заботится о сохранении батареи, что даже реализовала специальный механизм для группировки фоновых действий приложений и их запуска в нужные моменты, например тогда, когда смартфон активно используется, подключен к Wi-Fi-сети или к зарядному устройству.

Выводы

Стоит сказать, что за время своего развития и последующего переезда в мобильные девайсы NeXTSTEP не только не растеряла все свои достоинства, но и приумножила их. Можно долго слушать россказни сотрудников Google, уверяющих, что Android разрабатывался без оглядки на iOS, но факт остается фактом: многие архитектурные решения Android позаимствовал именно у iOS. И не потому, что так было проще, а благодаря их красоте и эффективности.

Шесть стадий загрузки iOS

  1. Boot ROM. После включения устройства первым запускается минималистичный загрузчик, прошитый в постоянную память устройства. Его задача — произвести начальную инициализацию железа и передать управление первичному загрузчику LLB. Boot ROM всегда имеет заводскую прошивку и не может быть обновлен.
  1. Low Level Bootloader (LLB). Далее управление получает LLB. Это первичный загрузчик, задача которого — найти в памяти устройства iBoot, проверить его целостность и передать ему управление либо переключить девайс в режим восстановления, если это не удалось. Код LLB хранится в NAND-памяти устройства и обновляется вместе с установкой новой версии прошивки. Кроме всего прочего, он выводит на экран загрузочный логотип.
  1. iBoot. Это вторичный и основной загрузчик айдевайсов. Он включает в себя драйвер файловой системы, с помощью которого получает доступ к содержимому NAND-памяти, находит ядро и передает ему управление. В iBoot также встроен драйвер UART, с помощью которого можно производить отладку ядра и ОС, подключив девайс к COM-порту или USB-порту компа (с помощью кабеля USB — UART).

4 Ядро. Здесь все как обычно. Ядро производит инициализацию оборудования, после чего передает управление демону launchd.

5 Launchd. Это первичный процесс iOS и Mac OS X, он подключает файловые системы, запускает демоны/службы (например, backupd, configd, locationd), дисплейный сервер, фреймворки, а на последнем этапе загрузки отдает управление SpringBoard. В iOS и Mac OS X launchd используется как замена стандартного /bin/init в UNIX, однако его функциональность гораздо шире.

6 SpringBoard. Вот и экран блокировки!

Первые четыре этапа в этой цепи образуют chain of trust, реализованный с помощью сверки цифровой подписи загружаемого компонента. Цифровую подпись имеют LLB, iBoot и ядро, что позволяет исключить внедрение в цепочку хакнутого загрузчика или ядра, которые могут быть использованы для загрузки сторонней операционной системы или джейлбрейка. Единственный способ обойти этот механизм — найти дыру в одном из загрузчиков и воспользоваться ею для обхода проверки. В свое время было найдено несколько таких дыр в Boot ROM (наиболее известен эксплойт limera1n от geohot, актуальный для iPhone 1–4), а в начале 2014 года и в iBoot (хакер iH8sn0w, эксплойт так и не был опубликован).

Удерживая кнопку «Домой» при включении iPhone, можно заставить iBoot загрузиться в так называемый режим восстановления (Recovery), который позволяет восстановить прошивку iOS или обновить ее, используя iTunes. Однако механизм автоматического OTA-обновления использует другой режим, именуемый DFU (Device Firmware Upgrade), который активируется на раннем этапе загрузки сразу после Boot ROM и реализован в двух компонентах: iBSS и iBEC. По сути, это аналоги LLB и iBoot, конечная цель которых — не загрузить ОС, а перевести смартфон в режим обновления.

Процесс загрузки iOS

Евгений Зобнин

Редактор рубрики X-Mobile. По совместительству сисадмин. Большой фанат Linux, Plan 9, гаджетов и древних видеоигр.

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

iOS является объектно-ориентированной штукой. Где-то ниже Objective-C (а скоро мы сможем говорить уже и о Swift) залегают огромные пласты не-объектного кода, и под ними — Unix (а точнее BSD) система. И на том уровне у Linux и у iOS много общего. Но я и не об этом.

Давайте сравним основные структуры ядра Linux с объектно-ориентированной частью iOS.

1. Основные структуры

В обеих системах присутствует некоторое количество фундаментальных структур. Например, в iOS это будут:

Строки (NSSrting);
Массивы (NSArray);
Коллекции (NSSet);
Словари (NSDictionary);
Представление числовых примитивов (NSNumber);
Скаляры (NSRange).

Я оставляю за скобками различные вариации всех этих типов (NSSet / NSMutableSet / NSCountedSet и прочее).

Все эти типы данных реализованы как классы. Легко заметить, что тут нет нескольких фундаментальных структур: связных списков (linked lists) и бинарных деревьев (binary tree). Нет их по той простой причине, что они уже инкапсулированы в другие типы данных. Так, NSArray можно использовать вместо связного списка, а NSDictionary вместо бинарного дерева, не особенно заботясь о внутренней их реализации.

Хорошо. А какие же основные типы мы можем найти в ядре Linux? Тут ситуация выглядит с точностью до наоборот. Сложно выделить какие-либо стандартные для ядра типы данных. Наибольшие претенденты на это звание:

Двойной связный список, определенный в файле include/linux/list.h;
Красно-черные деревья, определенные в файле include/linux/rbtree.h;
Радиксные деревья (radix tree), определенные в файле include/linux/radix-tree.h;
Битовые массивы (bit arrays), определенные в файле include/linux/bitmap.h;
Ну а также семафоры и спинлоки, которые не присутствуют в iOS в явном виде — то есть, их не нужно алоцировать, они скрыты в методах.

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

Итак, на первый взгляд мы имеем два ортогональных подхода к построению системы. iOS предлагает достаточно чистый объектно-ориентированный подход, и Apple старается как только может скрыть внутренности объектов от конечного программиста. Ядро Linux, напротив, определяет очень базовые примитивы, оставляя программиста разбираться с ними. Грубо говоря, iOS это блочное строительство, а ядро Linux предоставляет в ваше распоряжение иногда кирпичи, а иногда просто глину и печь для обжига. Однако и цели программирования в двух системах совершенно различные: никто не ожидает от разработчика ядра создания пользовательского интерфейса, равно как никто и не ждет от программиста в iOS написания поддержки чипа и шины данных.

2. Так что же общего между двумя этими системами?

Референсы. Подсчет ссылок на объекты.

До недавнего времени iOS требовала от программиста вручную уменьшать счетчик объектов. Это делалось с помощью вызова стандартного метода retain для его увеличения, release для уменьшения. В последних версиях Objective-C в этом больше нет необходимости, система делает это автоматически.

Счетчик объектов — совершенно объектно-ориентированная вещь: у тебя есть несколько процессов, совместно использующих объект. Для простоты представим, что это объект только для чтения, то есть ни один из процессов не может его изменить. Но вот вопрос: когда этот объект должен быть освобожден? И кем?

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

Извиняюсь за занудство, но вот как это происходит. Из своего кода я создаю новую строку в iOS:

После исполнения этого кода создался объект типа NSString. Переменная s держит ссылку на объект, и этот объект имеет внутренний счетчик, равный 1.

После исполнения этой строчки кода переменная s2 также ссылается на тот же объект. И внутренний счетчик рефересов этого объекта будет равен 2.

Теперь переменная s больше не ссылается на объект — и внутренний счетчик референсов в объекте равен 1.

Теперь и переменная s2 больше не держит ссылку на объект. Объект не доступен, его адрес утерян. Внутренний счетчик объекта равен 0. Объект будет автоматически уничтожен системой сбора мусора.

А теперь вернемся к ядру Linux. И сразу откроем файл incluce/linux/kref.h
В этом файле мы можем видеть генерную реализацию именно этого механизма — счетчик референсов. Файл не слишком большой, но необходимый.

Ядро Linux с точки зрения параллельных процессов это очень интересная штука. Если ты забыл про синхронизацию — твой код очень быстро рухнет. Вместе со всем остальным ядром, кстати. Чаще всего для этого нужны доли секунды. Иногда секунды. Если ты забыл про то, что ядро реинтерантно, и твой код может быть прерван в любой момент времени — твой код упадет. Нет никакого способа предотвратить это — даже запрет прерываний не поможет решить проблемы синхронизации. Big Lock, когда-то существовавший в ядре, и позволявший остановить все, кроме твоего процесса, был удален из ядра годы назад, так как им пользовались. Нет, серьезно, это довольно странная ситуация: у тебя есть отличный способ решить все свои проблемы с синхронизацией, но тебе говорят: не надо это использовать, это плохая карма. Но у тебя никогда нет времени, а Big Lock чудесно предотвращает падения твоего кода. Так что в какой-то момент Линус волевым усилием удалил этот механизм.

Так вот, если сделать поиск по ядру, например по функции kref_init, то вы увидите, что он используется более чем в двухстах местах. Что для ядра довольно много. Каким же образом работает kref и зачем он нужен?

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

— Если суммировать логику работы kref, то она следующая:
— Создал объект? Сразу увеличь ему kref.
— Взял ссылку на объект? Увеличь у объекта kref на единицу (используя kref_get())
— Перестал использовать ссылку на объект? Уменьши kref объекта на единицу (kref_put())
— kref объекта достиг нуля? Объект уничтожается — ссылка на функцию-деструктор передается при вызове kref_put(), и используется из kref_put() автоматически.

3. Заключение

Никакой морали в данной статье нет.

Ни для кого не новость, что ядро Linux во многих отношениях адаптировало объектно-ориентированную парадигму. Тем не менее, модераторы ядра не позволяют разработчикам усложнять его (ядро), и поддерживают инфраструктуру на уровне простейших примитивов. Философия тут заключается в том, чтобы “keep it simple” — позволь разработчику самому сварить свой суп из сырой грудинки, не предлагай ему супный набор или куриный порошок.

iOS, в свою очередь, идет по пути сокрытия деталей реализации от разработчиков. В какой-то момент в iOS появился ARC, Automatic Reference Counting, система, которая следит за счетчиком ссылок объектов и уничтожает их автоматически. В скором будущем, похоже, объекты будут автоматически не только уничтожаться, но и создаваться, на это указывают последние тенденции — в некоторых случаях уже сегодня можно опустить вызов alloc (наример, [NSSting stringWithFormat] работает так же, как [[NSString alloc] initWithFormat:]).

На самом деле "ОС Linux" - это GNU/Linux, что означает, что GNU предоставляет все программные инструменты для пользователя (то есть команды, которые вы вводите в командной строке), и что «Linux» - это ядро, на котором находятся все инструменты.

Linux был создан Линусом Торвальдсом (Linus Torvalds), чтобы избежать проблем с лицензиями в Minix или проблем со стоимостью в UNIX или Windows. Он создал его как клон Minix, Minix, в свою очередь, является альтернативой UNIX, изначально разработанной для академического использования.

GNU/Linux не является сертифицированным UNIX, это UNIX-подделка.

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

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

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

MacOS основана на ядре операционной системы NeXT с классическим интерфейсом Macintosh (конечно же, модернизированным).

macOS является сертифицированным UNIX (проверяется Open Group).

macOS полностью основана на операционной системе Apple Darwin.

Дарвин свободен и с открытым исходным кодом, как и Linux.

NeXT была UNIX-подобной операционной системой, основанной на BSD, но использующей микроядро Mach

Компания NeXT была основана Стивом Джобсом, когда он ушел из Apple на несколько лет.

Apple приобрела NeXT за более чем 300 миллионов долларов, чтобы заменить стареющую классическую операционную систему Macintosh (от System 1 до System 9), которая была усовершенствована в своё время, но нуждалась в серьёзном обновлении, чтобы воспользоваться преимуществами современных чипов.

Apple обновила и настроила NeXT

Заменен пользовательский интерфейс (окружение рабочего стола) на обновленную версию интерфейса Classic Mac ( с некоторыми усовершенствованными элементами NeXT ). Графический пользовательский интерфейс в macOS надежен и стабилен, у подавляющего большинства пользователей пользовательский интерфейс никогда не зависал или не давал сбоев.

Начав с микроядра Mach и создав новое гибридное ядро, названное XNU, обладающее лучшими характеристиками как микроядра, так и монолитного ядра.

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

Общими компонентами операционной системы в настоящее время являются в основном FreeBSD (стабильность и гибкость) и OpenBSD (высокая безопасность), что даёт MacOS большую надёжность и безопасность, чем другие десктопные операционные системы.

Apple заменяет компоненты BSD своими собственными компонентами, поскольку видит, что безопасность может быть еще лучше. Пример: Apple заменила OpenSSL на coreCrypto.

MacOS обладает огромной интеграцией аппаратной и программной безопасности, как это видно на примере моделей с чипом Apple T2 (iMac и MacBook Pro), что является квантовым скачком над безопасностью во всех Linux-системах.

macOS и GNU/Linux не имеют ничего общего, кроме того, что macOS является сертифицированным UNIX, а Linux - подделкой UNIX, так что macOS действительно работает под UNIX, а Linux иногда работает под UNIX (иногда один дистрибутив Linux не может работать под другим, если только вы не приложите огромных усилий для его модификации).

MacBook Pro с частично открытой крышкой и светящимся экраном на клавиатуре.

Является ли macOS UNIX или просто Unix? Или это Unix-подобный? Мы отвечаем на бесконечные дебаты и объясняем такие стандарты, как POSIX и SUS.

macOS: UNIX или нет?

Эта тема поднимает кучу разных вопросов. Какова родословная macOS? Сколько из этого наследственного материала все еще присутствует в современных macOS, и имеет ли это значение? Прежде чем мы сможем ответить, является ли что-то UNIX, Unix или Unix-подобным, нам нужно понять, что означают эти термины. Кто решает, является ли что-то Unix или UNIX, и какие критерии они используют?

Давайте начнем с самого начала.

Unix был создан пятьдесят лет назад в Bell Labs , научно-исследовательской компании AT & T. Перенесемся в 1973 г. и в версию 4 Unix, которая была переписана на языке программирования C. Это сделало операционную систему намного более переносимой и более легкой для переноса на другие аппаратные платформы. В том же году Кен Томпсон и Деннис Ритчи , два основных архитектора Unix, представили на конференции доклад об операционных системах. Сразу же они получили запросы на копии операционной системы.

Связанный указом о согласии от 1956 года, AT & T должен был отказаться от «любого бизнеса, кроме предоставления услуг связи обычных операторов связи». Unix не квалифицировался как нечто, от чего AT & T могла бы извлечь выгоду. Итак, компания сделала что-то примечательное для того времени: распространил Unix в качестве исходного кода с либеральной лицензией. Небольшие сборы покрывали доставку и упаковку, а также «разумный гонорар».

Распространение Unixes

Поскольку Unix был предоставлен «как есть», он пришел без поддержки. В результате сообщество Unix начало объединяться, чтобы помогать участникам, а также исправлять и расширять Unix. Таким образом, вы можете получить исходный код, изменить его и получить поддержку от сообщества. Это знакомое кольцо. Различные разновидности Unix начали появляться, адаптироваться и настраиваться в соответствии с организацией, выполняющей работу.

Боб Фабри , профессор компьютерных наук в Калифорнийском университете в Беркли, был в программном комитете симпозиума по принципам операционных систем 1973 года. Он слушал презентацию Томпсона и Ричи, озаглавленную «Система разделения времени UNIX» .

Фабри запросил копию операционной системы, и в 1974 году Unix был установлен на PDP / 11 в Исследовательской группе по компьютерным наукам (CSRG) в Калифорнийском университете в Беркли. Примечательно, что Кен Томпсон провел там год, работая над тем, что быстро стало собственной разновидностью Unix в университете. Копии изменений и дополнений UC Berkeley были распространены и стали называться Berkeley Software Distribution (BSD). В конце концов, они стали дистрибутивами всей системы Unix, все еще известной как BSD. Номера версий, такие как 4.2BSD, идентифицировали разные версии.

В 1984 году AT & T была освобождена от строгих условий соглашения о согласии 1956 года и способна правильно продавать свою операционную систему. Он включает в себя код BSD, такой как TCP / IP , vi и оболочку C, csh . Даже при таком перекрестном опылении и сотрудничестве возникли трудности с лицензированием. BSD содержал код AT & T, который не был открытым исходным кодом, но элементы BSD были.

Версия BSD без кода AT & T была разработана, чтобы обойти эти проблемы. Однако когда код AT & T был удален, около 20 процентов ядра отсутствовало. Уильям Джолиц написал недостающие части, и эта версия Unix была выпущена как 386BSD . Проект 386BSD застопорился, но в 1993 году его база исходного кода породила проекты NetBSD и FreeBSD .

Это дало нам один кусок головоломки: FreeBSD.

Следующий шаг

После того, как он был уволен из Apple, Inc. в 1985 году, Стив Джобс основал компанию NeXT, Inc. Чтобы предоставить операционную систему для своей линейки продуктов для рабочих станций, NeXT разработал NeXTSTEP . Он использовал BSD в качестве кодовой базы, но представил совершенно другое ядро.

NeXT использовал модифицированную версию микроядра Mach и 4.3BSD для формирования NeXTSTEP, который является второй частью этой головоломки. Mach был разработан в Carnegie Mellon для облегчения исследований в области распределенных и параллельных вычислений. Исследовательская группа использовала BSD в качестве операционной системы и заменила ядро, а не написала свою собственную операционную систему.

В 1996 году Apple Inc. приобрела NeXT, Inc. и тем самым приобрела NeXTSTEP. Apple начала разрабатывать операционную систему, которая в конечном итоге стала macOS с помощью Mac OS X. Он обновил ядро ​​Mach и заменил его более продвинутой версией, разработанной и использованной Open Software Foundation в операционной системе OSF / 1 . Apple также обновила компоненты BSD обновленными и улучшенными версиями из дистрибутива FreeBSD.

Apple вернула элементы ядра BSD обратно в ядро ​​Mach. Он также разработал гибридное ядро, которое объединило характеристики как монолитной, так и микроядерной архитектуры.

Также был включен комплект ввода / вывода , разработанный Apple на основе DriverXit NeXTSTEP. Это позволило добавлять драйверы в ядро ​​без необходимости каждый раз изменять его.

XNU — третья часть головоломки.

Стандарты POSIX и SUS

В 1996 году два органа по стандартизации — X / Open и Open Software Foundation — объединились, чтобы сформировать The Open Group .

Open Group является органом по сертификации торговой марки UNIX. Другими словами, перед тем, как вы сможете назвать ее UNIX, она должна проштамповать вашу операционную систему как соответствующую ее стандартам. UNIX во всех заглавных буквах является знаком соответствия.

Итак, категории следующие:

  • Unix: семейство операционных систем. Это семейство включает как операционные системы UNIX, так и Unix-подобные операционные системы.
  • Операционные системыUNIX : они были сертифицированы как соответствующие стандартам.
  • Unix-подобныеоперационные системы : они выглядят и работают как Unix, но не были сертифицированы как совместимые.

Конечно, вполне возможно, что некоторые операционные системы в категории «Unix-like» могут быть протестированы завтра и признаны совместимыми. Сейчас это, по сути, UNIX, но их можно отнести только к категории Unix, потому что у них еще нет штампов.

Есть два стандарта, которые сертифицируют UNIX: POSIX и Single UNIX Specification (SUS) . SUS — это расширенный набор POSIX. Итак, что-то может быть POSIX-совместимым, но это не делает его UNIX. Однако, если что-то совместимо с SUS, это UNIX.

POSIX и SUS образуют большие коллекции документов (около 3700 страниц). Они определяют работу и ожидаемое поведение каждого аспекта совместимой системы UNIX. Все, от асинхронного и синхронного ввода-вывода до интерфейса сценариев и программ уровня пользователя, каталогизируется и определяется.

Стандарты определяют интерфейсы приложений и поведение во время выполнения, но не определяют, как они реализованы .

Итак, MacOS UNIX?

Ответ должен быть да.

Вы можете проследить его происхождение через FreeBSD до BSD, а оттуда — до Unix, распространяемого Bell Labs, до увеличения платы за лицензию от AT & T.

Но это не имеет значения.

Если вы пишете операционную систему с нуля прямо сейчас, если она удовлетворяет требованиям SUS, она считается UNIX. И не важно, как вы это реализуете. Ядро XNU в основе macOS представляет собой гибридную архитектуру. Он объединяет код Apple с частями ядер Mach и BSD.

Но это тоже не важно. Важно то, что он соответствует требованиям стандартов, по которым он измеряется.

Часть BSD ядра XNU предоставляет интерфейсы прикладного программирования POSIX (такие как различные системные вызовы API и BSD). Сохранение этого элемента ядра BSD без изменений в XNU является ключом к получению сертификации в качестве UNIX. Это позволяет XNU говорить о совместимости и совместимости UNIX с остальной частью системы.

macOS — это совместимая с UNIX 03 операционная система, сертифицированная The Open Group. Это было с 2007 года, начиная с MAC OS X 10.5. Единственным исключением был Mac OS X 10.7 Lion, но соответствие было восстановлено с OS X 10.8 Mountain Lion.

Забавно, но так же, как GNU означает «GNU — не Unix», XNU — «X не Unix ».


Эксперт в Java, Kotlin, Android, SQL, проектировании информационных систем.

Рассказываем, какие особенности есть у разных платформ, почему большое количество девайсов на Android — это проблема для разработчиков, и как потрениться кодить на Swift, если у вас нет компьютера на macOS. Разбираемся вместе с Android-разработчицей в такси Maxim Ариной Мурашевой.

Чем занимаются мобильные разработчики?

Мобильный разработчик отвечает за все этапы создания приложения: разрабатывает его архитектуру и может сделать интерфейс, тестирует его, выкладывает в AppStore или Google Play, устраняет уязвимости, выпускает обновления. Строгого разделения на frontend и backend, как в вебе, в мобильной разработке нет. Разработчик должен уметь работать как с интерфейсом, так и с внутренней логикой приложения.

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

Сколько получают мобильные разработчики?

Медианная зарплата мобильного разработчика — 140 тыс. рублей. Начинающие специалисты с хорошим портфолио могут рассчитывать на зарплату от 80 тыс. рублей. Разработчик на Android c опытом 1–2 года в России получает в среднем около 120 тыс. рублей в месяц, на iOS — около 130 тыс. рублей.

Android vs. iOS: плюсы, минусы и особенности

Количество устройств

Android лидирует среди операционных систем во всем мире. По данным statcounter на начало 2021 года, доля Android среди мобильных устройств в мире составляет 74,34% (это около 2,5 млрд активных устройств), iOS — 25,29% (около 1,4 млрд активных устройств). По России картина примерно такая же: 73,38% гаджетов на Android, 26,26% — на iOS.

Популярность операционных систем iOS и Android в России и в мире

Разнообразие устройств

С одной стороны, разнообразие устройств для Android — это большой плюс, ведь работа для разработчика всегда найдется. Кроме того, чтобы начать работать с этой ОС, никакой дополнительной техники покупать не нужно — писать код можно на любой операционной системе: macOS, Linux или Windows. А вот для разработки на iOS обязательно понадобится техника от Apple.

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

Арина Мурашева: «Как правило, в мобильных приложениях на Android нет сложных расчетов и сильно мудреной логики. Неприятный момент разработки — необходимость поддержки разных устройств. Мои “фавориты” — это телефоны с кастомными прошивками и китайские телефоны».

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

Обновления

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

У Android нюансы разработки могут меняться, и не все библиотеки и ответы на форумах будут актуальны.

Комьюнити

Android — это платформа с открытым кодом (доступ к исходному коду есть у всех желающих) и большим развитым сообществом: новичок может получить поддержку или решить проблему, задав свои вопросы на StackOverflow или GitHub.

iOS — более закрытая экосистема, и комьюнити преимущественно англоязычное, но встречаются и русскоязычные форумы.

Публикация приложения

В Google Play разовая плата за аккаунт разработчика стоит $25. Публикация приложений происходит быстро и, как правило, без участия модераторов. В AppStore потребуется ежегодно продлевать доступ к аккаунту разработчика за $99.

Но есть особенности: в Google Play приложение и аккаунт могут заблокировать без объяснения причин, а техподдержка отвечает редко, размыто и односложно. У AppStore публикация приложения может занять неделю — модераторы проверяют его вручную, — но техподдержка работает оперативнее.

Что нужно знать мобильным разработчикам?

Также требуется уметь создавать интерфейс приложения на основе макета, знать, как создать сетевой запрос, как обработать данные — в частности, в формате JSON (текстовый формат обмена данными, основанный на JavaScript), уметь создавать и использовать протоколы, подключать базы данных к приложению, знать архитектурные подходы и понимать способы хранения данных.

Что нужно знать Android-разработчику?

В требованиях к вакансии Android-разработчика обычно пишут, что он должен обязательно знать XML и Android SDK. Из языков чаще всего требуется Java, часто к нему прибавляется Kotlin. В любом случае, знание Java — это хороший старт для начинающего разработчика, поскольку на этом языке вы освоите основные концепции объектно-ориентированного программирования (ООП). Это методология программирования, основанная на представлении программы в виде совокупности объектов. Зная ООП, можно быстрее выучить другой язык.

Также начинающему разработчику понадобится изучить файловую структуру и принципы работы OS Android.

Станьте востребованным специалистом: освойте с нуля программирование на Java и Kotlin, мобильную разработку и UX/UI для Android. Наш карьерный центр поможет с трудоустройством.

Дополнительная скидка 5% по промокоду BLOG.

Что нужно знать iOS-разработчику?

Для разработки на iOS понадобится знание языков Objective-C и Swift. Сейчас в основном кодят на Swift, который считается более функциональным.

Для создания приложения понадобится компьютер с операционной системой macOS. Но даже если его нет, потренироваться кодить на Swift все равно можно. Первый вариант — скачать на официальном сайте языка GNU/Linux (операционные системы на основе ядра Linux и системных библиотек GNU) с установленным Swift (есть официальные пакеты под Ubuntu, CentOS и Amazon Linux). Второй — скачать на GitHub Windows с неофициальным пакетом Swift for Windows. Но для того чтобы собрать приложение, придется купить технику Apple.

Освойте с нуля программирование на Swift, мобильную разработку и UX/UI для iOS. Дополнительная скидка 5% по промокоду BLOG.

С чего начать?

Первые шаги в мобильной разработке выглядят примерно так:

  1. Освоить один из языков программирования. В зависимости от ОС это Java/Kotlin или Objective-C/Swift.
  2. Изучить Android Developer Guides или Apple Development Guidelines и попробовать написать простое приложение.
  3. Сверстать пару прототипов в онлайн-сервисе для разработки интерфейсов и прототипов, например Figma, Adobe XD или Sketch.
  4. Опубликовать приложение в Google Play или AppStore.
  5. Собрать и разместить портфолио на GitHub.

Всему этом можно научиться на наших курсах: iOS-разработчик и Android-разработчик.

Сложно ли перейти с одной на другую платформу?

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


Арина Мурашева

Android-разработчица в такси Maxim

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

Полезные ссылки

  • Для новичков у Android есть курсы для разработчиков на официальном сайте и краудсорсинговый гид — подробное руководство по созданию приложений, их дизайну и тестированию.
  • Блог разработчиков Android — тут выходят статьи с разбором обновлений и запуска новых функций.
  • Гайд Human Interface Guidelines от Apple о принципах дизайна приложений. — среда для разработки для iOS. — среда для разработки для Android.

Текст подготовила: Мария Осина


Эксперт в Java, Kotlin, Android, SQL, проектировании информационных систем.

Читайте также: