Все учебники и интернет-ресурсы говорят мне, что int 80h - это устаревший стиль для вызова системных вызовов, и на платформах x86 он был заменен на SYSENTER.
Но я только что обнаружил, что моя система все еще использует int 80h. Я знаю такие учебники, как VDSO, оболочка libc, которая реализует службу системных вызовов, но не понимаю, почему int 80h все еще используется по умолчанию.
Кто-нибудь может сказать мне причину? Glibc или ядро слишком старое?
В настоящее время при каких условиях "int 80h" все еще используется по умолчанию?
Как я могу применить sysenter без установки нового glibc?
Ниже моя среда:
Я установил виртуальную машину с помощью VMWare на свой macbook air 2011 (процессор Core Duo). 32-разрядная версия Ubuntu 8.04/kernel 2.6.24 (собрана с использованием исходного файла .config)/libc 2.7 в виртуальной машине.
Ответ 1 · рейтинг 2 · Gnurou
Скорее всего, из соображений совместимости - 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. Вам придется отлаживать ядро, чтобы понять, как оно принимает такое решение.
Ответ 2 · рейтинг 2 · Peter Teoh
Какие инструкции (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 должна была бы предоставить гостю более современную ОС.