Лучше начинать с нижней части и двигаться вверх.
Дисководы на самом низком уровне организованы в коллекцию секторов, дорожек и головок. Секторы - это сегменты дорожки, дорожки - это область на самих дисках, представленная положением головок при вращении пластин под ним, а головка - это фактический элемент, считывающий данные с диска.
Поскольку дорожки измеряются на основе расстояния, на котором головка находится от центра диска, вы можете увидеть, насколько ближе к центру диска «длина» дорожки меньше единицы на внешнем крае диска. ,
Секторы - это фрагменты дорожки, обычно фиксированной длины. Таким образом, внутренняя дорожка будет содержать меньше секторов, чем внешняя дорожка.
Большая часть этой геометрии диска в настоящее время обрабатывается самими контроллерами дисков, хотя в прошлом эта организация управлялась непосредственно операционными системами и драйверами дисков.
Электроника привода и драйверы дисков объединяются, чтобы попытаться представить диск как последовательную последовательность блоков фиксированной длины.
Итак, вы можете видеть, что если у вас накопитель на 10 МБ и вы используете 512-байтовые дисковые блоки, то этот накопитель будет иметь емкость 20 480 «блоков».
Эта блочная организация является фундаментом, на котором строится все остальное. Если у вас есть такая возможность, вы можете указать диску через драйвер диска и контроллер диска перейти к определенному блоку на диске и прочитать / записать этот блок с новыми данными.
Файловая система организует эту кучу блоков в свою собственную структуру. ФС должна отслеживать, какие блоки используются и какими файлами.
Большинство файловых систем имеют фиксированное местоположение «где они начинаются», то есть какое-то место, куда при запуске они могут пойти, чтобы попытаться найти информацию о разметке диска.
Рассмотрим грубую файловую систему, которая не имеет каталогов, и поддерживает файлы с 8-буквенными именами и 3-буквенным расширением, плюс 1 байт информации о состоянии и 2 байта для номера блока, где файл начинается на диске. Мы также можем предположить, что система имеет жесткое ограничение в 1024 файла. Наконец, он должен знать, какие блоки на диске используются. Для этого он будет использовать 1 бит на блок.
Эта информация обычно называется "метаданными файловой системы". Когда диск «отформатирован», в настоящее время это просто вопрос записи новых метаданных файловой системы. В старые времена речь шла о фактической записи секторных меток и другой информации на чистых магнитных носителях (обычно называемых «низкоуровневым форматом»). Сегодня большинство накопителей уже имеют формат низкого уровня.
Для нашего грубого примера мы должны выделить место для каталога и место для «Оглавления», данных, в которых указано, какие блоки используются.
Мы также скажем, что файловая система должна начинаться с блока 16, чтобы ОС могла использовать первые 16 блоков, скажем, для «загрузочного сектора».
Итак, в блоке 16 нам нужно хранить 14 байтов (каждая запись в файле) * 1024 (количество файлов) = 12K. Разделите это на 512 (размер блока) 24 блока. Для нашего накопителя на 10 МБ он имеет 20 480 блоков. 20 480/8 (8 бит / байт) - 2 560 байт / 512 = 5 блоков.
Из 20 480 блоков, доступных на диске, метаданные файловой системы составляют 29 блоков. Добавьте в 16 для ОС 45 блоков из 20 480, оставив 20 435 «свободных блоков».
Наконец, каждый из блоков данных резервирует последние 2 байта для указания следующего блока в файле.
Теперь, чтобы прочитать файл, вы ищите имя файла в блоках каталога. Оттуда вы найдете смещение к первому блоку данных для файла. Вы читаете этот блок данных, захватите последние два байта. Если эти два байта равны 00 00, то это конец файла. В противном случае возьмите это число, загрузите этот блок данных и продолжайте, пока весь файл не будет прочитан.
Код файловой системы скрывает детали указателей в конце и просто загружает блоки в память для использования программой. Если программа выполняет чтение (буфер, 10000), вы можете увидеть, как это будет преобразовываться в чтение нескольких блоков данных с диска до тех пор, пока буфер не будет заполнен или не будет достигнут конец файла.
Чтобы записать файл, система должна сначала найти свободное место в каталоге. Получив это, он находит свободный блок в битовой карте TOC. Наконец, он берет данные, записывает запись каталога, устанавливает свой первый блок в доступный блок из битовой карты, переключает бит в битовой карте, а затем берет данные и записывает их в правильный блок. Система буферизует эту информацию, так что в идеале она должна записывать блоки только один раз, когда они заполнены.
При записи блоков он продолжает потреблять биты из оглавления и объединяет блоки по ходу.
Кроме того, «копирование файла» - это простой процесс, в котором система использует код файловой системы и драйверы дисков. Копия файла просто считывает буфер, заполняет его, записывает буфер.
Файловая система должна поддерживать все метаданные, отслеживать, где вы читаете из файла или где вы пишете. Например, если вы читаете только 100 байтов из файла, очевидно, что системе нужно будет прочитать весь 512-байтовый блок данных, а затем «знать», что это байт 101, когда вы пытаетесь прочитать еще 100 байтов из файла. *
Кроме того, я надеюсь, что это очевидно, это действительно очень грубая структура файловой системы, с множеством проблем.
Но основные принципы есть, и все файловые системы работают в некотором роде похожим на это, но детали сильно различаются (большинство современных файловых систем больше не имеют жестких ограничений, как простой пример).