Из не столь отдаленной картины того, что происходит, может ли кто-нибудь объяснить больше о том, в чем разница между системными вызовами Linux, такими как read() и write() и т. д., и записью их на ассемблере с использованием кода операции x86 INT вместе с настройкой указанные регистры?
Большие различия между системными вызовами Linux и программными прерываниями INT 80
Ответы (2)
Фактическая функция read()
представляет собой библиотечную оболочку C над тем, что называется «шлюзом системного вызова». Оболочка библиотеки C в первую очередь отвечает за такие вещи, как установка errno
при сбое, а также за сопоставление между структурами, используемыми в пользовательском пространстве, и структурами, используемыми низкоуровневым системным вызовом.
Шлюз системного вызова, в свою очередь, фактически переключает режим пользователя в режим ядра. Это зависит от архитектуры ЦП — на x86 у вас есть два варианта: один — использовать INT 080h
после настройки регистров с номером системного вызова и аргументами; другой - вызвать символ, предоставленный библиотекой, сопоставленной с адресным пространством каждого исполняемого файла, с той же настройкой регистра. Затем эта библиотека выбирает между несколькими возможными вариантами перехода пользователь->ядро, включая SYSENTER
, SYSCALL
или откат к INT 080h
. В других архитектурах используются другие методы. В любом случае ЦП перемещается в пространство ядра, где номер системного вызова используется для поиска соответствующего обработчика в большой таблице.
прерывание - не единственный способ вызвать системный вызов, вы используете специальные инструкции, такие как sysenter, системный вызов или простой переход на определенный адрес в защищенном режиме.