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