Intereting Posts
Недопустимые операнды для двоичных / (имеют ‘int *’ и ‘int’)? Укажите, является ли текстовая строка адресом IPv6 или IPv4-адресом с использованием стандартного API-интерфейсов C-сокетов Передача c массивов в fortran в виде матрицы с переменным размером MPI-matrix-вектор-умножение возвращает иногда правильные иногда странные значения idt_table undefined! предупреждение при компиляции модуля ядра Сравнение между символом в строке с заданным символом Какие ошибки устанавливают «errno» в ненулевое значение? Почему fopen () устанавливает «errno», а fputc () – нет? Расширение Python C: Извлечь параметр из движка Любые гарантии для неинициализированных переменных? Правильно использовать% s в C – очень базовый уровень C: warning: присваивание делает указатель из целого без cast Является ли законным изменять любой указатель данных через пустоту ** Как использовать IDispatch в простой C для вызова COM-объекта Попытка понять прерывания asm, в частности, 16h func 01H Как проверить встроенные функции Intel, если расширения AVX поддерживаются процессором?

Как обрабатываются операции ввода-вывода C-файлов на низком уровне?

Чтобы расширить заголовок. Мне интересно, как ОС обрабатывает такие функции, как fwrite, fread, fopen и fclose.

Что такое stream?

Извините, если я не был достаточно ясен.

BTW Я использую GNU / Linux Ubuntu 11.04.

Немного лучшее объяснение того, что я пытаюсь спросить.

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

Библиотека C выполняет такую ​​функцию, как fopen и преобразует ее в соответствующий системный вызов ОС. В Linux это функция POSIX open . Вы можете определить это определение в терминале Linux с man 2 open . В Windows вызов будет CreateFile который вы можете увидеть в документации MSDN. В Windows NT эта функция, в свою очередь, является другим переводом фактической функции ядра NT NtCreateFile .

Поток в библиотеке C представляет собой набор информации, хранящейся в структуре FILE. Обычно это «дескриптор» идеи операционной системы для файла, область памяти, выделенная как «буфер», и текущие позиции чтения и записи.

Я просто заметил, что вы отметили это «сборкой». Затем вы можете узнать о деталях на самом низком уровне. Это похоже на хорошую статью.

Теперь вы изменили вопрос, чтобы узнать о более низких уровнях . Ну, как только операционная система получит команду для открытия файла, она передает эту команду в VFS (Virtual File System). Эта часть операционной системы ищет имя файла, включая любые необходимые каталоги и выполняет необходимые проверки доступа. Если это в кеше RAM, доступ к диску не требуется. Если нет, VFS отправляет запрос на чтение в определенную файловую систему, которая, вероятно, является EXT4. Затем драйвер файловой системы EXT4 определит, в каком блоке диска находится этот каталог. Затем он отправит команду чтения команде драйвера диска.

Предполагая, что драйвер диска AHCI, он преобразует запрос на чтение блока в серию записей регистров, которые будут настраивать запрос DMA (прямой доступ к памяти). Это похоже на хороший источник некоторых деталей.

В этот момент controller AHCI на материнской плате берет верх. Он будет связываться с controllerом жесткого диска для совместной работы по чтению данных и записи в ячейку памяти DMA.

Пока это происходит, операционная система откладывает процесс, поэтому он может продолжить работу. Аппаратное обеспечение заботится о вещах, и CPU не требует внимания. В запросе на диск потребуется много миллисекунд, в течение которых процессор может запускать миллионы инструкций.

Когда запрос будет завершен, controller AHCI отправит прерывание. Один из системных процессоров получит прерывание, заглянет в его IDT (таблица дескрипторов прерываний) и переместится на машинный код в этом месте: обработчик прерываний.

Обработчик прерываний операционной системы прочитает некоторые данные, узнает, что он был прерван controllerом AHCI, затем он перейдет в код драйвера AHCI. Драйвер AHCI будет считывать регистры на controllerе, определять, что чтение завершено, поместить маркер в свою очередь операций, сообщить планировщику ОС, что он должен запускаться, а затем вернуться . На данный момент ничего больше не происходит.

Операционная система заметит, что ей необходимо запустить очередь драйверов AHCI. Когда он решает это сделать (у него может быть задание в режиме реального времени или он может читать сетевые пакеты в данный момент), он затем будет считывать данные из блока памяти, помеченные для DMA, и копировать эти данные в файловую систему EXT4 Водитель. Затем драйвер EXT4 вернет данные в VFS, которые будут помещены в кеш. VFS вернет дескриптор файла операционной системы для open системного вызова, который вернет это вызову библиотеки fopen , который поместит его в структуру FILE и вернет указатель на это в программу.

fopen и др. обычно реализуются поверх системных вызовов, специфичных для ОС. В Unix это означает API для работы с файловыми дескрипторами: открывать, читать, писать, закрывать и несколько других. В Windows это CreateFile, ReadFile и т. Д.