Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Чем отличается системный вызов от (программного) прерывания?

#linux #ассемблер


Вызвать прерывание можно оператором int в ассемблере, при этом будет передано управление
коду в ячейке с указанным номером из таблицы прерываний. При этом в linux возможен
вызов прерывания intx80, именуемого syscall. Со стороны программиста это будет выглядеть
как вызов библиотечной функции, которая, тем не менее, будет обработана в пространстве
ядра. Так в чём разница между системным вызовом и софтверным прерыванием, если первый
всё также вызывается через intx80?
    


Ответы

Ответ 1



На самом деле это разные, несравнимые, вещи. По определениям википедии: Системный вызов — обращение прикладной программы к ядру операционной системы для выполнения какой-либо операции. Прерывание — сигнал от программного или аппаратного обеспечения, сообщающий процессору о наступлении какого-либо события, требующего немедленного внимания. Программные прерывания (в русской терминологии) — прерывания, которые инициируются исполнением специальной инструкции в коде программы. Т.е. системный вызов — это абстракция ОС, в которой есть разделение на пространство пользователя и пространство ядра, а программное прерывание — это механизм взаимодействия программного кода с процессором. Действительно, зачастую системные вызовы реализуются с помощью программных прерываний, но это не обязательно так, например, на amd64 поддерживается по меньшей мере 3 способа: инструкция syscall — основной способ, появился появился только на архитектуре amd64, в режиме совместимости x86 есть не на всех процессорах (только на процессорах amd), самый быстрый из перечисленных. инструкция sysenter — аналогичная старая инструкция, появилась во времена Pentium 2, основной способ при сборке под архитектуру i686. собственно int 80h — считается устаревшим (legacy) способом, относительно медленный, время на переключение контекста примерно вдвое дольше, чем с помощью syscall.

Комментариев нет:

Отправить комментарий