Граница между кодом уровня ядра и пользователя осуществляется аппаратными средствами защиты, предоставляемыми нижележащим оборудованием. Ядро работает в отдельном адресном пространстве, доступ к которому невозможен из процессов пользователя. Привилегированные операции, такие, как запуск ввода/вывода и остановка центрального процессора, доступны лишь ядру. Приложения запрашивают обслуживание ядром с помощью системных вызовов. Системные вызовы используются, чтобы заставить ядро выполнить сложные операции, такие, как запись данных во вторичное хранилище, и простые операции, такие, как возвращение текущего времени дня. Все системные вызовы представлены приложениям как синхронные: приложение не будет продолжать работу до тех пор, пока ядро не выполнит действия, связанные с системным вызовом. Ядро может завершить некоторые операции, связанные с системным вызовом, после своего возвращения. Например, системный вызов write копирует данные, которые должны быть записаны из процесса пользователя в буфер ядра, во время ожидания процесса, но обычно возвращается из системного вызова до того, как буфер ядра будет записан на диск.
Системный вызов обычно реализован в виде аппаратного исключения, которое изменяет режим работы центрального процессора и текущее отображение виртуальной памяти. Параметры, предоставленные пользователями в системных вызовах, проверяются ядром до начала использования. Такая проверка гарантирует целостность системы. Все параметры, переданные ядру, копируются в адресное пространство ядра, чтобы гарантировать неизменность проверенных параметров в результате побочного эффекта системного вызова. Результаты системного вызова возвращаются ядром либо в аппаратных регистрах, либо путем копирования их значений по указанным пользователем адресам памяти. Как и параметры, переданные в ядро, адреса, используемые для возвращения результатов, должны быть проверены на предмет принадлежности адресному пространству пользователя. Если ядро при обработке системного вызова сталкивается с ошибкой, оно возвращает пользователю код ошибки. В языке программирования C этот код ошибки хранится в глобальной переменной eirno, а функция, выполнявшая системный вызов, возвращает -1.
Пользовательские приложения и ядро действуют независимо друг от друга. FreeBSD не хранит управляющие блоки ввода/вывода или другие связанные с операционной системой структуры данных в адресном пространстве приложения. Каждому приложению уровня пользователя предоставляется отдельное адресное пространство, в котором оно выполняется. Ядро делает изменения состояния, такие, как приостановка процесса во время работы другого процесса, незаметными для вовлеченных процессов.
- 10/05/2010 11:56 - Проектные решения по управлению памятью BSD
- 10/05/2010 05:46 - Управление памятью
- 09/05/2010 22:28 - Группы процессов и сеансы
- 09/05/2010 13:03 - Сигналы
- 09/05/2010 05:44 - Управление процессами
- 08/05/2010 13:45 - Организация ядра
- 08/05/2010 03:47 - Ядро
- 07/05/2010 22:30 - Средства FreeBSD и ядро
- 07/05/2010 14:45 - Конкуренция операционных систем
- 07/05/2010 05:50 - Обновление версий FreeBSD