Как реализовать очень простую файловую систему? - PullRequest
26 голосов
/ 17 января 2011

Мне интересно, как ОС читает / пишет на жесткий диск.
В качестве упражнения я хотел бы реализовать простую файловую систему без каталогов, которая может читать и записывать файлы.
С чего начать?
Подойдет ли C / C ++ или я должен использовать более низкоуровневый подход?
Это слишком много для одного человека?

Ответы [ 5 ]

18 голосов
/ 17 января 2011

Взгляните на FUSE: http://fuse.sourceforge.net/

Это позволит вам писать файловую систему без необходимости фактически писать драйвер устройства. Оттуда я бы начал с одного файла. По сути, создайте файл длиной (например, 100 МБ), затем напишите свои подпрограммы для чтения и записи из этого файла.

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

Приятно то, что с FUSE вы можете использовать практически любой язык, а не только C / C ++.

7 голосов
/ 17 января 2011

Для изучения идей файловой системы не обязательно использовать диск, я думаю.Просто создайте массив из 512 байтовых массивов.Просто представьте, что это ваш жесткий диск, чтобы немного поэкспериментировать.Также вы можете взглянуть на некоторые стандартные учебники по ОС, такие как http://codex.cs.yale.edu/avi/os-book/OS8/os8c/index.html

7 голосов
/ 17 января 2011

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

http://elm -chan.org / ЖСБ / ФФ / 00index_e.html

Взгляните на код, который вы поймете, как работает жир.

3 голосов
/ 02 августа 2011

Ответ на ваш первый вопрос заключается в том, что помимо Fuse, как кто-то другой сказал вам, вы также можете использовать Dokan, который делает то же самое для Windows, и оттуда просто возникает вопрос о чтении и записи в физический раздел (http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx (см., В частности, раздел «Физические диски и тома»).

Конечно, в Linux или Unix, кроме использования чего-то вроде Fuse, вам нужно всего лишь выполнить, чтение или запись нужного устройства в / dev / xxx (если вы root), и в этих терминах Unices более дружелюбный или небезопасный в зависимости от вашей точки зрения.

Оттуда попробуйте реализовать простую файловую систему, такую ​​как Fat, или что-то более экзотическое, например, файловую систему tar, или даже какую-нибудь простую файловую систему, основанную на концепциях Unix, такую ​​как UFS или Minux, или просто что-то, что регистрирует только сделанные вызовы и их аргументы файла журнала (и это поможет вам понять, какие вызовы выполняются драйверу файловой системы во время регулярного использования вашего компьютера).

Теперь ваш второй вопрос (на который гораздо проще ответить), да, C / C ++ справится с задачей, так как они являются языком разработки системы, также большая часть вашего примера кода будет на C / C ++, поэтому по крайней мере, вы будете читать C / C ++ в своей разработке.

Теперь для вашего третьего вопроса, да, это может быть выполнено одним человеком, например, файловая система ext (широко известная в мире Linux своими преемниками как ext2 или ext3) была создана одним разработчиком Теодором Цо, так что не думаю, что эти вещи не могут быть выполнены одним человеком.

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

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

Так что, если вы хотите узнать больше о работе с файловыми системами ядра, вот о чем вам следует беспокоиться (помимо знания интерфейса VFS)

P.S .: Если вы хотите, чтобы разрешения Unix работали в Windows, вы можете использовать что-то вроде того, что MS использует для NFS на серверных версиях Windows (http://support.microsoft.com/kb/262965)

2 голосов
/ 10 ноября 2015

Просто дополнение к тому, что сказал Койот21.Вы можете прочитать этот тезис http://www.minix3.org/theses/gerofi-minix-vfs.pdf

В этом тезисе вы можете узнать немного больше о VFS, и некоторые детали описаны там.В приложении Б. есть очень полезные вещи. Существует реализация файловой системы (не реальной файловой системы, а памяти).

...