Ядру операционной системы необходимо обеспечить полный процесс управления вводом-выводом и подготовить большое количество различных структур данных для управления потоком ввода-вывода между различными модулями. Эти модули включают в себя: уровень каталогов VFS, уровень кэша страниц, уровень файловой системы, уровень сетевой обработки, уровень общих блоков, уровень планировщика ввода-вывода, уровень драйвера блочного устройства, уровень драйвера контроллера внешнего канала ввода-вывода. Вместе эти уровни образуют большой и сложный стек протоколов ввода/вывода. Я уверен, что вы уже имеете представление о том, как программы используют устройства ввода-вывода. Наиболее распространенные устройства ввода/вывода делятся на три категории: сетевая карта устройства, устройства хранения данных(ст2400мм0129), и интерактивные устройства, такие как клавиатуры/мыши. Эти устройства могут быть подключены к системе через порты PCIE или USB. Вопрос в том, как данные, отправляемые им, генерируются и отправляются на всем пути к драйверу устройства и к устройству? Если программа пользовательского режима хочет прочитать содержимое сектора 0 вентилятора жесткого диска, она не может напрямую манипулировать жестким диском, потому что она не может вызывать функции, предоставляемые жесткий диск драйвер вообще, он может только делегировать коду ядра сделать это через системный вызов чтения. В параметрах системного вызова read пользовательская программа должна как минимум сообщить ядру: с какого устройства читать, какие байты устройства читать, куда помещать считанные данные обратно в память и другие параметры (такие как каким образом читать при чтении и т.д.). То же самое касается чтения файлов.