Файловая система

Если процесс Supervisor рассматривать как сердце системы Xameleon, то драйвер файловой системы - её мозг. Драйвер FileSystem предоставляет надмножество Posix совместимых системных вызовов, которые доступны прикладным программам и драйверам при использовании оригинальной libc. Помимо этого, модуль FileSystem предоставляет поддержку различных файловых систем. Используется объектно-ориентированная модель реализации движков файловых систем. Объекты поддержки любой файловой системы наследуются от базового класса Superblock, который, в свою очередь, поддерживает реализацию базовых примитивов функций файловой системы. Фактическая реализация примитивов и понятий конкретной файловой системы объявлена через абстрактные методы. Таким образом предоставляется поддержка следующих файловых систем: Minix, Ext2, FAT12/16/32, ISO9660. Поддержка других файловых систем может быть реализована при наличии подробной спецификации. Кроме того, FileSystem.drv поддерживает оригинальную devfs.

Драйвер файловой системы реализует одно-поточную асинхронную модель поверх синхронных IPC. Чтобы понять это утверждение рассмотрим сначала одно-поточную синхронную модель. В этом случае каждый процесс или поток может выполнить операцию чтения/записи только после того, как будет обработан предыдущий запрос от другого процесса или потока. Поскольку операция доступа к блочному устройству может занять длительное время, то следующий доступ к такому устройству может быть блокирован до завершении предыдущего. Более того, при чтении данных из последовательных устройств, процесс может заблокировать запросы других процессов/потоков вплоть до реакции оператора, например, до нажатия клавиши. Поэтому в настоящее время распространены два типа реализации системных вызовов - первые системы исполняют системный вызов в том же потоке, что и процесс/поток запроса, при этом переключив систему привилегий задачи на уровень системы. Такой подход неприменим для микроядерных систем, поскольку в микроядерных системах системные вызовы реализованы через IPC. Поэтому другим, часто используемым подходом, является создание нескольких потоков на уровне ядра системы и диспетчеризация запросов между этими потоками. Данный подход требует значительных затрат на синхронизацию доступа к общим ресурсам, например, к дисковым кешам.

Система Xameleon использует однопоточную асинхронную модель. Представим обработчик системных вызовов файловой системы как фильтр между пользовательской задачей и драйвером блочного устройства. Особенностью данного фильтра является контекст запроса. Используя контекст запроса, фильтр, получив запрос от пользовательской задачи, как можно быстрее обрабатывает запрос и формирует запрос для нижележащего драйвера - в данном случае драйвера блочного устройства. Самое интересное начинается после отправки запроса блочному устройству. Фильтр не дожидается конца выполнения запроса, а переходит в состояние ожидание любого события. Причём, этим событием может быть как ответ блочного устройства, так и новый запрос от другой пользовательской задачи. При такой схеме фильтр может получить ответ от блочного устройства, запрос которому был направлен гораздо ранее. В этом случае используется контекст запроса и ожидающей задаче отправляется подтверждение. Иными словами, задача фильтра - как можно быстрее обработать запрос и передать его по цепочке дальше и при получении ответа, выслать подтверждение запроса (возможно, вместе с полученными данными) процессу, инициатору запроса. Такая схема имеет как минимум два преимущества по сравнению с традиционными реализациями системных вызовов - асинхронный доступ к данным и отсутствие необходимости защиты данных от одновременного доступа несколькими программными потоками.