pavia писал(а):
способ передачи через функцию не означает что данные передаются копированием. Они могут передоваться по ссылке.
Передача данных по ссылке означает совместный доступ к области данных, на которые эта ссылка указывает. Это автоматически означает или жертву надёжности или выделение shared memory для этих данных, что полностью эквивалентно описанной мной модели. Или копирование
.
SII писал(а):
Не всегда достижимо: для драйверов древнего оборудования необходимы IN и OUT.
Согласен. Но для этого есть промежуточные кольца защиты, их и следует задействовать.
SII писал(а):
1) Если требуется одно лишнее переключение контекста -- да, таковым можно пренебречь (будет медленней, но общая разница слишком мала). Однако нередко требуется пропустить запрос ввода-вывода через целый стек драйверов.
Я понял твою мысль. Операция файлового ввода/вывода должна сначала пройти проверку прав доступа, затем пройти через драйвер файловой системы, затем через очередь (или кэш) операций блочного I/O и только затем попасть в драйвер устройства. Как я уже писал ранее, давай в данном контексте под драйвером понимать драйвер именно железки. В конце концов, промежуточные уровни (назовём их сервисами, хотя, конечно, в общем случае это не всегда так) можно интегрировать в ядро при относительно низкой потере надёжности. Их немного и с ними проще работать. Я говорю про выделение в отдельное пространство части аппаратного драйвера. В таком случае производительность пострадает не сильно.
SII писал(а):
2) У разделяемой памяти есть одна проблема: для всех драйверов, участвующих в обработке данного запроса, должно быть произведено отображение какой-то части их виртуального адресного пространства на страницы, где физически находится необходимая область данных (скажем, на буфер ввода-вывода, заданный пользовательской задачей). Эта операция может быть довольно затратной, ведь надо корректировать таблицы переадресации и частично перезагружать TLB. Если же драйвер не один, а несколько, затраты умножаются. В то же время для драйверов режима ядра этой проблемы нет вообще, поскольку все они имеют доступ ко всей физической памяти.
По этой причине всё пикоядро у меня написано на ассемблере. Я считаю, что наиболее частые и/или критичные по времени операции, такие как работа с виртуальной памятью, межпроцессное взаимодействие и первый уровень обработки прерываний, должны быть предельно оптимизированы. Сейчас у меня большинство операций с памятью, включая поиск свободной страницы, выделение, освобождение, мапирование, - это выполнение около одного-двух десятков ассемблерных инструкций, которые выполняются в пространстве задачи. А про перезагрузку TLB мы, по-моему, как раз и составляли калькуляцию в десятые доли процента. То есть, да, потери есть, но всё же их масштаб обычно преувеличивают.
SII писал(а):
В общем, я бы не рискнул утверждать или надеяться, что накладные расходы в микроядерной ОС будут лишь незначительно выше, чем в системе с монолитной архитектурой.
Я сразу оговорился, что фактического материала у меня пока нет, есть пока умозрительные заключения. И надеяться я как раз могу
.