В 4.3 BSD и более ранних системах утилиты sysctl conf, которым была нужна информация от ядра, открывали специальное устройство /dev/kmem, которое предоставляло доступ к памяти ядра. Используя список имен из двоичного файла ядра, утилиты искали адрес нужного символа и читали значение в этом месте. Утилиты с привилегиями суперпользователя могли также использовать эту методику для изменения sysctl переменных ядра.
Хотя этот подход работал, у него было четыре проблемы.
- У приложений не было способа надежным образом найти двоичный файл для текущего работающего ядра. Использование неверного двоичного файла привело бы к просмотру /dev/kmem в неправильном месте, что дало бы совершенно неправильный вывод. Для программ, которые изменяли ядро, использование неверного двоичного файла обычно приводило к сбою системы с засорением не имеющих отношения к делу структур данных.
- Чтение и интерпретация списка имен ядра требует большого времени. Поэтому приложения, которым приходилось читать структуры данных ядра, работали медленно.
- Приложения, которые получали доступ к памяти ядра, могли читать всю память ядра. Злонамеренные программы могли подсматривать входные очереди терминалов или сетей в поиске пользователей, набирающих важную информацию, такую, как пароли.
- По мере того как все больше структур данных ядра становились динамически выделяемыми, становилось труднее надежно извлекать нужную информацию.
Например, в 4.3BSD все структуры процесса содержались в одной статически выделяемой таблице, которую можно было прочесть за одну операцию. В FreeBSD структуры процессов выделяются динамически, а ссылки на них осуществляются через связанные списки. Поэтому можно считывать лишь по одному процессу за раз. Поскольку элемент процесса подразделен на множество отдельных частей, каждая из которых находится в разных местах памяти ядра, для извлечения из /dev/kmem каждого элемента процесса требуется по несколько операций поисков и чтений.
Для решения этих проблем в 4.4BSD был введен системный вызов sysctl conf freebsd. Этот расширяемый интерфейс ядра дает возможность управляемого доступа к структурам данных ядра. Перечисленные ранее проблемы разрешаются следующим образом.
- Приложениям не нужно знать, с каким двоичным файлом ядра они работают. Работающее ядро отвечает на их запрос и знает, где находятся их структуры данных. Таким образом, всегда возвращаются или изменяются нужные структуры данных.
- Не тратится время на чтение или интерпретацию списков имен. Доступ к структурам данных ядра требует лишь нескольких системных вызовов.
- Нельзя получить доступ к важным структурам данных. Ядро контролирует набор структур данных, которые оно возвращает. Все остальное в ядре является недоступным. Ядро может наложить свои собственные ограничения на доступ к структурам данных на основе структур данных.
- Ядро может использовать свои стандартные механизмы для обеспечения согласованного доступа к распределенным структурам данных. При запросе элементов процесса ядро может получить соответствующие блокировки для обеспечения того, что может быть возвращен согласованный набор данных.
Дополнительные преимущества этого интерфейса включают в себя следующее.
- Интерфейс sysctl conf в FreeBsd полностью интегрирован с системным вызовом jail, так что процессы, работающие в тюрьмах, могут получить доступ лишь к тем переменным ядра, которые согласуются с их представлением о системе.
- До обновления структуры данных можно проверить данные, которые должны быть изменены. Если изменение структуры данных требует исключительного доступа, до совершения обновления может быть получена соответствующая блокировка. Таким образом, в связанный список может быть добавлен элемент без риска того, что другой процесс обходит этот список в ходе его обновления.
- Информация может вычисляться лишь по требованию. Нечасто запрашиваемая информация может вычисляться лишь тогда, когда она затребована, а не все время. Например, значительная часть статистики виртуальной памяти вычисляется лишь, когда ее запрашивает программа отслеживания системы.
- Этот интерфейс дает суперпользователю возможность изменять параметры ядра, даже когда система работает в безопасном режиме. Чтобы предотвратить должностные преступления, ядро не допускает открывания /dev/kmem, когда система работает в безопасном режиме. Даже когда система FreeBSD работает в безопасном режиме, интерфейс sysctl по-прежнему будет позволять суперпользователю изменять структуры данных ядра, которые не влияют на безопасность.
- Системный вызов sysctl в FreeBSD описывает пространство имен ядра, используя базу управляющей информации (management information base - MIB). MIB является иерархическим пространством имен, во многом подобным пространству имен файловой системы, за тем исключением, что каждый компонент описывается целым значением, а не строковым именем. У иерархического пространства имен есть несколько преимуществ.
- Можно добавлять новые поддеревья без влияния на существующие приложения.
- Если ядро не включает поддержку для подсистемы, информация sysctl conf для этой части системы может быть опущена.
- Каждая подсистема ядра может определять свои собственные соглашения по именованию. Таким образом, сеть можно разделить на семейства протоколов. Каждое семейство протоколов может быть разделено на специфическую для протокола информацию и т.д.
- Пространство имен можно разделить на те части, которые являются машинно-независимыми и доступны на каждой архитектуре, и части, которые являются машинно-зависимыми и определяются на основе отдельной архитектуры.
С момента добавления в 4.4BSD системного вызова sysctl conf число переменных, которые он контролирует, было расширено до примерно 1000 значений, управляющих системой виртуальной памяти, файловыми системами, сетевыми стеками и нижележащим оборудованием, а также самим ядром.
- 16/05/2010 18:53 - Межпроцессное взаимодействие
- 15/05/2010 13:20 - Укорачивание файлов
- 14/05/2010 19:10 - Идентификация файла
- 13/05/2010 11:56 - Разбросанный ввод/вывод
- 21/03/2010 15:36 - Избежание перегрузки с помощью медленного старта
- 09/01/2010 18:18 - Отладка системы FreeBSD. Отладчик GDB
- 09/01/2010 18:07 - Автоматическая перезагрузка и выключение системы
- 09/01/2010 17:59 - Конфигурация ядра FreeBSD (Linux)
- 09/01/2010 17:49 - Программа /usr/bin/login
- 09/01/2010 17:42 - /usr/libexec/getty