Большие различия между системными вызовами Linux и программными прерываниями INT 80 - PullRequest
2 голосов
/ 13 декабря 2011

Из не слишком удаленной картины того, что происходит, может кто-нибудь более подробно рассказать о том, в чем разница между системными вызовами Linux, такими как read () и write () и т. Д., И записью их в ассемблере с использованием кода операции x86 INT вместе сс настройкой указанных регистров?

Ответы [ 2 ]

6 голосов
/ 13 декабря 2011

Фактическая функция read() является оболочкой библиотеки C над тем, что называется «воротами системного вызова».Оболочка библиотеки C в первую очередь отвечает за такие вещи, как установка errno при сбое, а также за сопоставление между структурами, используемыми в пользовательском пространстве, и структурами, используемыми низкоуровневым системным вызовом.

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

0 голосов
/ 13 декабря 2011
Прерывание

- не единственный способ вызвать системный вызов, вы используете специальные инструкции, такие как sysenter, syscall или простой переход на определенный адрес в защищенном режиме.

...