Фактическая функция read()
является оболочкой библиотеки C над тем, что называется «воротами системного вызова».Оболочка библиотеки C в первую очередь отвечает за такие вещи, как установка errno
при сбое, а также за сопоставление между структурами, используемыми в пользовательском пространстве, и структурами, используемыми низкоуровневым системным вызовом.
В свою очередь, системный вызов gateэто то, что на самом деле переключается из режима пользователя в режим ядра.Это зависит от архитектуры процессора - на x86 у вас есть два варианта - один - использовать INT 080h
после настройки регистров с номером системного вызова и аргументами;другое - вызвать символ, предоставляемый библиотекой, отображенной в адресное пространство каждого исполняемого файла, с той же настройкой регистра.Эта библиотека затем выбирает между несколькими потенциальными опциями для переходов от пользователя к ядру, включая SYSENTER
, SYSCALL
или откат к INT 080h
.Другие архитектуры используют все же другие методы.В любом случае ЦП переходит в пространство ядра, где номер системного вызова используется для поиска соответствующего обработчика в большой таблице.