Библиотека C принимает функцию, подобную fopen
, и преобразует ее в соответствующий системный вызов ОС.В Linux это функция POSIX open
.Вы можете увидеть определение для этого в терминале Linux с man 2 open
.В Windows вызов будет CreateFile
, который вы можете увидеть в документации MSDN.В Windows NT эта функция, в свою очередь, является еще одним переводом действительной функции ядра NT NtCreateFile
.
Поток в библиотеке C представляет собой набор информации, хранящейся в структуре FILE.Обычно это «дескриптор» представления операционной системы о файле, область памяти, выделенная как «буфер», и текущие позиции чтения и записи.
Я только что заметил, что вы пометили это как «ассемблер»».Возможно, вы захотите узнать о деталях действительно низкого уровня. Это похоже на хорошую статью.
Теперь вы изменили вопрос, задав вопрос о еще более низких уровнях .Ну, как только операционная система получает команду на открытие файла, она передает эту команду в VFS (виртуальная файловая система).Эта часть операционной системы ищет имя файла, включая все необходимые каталоги, и выполняет необходимые проверки доступа.Если это в кэш-памяти RAM, то доступ к диску не требуется.Если нет, VFS отправляет запрос на чтение в конкретную файловую систему, которая, вероятно, EXT4.Затем драйвер файловой системы EXT4 определит, в каком дисковом блоке находится этот каталог. Затем он отправит команду чтения драйверу дискового устройства.
Предполагая, что драйвером диска является AHCI, он преобразует запрос.для чтения блока в серию записей в регистр, которые настроят запрос DMA (прямой доступ к памяти). Это похоже на хороший источник некоторых деталей.
В этот момент контроллер AHCI на материнской плате вступает во владение.Он будет взаимодействовать с контроллером жесткого диска для совместной работы при чтении данных и записи в ячейку памяти DMA.
Пока это происходит, операционная система приостанавливает процесс, чтобы продолжить его с другой работой.Аппаратное обеспечение заботится о вещах, и процессор не обязан обращать на это внимание.Запрос на диск займет много миллисекунд, в течение которых процессор может выполнить миллионы команд.
Когда запрос будет выполнен, контроллер AHCI отправит прерывание.Один из системных процессоров получит прерывание, заглянет в его IDT (таблицу дескрипторов прерываний) и перейдет к машинному коду в этом месте: обработчик прерываний.
Обработчик прерываний операционной системы прочитает некоторые данные, найдетЕсли он был прерван контроллером AHCI, он перейдет к коду драйвера AHCI.Драйвер AHCI прочитает регистры на контроллере, определит, что чтение завершено, поместит маркер в свою очередь операций, сообщит планировщику ОС, что он должен работать, , а затем вернет .На этом этапе больше ничего не происходит.
Операционная система заметит, что ей нужно запустить очередь драйвера AHCI.Когда он решает это сделать (возможно, у него запущена задача в реальном времени или он может читать сетевые пакеты в данный момент), он затем прочитает данные из блока памяти, помеченного как DMA, и скопирует эти данные в файловую систему EXT4.Водитель.Этот драйвер EXT4 затем вернет данные в VFS, которая поместит их в кэш.VFS вернет дескриптор файла операционной системы системному вызову open
, который вернет его в библиотечный вызов fopen
, который поместит его в структуру FILE
и вернет указатель на программу.