Как выглядят файловые операции на уровне сборки - PullRequest
1 голос
/ 16 апреля 2019

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

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

Так что, если мое понимание, которое я записал в первом абзаце, правильное, то любая операция чтения, требующая определенного числа байтов, скажем, X, разделит X на размер блока, чтобы получить результат, скажем N, тогда запросить в файловой системе местоположение содержимого первых N блоков и извлечь содержимое, хранящееся в этих местах. Если это жесткий диск, то содержимое извлекается с диска. Но включает ли это чтение с диска использование DMA и, следовательно, связь, управляемую через некоторый контроллер DMA?

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

Подобный механизм, который я мог бы придумать для операции записи, где берется смещение, определяется требуемый номер блока, затем новые записываемые байты разделяются на блоки, а новые блоки обновляются в файловой системе.

Пожалуйста, исправьте, если мое понимание выше неверно.

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

Я прошел через следующие посты:

http://www.brokenthorn.com/Resources/OSDev20.html

и

http://www.brokenthorn.com/Resources/OSDev20.html.

Здесь я вижу иллюстрацию в сборке для записи на дискету или для выполнения DMA, но в следующей главе:

http://www.brokenthorn.com/Resources/OSDev22.html

, что касается файловых систем. Я не смог точно выяснить детали на уровне сборки файловых операций. (Хотя в некоторых предыдущих главах чтение из FAT было рассмотрено, но в меру памяти использовались прерывания BIOS).

Итак, в двух словах, что происходит на уровне оборудования и сборки при открытии файла, чтении файла, записи файла и закрытии файла?

1 Ответ

1 голос
/ 16 апреля 2019

Как файловые операции выглядят на уровне сборки

В приложении это выполняется с помощью системного вызова (например, инструкция int на процессорах x86). Такой системный вызов вызовет функцию в ОС.

Эта функция в ОС, как правило, представляет собой короткую функцию, написанную на ассемблере, которая вызывает другую функцию, которая обычно написана на языке программирования высокого уровня (обычно на C; но написание этой функции на ассемблере также возможно, конечно).

Эта вторая функция вызовет множество других функций.

На жестком диске или дискете данные хранятся в виде секторов. Каждый сектор содержит определенное количество байтов (например, 512), и вы можете читать или записывать только полные сектора, а не отдельные байты. Диск ничего не знает о файлах.

В типичной операционной системе при обработке файлов участвуют два разных типа функций:

1) Функциональность драйвера устройства

Эти функции предназначены для чтения или записи «секторных» данных с диска или на диск. Как это делается на самом деле, зависит от процессора и типа дисковода.

В простейшем случае у вас есть ЦП с отображенным в память вводом / выводом, и вы не используете прерывания или DMA. Исторический дисковод гибких дисков Commodore 1581 является примером для этого.

В этом случае программа записывает некоторые данные на аппаратное обеспечение, просто записывая байт в адрес - так же, как вы записываете байт в ОЗУ. Чтение с аппаратного обеспечения работает как чтение байта из ОЗУ.

Программное обеспечение запишет некоторые данные на оборудование, которое дает указание дисководу считывать некоторые данные с диска. Затем программа непрерывно считывает данные с определенного адреса. Эти данные содержат информацию, если дисковод готов. Как только диск готов, программное обеспечение считывает фактические данные, считывая данные с другого адреса. Написание работает аналогично.

Если вы используете ЦП, который не использует ввод-вывод с отображением в память, доступ к оборудованию не работает так же, как доступ к ОЗУ, но используются специальные инструкции (in и out). (Старые компьютеры с архитектурой x86 являются примером этого.)

Если используются прерывания (как в современных компьютерах), программное обеспечение не должно постоянно проверять, готов ли дисковод. ЦПУ будет вызывать специальную функцию - так называемый «обработчик прерываний», как только накопитель сообщит о готовности.

Если используется DMA (как в современных компьютерах), дисковод может напрямую записывать данные, считанные с диска, в ОЗУ (или считывать данные, которые будут записаны из ОЗУ). Таким образом, программное обеспечение должно записывать только специальные данные, которые дают указание дисководу записать какой-либо сектор. Программное обеспечение не должно записывать фактические данные, которые должны быть записаны на диск, потому что дисковод будет непосредственно считывать эти данные из ОЗУ. (То же самое относится и к чтению.)

2) Функциональность файловой системы

Эти функции будут вызывать функции «драйвера устройства» для доступа к диску.

Файловая система - более или менее ничего, кроме некоторого описания того, как файлы хранятся на диске. Если диск использует файловую систему «FAT16», на диске есть три области: FAT, корневой каталог и кластеры.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...