Легче ли писать драйверы файловой системы в пространстве пользователя, чем в пространстве ядра? - PullRequest
9 голосов
/ 11 мая 2010

Я буду использовать драйвер NTFS для Linux в качестве примера.

Драйвер NTFS ядра Linux имеет очень ограниченную поддержку записи в ядре, и через 5 лет он все еще считается экспериментальным.

Та же команда разработчиков создает драйвер пользовательского пространства ntfsmount, который имеет почти идеальную поддержку записи.

Аналогично, проект NTFS-3G, который написан другой командой, также имеет почти идеальную поддержку записи.

Почему диск с ядром занял так много времени? Гораздо сложнее развиваться?

Утверждение о том, что уже существует достойное пользовательское приложение, не является причиной, по которой драйвер ядра не является обязательным.

ПРИМЕЧАНИЕ. Не переносите это на superuser.com. Я хочу тяжелый ответ на программирование, с точки зрения программирования, а не практического использования. Если вопрос не подходит для SO, пожалуйста, сообщите мне, почему, чтобы я мог отредактировать его так, чтобы он был.

Ответы [ 4 ]

5 голосов
/ 11 мая 2010

Я не знаю внутренних историй разработки драйвера Linux NTFS, но я могу представить некоторые вещи, которые позволили бы развитию пользовательского пространства идти быстрее, чем в пространстве ядра:

  • более простой API - более высокий уровень абстракции, предоставляемый пользовательскими библиотеками (например, управление памятью), безусловно, облегчает разработку
  • проще отладка - проще отладить процесс в пользовательском пространстве, чем отладку ядра
  • изоляция процесса - это единственное, что, я бы сказал, отвечает за более быстрое развитие в пользовательском пространстве. Ваш драйвер файловой системы в пользовательском пространстве, совершающий плохие действия, в худшем случае приведет к повреждению файловой системы, а процесс вашего драйвера погибнет, а в пространстве ядра это может привести к полному сбою системы. Это приводит к более быстрым циклам отладки, что приводит к более быстрому и быстрому развитию ошибок.
4 голосов
/ 11 мая 2010

Важно отметить, особенно в Linux, что экспериментальный также может означать «код, который кто-то сюда сбросил, который в то время выглядел приемлемым, но не мог активно поддерживаться».

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

Файловые системы в пользовательском пространстве проще поддерживать

Найдите минутку, чтобы взглянуть на ext3cow файловую систему , проект PHD, получивший значительную поддержку в течение очень короткого времени. Его автор закончил, а затем перешел к карьере, имея очень мало времени для работы с файловой системой. Из-за того, что в Linux нет ничего общего, внутреннее перемещение Linux между версиями требует, чтобы каждый, кто хочет использовать его в современном ядре, имел глубокие знания, которыми обладают немногие.

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

Файловые системы в пользовательском пространстве легче отлаживать

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

В любом случае я возьму GDB и Valgrind за шумную printk() отладку в любой день или за попытку разобраться в довольно загадочных хуках отладки ядра, присутствующих в Linux. Мне также понравится возможность использовать любую отладочную (или даже сборку мусора ) malloc() реализацию, которую я выберу. То же самое относится и к моей избранной библиотеке C, при условии, что она работает с FUSE. Я не разбираюсь с библиотекой ядра Linux, но мне нравятся мои удобства создания.

Пользовательские файловые системы проще в использовании

Для малообеспеченных пользователей очень полезно иметь возможность монтировать и поддерживать любую файловую систему, которую они хотят использовать, но на самом деле это конечная игра. Если ваша файловая система находится вне ядра, она может развиваться независимо от ядра, что означает, что пользователи могут обновить настроенный до ваш цикл выпуска. Вы могли бы достичь 6 этапов за время, необходимое Linux для перехода к следующему варианту выпуска. Это также позволяет дистрибьюторам и OEM-производителям вывести вашу FS в дикую природу, где она проходит необходимое тестирование быстрее, чем если бы это был модуль ядра.

Норман Рэмси уже описал фактор надежности, связанный с файловыми системами как сервисом в архитектуре микроядра. Однако надежность означает, что не требуется служба реинкарнации, которая имеет тенденцию скрывать (или откладывать) ошибки и другие проблемы. Я согласен с тем, что хорошо, если неудачное монтирование root не приводит к прерыванию ядра, но это возможно и для монолитных ядер с поддержкой FUSE.

Таким образом, написание файловой системы достаточно сложно без необходимости работать в пространстве ядра. Я бы предпочел использовать FUSE API или изучить реализацию службы IPC / VFS в микроядерной ОС, чем писать ее как модуль ядра.

2 голосов
/ 11 мая 2010

Код ядра должен соответствовать гораздо более высоким стандартам безопасности (т.е. без ошибок), чем код режима пользователя.

1 голос
/ 11 мая 2010

В пользовательском пространстве вам доступно гораздо больше вкусностей, поэтому разработку программного обеспечения проще. И если файловая система отключается в пользовательском пространстве, из-за сбоя в файловой системе гораздо сложнее сломать все ядро.

Этот принцип был доведен до крайности в таких проектах, как Mach и Windows NT, в которых система была разработана с микроядром , и в пользовательское пространство было добавлено как можно больше служб.

...