Почему int80h вместо sysenter используется для вызова системных вызовов? - PullRequest
4 голосов
/ 04 февраля 2012

Все учебники и интернет-ресурсы говорят мне, что int 80h является устаревшим стилем для вызова системных вызовов и был заменен SYSENTER на платформах x86.

Но я только что обнаружил, что моя система все еще использует int 80h.Я знаю такие учебники, как VDSO, библиотека libc, которая реализует службу системных вызовов, но не понимаю, почему int 80h по-прежнему используется по умолчанию.

  1. Кто-нибудь может сказать мне причину?Glibc или ядро ​​слишком старое?

  2. В настоящее время при каких условиях по-прежнему используется "int 80h" по умолчанию?

  3. Как я могупринудительно включить sysenter без установки нового glibc?


Ниже описана моя среда:

Я установил виртуальную машину с помощью VMWare на моем MacBook Air 2011 (Core Duo CPU)).32-битная Ubuntu 8.04 / ядро ​​2.6.24 (скомпилировано с использованием оригинального .config) / libc 2.7 в виртуальной машине.

Ответы [ 2 ]

2 голосов
/ 05 февраля 2012

Какие инструкции (int80 или sysenter) всегда решаются самой гостевой ОС, как вы можете видеть из исходного кода ядра Linux - все зависит от того, какое оборудование VMware предоставило ему.

Посмотрите на файл arch / x86 / vdso / vdso32-setup.c (исходный код ядра Linux):

   if (vdso32_syscall()) {
            vsyscall = &vdso32_syscall_start;
            vsyscall_len = &vdso32_syscall_end - &vdso32_syscall_start;
    } else if (vdso32_sysenter()){
            vsyscall = &vdso32_sysenter_start;
            vsyscall_len = &vdso32_sysenter_end - &vdso32_sysenter_start;
    } else {
            vsyscall = &vdso32_int80_start;
            vsyscall_len = &vdso32_int80_end - &vdso32_int80_start;
    }

Сверху видно, что решение использовать int80 принимается только в случае сбоя при обнаружении функции Sysenter. И эта функция в свою очередь представлена ​​гостю через механизм эмуляции VMWare. Возможно, если бы вы использовали самую последнюю версию VMware вместе с некоторым современным оборудованием, VMware представила бы гостю более современную ОС.

2 голосов
/ 05 февраля 2012

Скорее всего, из соображений совместимости - 32-разрядная версия Ubuntu скомпилирована для совместимости с процессором i386 (ну, может быть, не таким старым в наше время), который не поддерживает sysenter (он появился только в Pentium 2 AFAIK). Очевидно, использование sysenter против int 80h действительно полезно только на некоторых типах процессоров:

http://articles.manugarg.com/systemcallinlinux2_6.html

Поэтому, если в общем случае нет значительного прироста скорости и более широкой совместимости, использование int 80h над sysenter все еще имеет смысл даже сегодня. Если вы используете 64-битную версию Ubuntu, то sysenter / sysexit используются повсеместно.

Редактировать: на самом деле используемый механизм системных вызовов определяется ядром во время загрузки, а не glibc. Эта страница (раздел 4.6) объясняет, как это работает очень хорошо. В вашем случае, случается, что аппаратное обеспечение, эмулируемое VMware, ядро ​​считает более эффективным, используя int 80h, а не sysenter. Вам нужно будет отладить ядро, чтобы выяснить, как оно принимает это решение.

...