Вопрос по c, linux, linux-kernel, system-calls – Что лучше «int 0x80» или «syscall»?

49

Я изучаю ядро Linux и выяснил, что дляx86_64 архитектура прерываниеint 0x80 Безразлично»не работает как вызов для системного вызова.

Вопрос: в случаеx86 архитектура что предпочтительнееsyscall или жеint 0x80 и почему?

РЕДАКТИРОВАТЬ: Использую ядро 3.4

Похожий наstackoverflow.com/q/12776340/841108 вопрос Basile Starynkevitch
Я думаюint 0x80 работает наx86-64 ядро напрямую для обратной совместимости. И руководство Intel говорит, чтоsyscall недопустим в 32-битном режиме. Ciro Santilli 新疆改造中心996ICU六四事件
Где вы смотрите в ядре, что вывидя использованиеint 0x80? Можете ли вы указать некоторые файлы? Mike
Мой ответ на этот вопрос:мороженое', Первый, 'лучше' субъективно. Во-вторых, ты недаже определить критерии, по которымлучше' могут быть оценены другими. Это'бесполезный вопрос И это's получил кучу ответов, которые лишь немного более полезны, чем вопрос. Omnifarious

Ваш Ответ

4   ответа
19

Вот охватывает ваш вопрос.

На практике последние ядра реализуютVDSOв частности, для динамической оптимизации системных вызовов (ядро устанавливает VDSO для некоторого кода, лучшего для текущего процессора). Так что вы должны использовать VDSO, и выДля существующих системных вызовов лучше использовать интерфейс, предоставляемый libc.

Обратите внимание, что, AFAIK, значительная часть стоимости простых системных вызовов переходит от пространства пользователя к ядру и обратно. Следовательно, для некоторых системных вызовов (возможно,gettimeofdaygetpid ...) VDSO может избежать даже этого (и технически может избежать реального системного вызова). Для большинства системных вызовов (как,,,openreadsendmmap ....) стоимость системного вызова ядра достаточно велика, чтобы можно было улучшить переход от пользовательского пространства к пространству ядра (например, используяSYSENTER или жеSYSCALL машинные инструкции вместоINT) незначительный

В 80386 дней самый быстрый способ войти в ядро былвыполнить неверную инструкцию. Adam Rosenfield
68
syscall способ входа в режим ядра по умолчаниюx86-64, Эта инструкция недоступна в 32-битных режимах работына процессорах Intel.sysenter это инструкция, наиболее часто используемая для вызова системных вызовов в 32-битных режимах работы. Это похоже наsyscall, немного сложнее в использовании, но это ядробеспокойствоint 0x80 это устаревший способ вызова системного вызова, и его следует избегать.

ние VDSO, части памяти, отображаемой в адресном пространстве каждого процесса, которая позволяет более эффективно использовать системные вызовы (например, вообще не входя в режим ядра). VDSO также заботится о более сложных, по сравнению с наследиемint 0x80 Кстати, обработкаsyscall или жеsysenter инструкции.

Также смэтот а такжеэтот.

Связанные с:Что произойдет, если вы используете 32-битный int 0x80 Linux ABI в 64-битном коде?, (Это "работает", но только с младшими 32 битами регистров, чтобы вы моглине используйте его с 64-битными указателями.) Peter Cordes
Вопрос был о Linux, и в ответе описываются возможные способы вызова системного вызова в Linux (как i386, так и x86_64). Вы предлагаете использовать только Linux / i386int 0x80 что не соответствует действительности. Предпочтительный способ сделать системный вызов - использовать VDSO. Paweł Dziepak
Рекомендация выбирать один из других для разработчиков ядра ОС. Их выбор становится частью ABI, и если вы разрабатываете для определенной ОС, вы должны соблюдать этот ABI. Например, Linux / i386 использует int 0x80 и передает аргументы в регистрах, тогда как MirBSD / i386 использует int 0x80 и передает аргументы в стеке с одним указателем кадра между ними (что означает отсутствие затрат на установку в пространстве пользователя при использовании cdecl). [Этот ответ в основном предназначен для людей, которые отправляются сюда, но не являются разработчиками ядра ОС.] mirabilos
-3

int 0x80 это лучшая терминология, чтобы указать егосистемный вызов в ядро, чтобы сказать это, чтобы сделать что-то.

Значение и интерпретация взаимозаменяемысделать системный вызов или же 'выпуск int 80h '.

Это не отличается от дней DOS:

вызовите int 21h, чтобы заставить DOS сделать что-то новое для регистра AX и, необязательно, пары регистров ES: DX,int 13h - обработчик жесткого диска BIOS.int 10h - это экран EGA / VGA.int 09h - обработчик клавиатуры.

Общая тема здесь такова: когда вызывается прерывание / системный вызов, ядро проверяет состояние регистров, чтобы увидеть, какой тип системного вызова требуется. Глядя на, например,eax зарегистрировать, например, и определить, что нужно выполнить, внутренне переключить контекст в пространство ядра, выполнить процедуру и переключить контекст обратно в пользовательское пространство с возможностью возврата результатов вызова, т. е. был он успешным или был в неудаче.

На самом деле, набор команд x86_64 имеетsyscall инструкция. В этом отношении,int 0x80 используется только для системного вызова в 32-битной среде Linux. John Ledbetter
Ну, честно говоря, OP должен был сделать это яснееархитектура x86, что предпочтительнее syscall или int 0x80 - это было неоднозначно, поскольку OP ссылался на x86-64 и из этого контекста подразумевал 32-битную ... что сделало мой ответ несколько ошибочным или прерванным исключением: P t0mm13b
5

номера системных вызовов отличаются при выполнении 0x80 или syscall, например, sys_write равен 4 с 0x80 и 1 с syscall.

http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html для 32 бит или 0x80http://blog.rchapman.org/post/36801038863/linux-system-call-table-for-x86-64 для системного вызова

Похожие вопросы