int X в сборке преобразуется в номер системного вызова n.
Ex read syscall может иметь номер 4.
При запуске системы ОС создает таблицу указателей, называемых таблицей дескрипторов прерываний (IDT), в которой есть список адресов для системных вызовов, а также привилегия, необходимая для их выполнения.
Текущий уровень привилегий (CPL) сохраняется в одном из битов регистра CS (технически 2 бита в x86).
Далее следуют инструкции int:
• Получить n-й дескриптор из IDT, где n - аргумент типа int.
• Убедитесь, что CPL в% cs равен <= DPL, где DPL - это уровень привилегий в дескрипторе. <br>
• Если нет, то у пользователя не было достаточных привилегий для выполнения этого, и это приведет к выполнению инструкции int 13 (общая ошибка защиты) (у пользователя не было достаточных привилегий)
• Если да, то у пользовательского кода достаточно прав для выполнения этого системного вызова, текущий контекст выполнения сохраняется (регистрируется и т. Д.), Потому что теперь мы переключаемся в режим ядра.
Информация включает регистры, флаги, потому что когда системный вызов завершен, мы хотим продолжить выполнение с того места, где мы ушли.
• Параметры системного вызова сохраняются в стеке ядра, поскольку системный вызов выполняется в режиме ядра.
VSYSCALL (БЫСТРЫЙ СИСТЕМНЫЙ ВЫЗОВ)
Каждый раз, когда пользователь выполняет системный вызов, Os сохраняет текущее состояние машины (т. Е. Регистр, указатель стека и т. Д.) И переключается в режим ядра для выполнения. Для какого-то системного вызова нет необходимости сохранять весь регистр. Ex gettime дня системный вызов считывает текущее время и системный вызов возвращается. Поэтому некоторые системные вызовы реализуются через так называемые vsyscalls. Здесь, когда выполняется системный вызов, он выполняется в самом пользовательском пространстве без переключения на ядро. Так что время сэкономлено.
Подробнее о vsyscall http://www.trilithium.com/johan/2005/08/linux-gate/
здесь
а тут Кто-нибудь может понять, как работает gettimeofday?