Контексты начальной загрузки

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

Во-первых, термин контекст может отнестись к процессу BSD или задаче Маха. Переключение от одного процесса до другого часто упоминается как контекстное переключение.

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

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

В целях этой главы термин контекст относится к контексту начальной загрузки.

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

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

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

Например, в Mac OS 10.1 и ранее, sshd продолжает функционировать, когда запущено с пользовательского контекста. Однако, так как это неспособно связаться с lookupd или netinfo, это прекращает принимать пароли. Это не особенно полезное поведение.

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

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

В OS X v10.2, большое усилие вошло в проверку, что программы, использующие только стандартные службы BSD и функции, не используют поиски Маха в пути, который перестал бы работать, если запущено с пользовательского контекста. Если Вы находите приложение, повреждающееся, когда запущено с окна Terminal.app, зарегистрируйте отчет об ошибках.

Как пользователи влияния контекстов

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

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

Контексты также излагают проблему пользователям, выполняющим фоновые задания с nohup или пользователи, отсоединяющиеся терминальные сеансы с помощью screen. Существуют времена, когда совершенно разумно для программы остаться в силе после прошлого выхода из системы, но по умолчанию, это не происходит.

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

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

Третий путь состоит в том, чтобы войти в систему как пользователь консоли (>console), который вызывает LoginWindow выходить и причины init порождать a getty процесс на консоли. С тех пор init икра getty, который мечет икру login, то, которое порождает оболочку пользователя, любые программы запустились с текстовой консоли, будет в контексте запуска.

Более широко, любой процесс, который является дочерним элементом процесса в контексте запуска (кроме наследованных init потому что их родительский процесс вышел), находится автоматически в контексте запуска. Любой процесс, который является дочерним элементом процесса в контексте входа в систему, самом, в контексте входа в систему. Это означает, что демоны могут безопасно разветвить дочерние элементы в любое время, и те дочерние элементы будут в контексте запуска, как будет, программы запустились с консоли (не Консольное приложение). Это также означает, что любая программа, запущенная пользователем в окне терминала, от Средства поиска, от Прикрепления, и т.д., будет в, в настоящее время входил в систему контекст входа в систему пользователя, даже если тот пользователь выполняет использование приложения su или sudo.

Как разработчики влияния контекстов

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

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

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

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