Как файловые операции выглядят на уровне сборки
В приложении это выполняется с помощью системного вызова (например, инструкция int
на процессорах x86). Такой системный вызов вызовет функцию в ОС.
Эта функция в ОС, как правило, представляет собой короткую функцию, написанную на ассемблере, которая вызывает другую функцию, которая обычно написана на языке программирования высокого уровня (обычно на C; но написание этой функции на ассемблере также возможно, конечно).
Эта вторая функция вызовет множество других функций.
На жестком диске или дискете данные хранятся в виде секторов. Каждый сектор содержит определенное количество байтов (например, 512), и вы можете читать или записывать только полные сектора, а не отдельные байты. Диск ничего не знает о файлах.
В типичной операционной системе при обработке файлов участвуют два разных типа функций:
1) Функциональность драйвера устройства
Эти функции предназначены для чтения или записи «секторных» данных с диска или на диск. Как это делается на самом деле, зависит от процессора и типа дисковода.
В простейшем случае у вас есть ЦП с отображенным в память вводом / выводом, и вы не используете прерывания или DMA. Исторический дисковод гибких дисков Commodore 1581 является примером для этого.
В этом случае программа записывает некоторые данные на аппаратное обеспечение, просто записывая байт в адрес - так же, как вы записываете байт в ОЗУ. Чтение с аппаратного обеспечения работает как чтение байта из ОЗУ.
Программное обеспечение запишет некоторые данные на оборудование, которое дает указание дисководу считывать некоторые данные с диска. Затем программа непрерывно считывает данные с определенного адреса. Эти данные содержат информацию, если дисковод готов. Как только диск готов, программное обеспечение считывает фактические данные, считывая данные с другого адреса. Написание работает аналогично.
Если вы используете ЦП, который не использует ввод-вывод с отображением в память, доступ к оборудованию не работает так же, как доступ к ОЗУ, но используются специальные инструкции (in
и out
). (Старые компьютеры с архитектурой x86 являются примером этого.)
Если используются прерывания (как в современных компьютерах), программное обеспечение не должно постоянно проверять, готов ли дисковод. ЦПУ будет вызывать специальную функцию - так называемый «обработчик прерываний», как только накопитель сообщит о готовности.
Если используется DMA (как в современных компьютерах), дисковод может напрямую записывать данные, считанные с диска, в ОЗУ (или считывать данные, которые будут записаны из ОЗУ). Таким образом, программное обеспечение должно записывать только специальные данные, которые дают указание дисководу записать какой-либо сектор. Программное обеспечение не должно записывать фактические данные, которые должны быть записаны на диск, потому что дисковод будет непосредственно считывать эти данные из ОЗУ. (То же самое относится и к чтению.)
2) Функциональность файловой системы
Эти функции будут вызывать функции «драйвера устройства» для доступа к диску.
Файловая система - более или менее ничего, кроме некоторого описания того, как файлы хранятся на диске. Если диск использует файловую систему «FAT16», на диске есть три области: FAT, корневой каталог и кластеры.
(В файловых системах, использующих "inode", это немного отличается, однако принцип тот же.)
FAT содержит информацию о том, где некоторые файлы хранятся на диске и какие кластеры свободны. Корневой каталог содержит информацию об именах (и некоторую дополнительную информацию, такую как размер файла) файлов на диске. И кластеры содержат фактические данные файла.
При записи файла на диск функции файловой системы будут считывать сектора FAT (вызывая функции «драйвера устройства»).Он проверит содержимое FAT на наличие свободных кластеров.Теперь он прочитает корневой каталог, добавит имя записанного файла и запишет корневой каталог обратно на диск.Затем функции запишут фактические данные файла в кластеры.В конце функции обновят данные FAT (соответствующие сектора больше не являются свободными) и корневой каталог (размер файла больше не равен нулю) и запишут эту информацию обратно на диск.