Как 32-битные приложения выполняют системные вызовы в 64-битной Linux?

Следующий код работал отлично для меня (firefox):

for (var i=0; i<3; i++) {
   element = new ...   // create your element
   element.counter = i;
   element.addEventListener('click', function(e){
        console.log(this.counter);
        ...            // another code with this element
   }, false);
}

Выход:

0
1
2
30
задан Alex B 22 July 2010 в 02:49
поделиться

1 ответ

Со стороны пользовательского пространства механика идентична выполнению системного вызова в 32-битном собственном ядре - весь код пользовательского режима, включая 32-битный glibc, работает таким же образом.

Со стороны ядра старые точки входа IA32 из пользовательского пространства (например, int 0x80 ) настроены для вызова процедуры ассемблера ia32_syscall . (Переход в пространство ядра включает загрузку процессором селектора сегмента кода ядра, что вызывает переход в 64-битный «длинный» режим).

Процедура ia32_syscall затем перемешивает некоторые аргументы, чтобы соответствовать соглашению о вызовах системного вызова x86_64:

movl    %edi,%r8d
.if \noebp
.else
movl    %ebp,%r9d
.endif
xchg    %ecx,%esi
movl    %ebx,%edi
movl    %edx,%edx   /* zero extension */

Затем она использует номер системного вызова IA32 для выполнения вызова функции через таблицу, ia32_sys_call_table . Это по существу совпадает с номерами системных вызовов IA32 с собственными реализациями системных вызовов (номера системных вызовов сильно различаются между IA32 и x86_64). Первая часть этой таблицы выглядит так:

ia32_sys_call_table:
    .quad sys_restart_syscall
    .quad sys_exit
    .quad stub32_fork
    .quad sys_read
    .quad sys_write

Для большинства системных вызовов реализация x86_64 теперь может быть вызвана напрямую - как exit () .Для других, таких как fork () , предоставляется оболочка, которая правильно реализует ожидаемую семантику IA32 (в частности, если требуется знаковое расширение аргументов с 32-битного до 64-битного).

Как видите, накладные расходы в коде ядра минимальны - несколько тривиальных модификаций значений регистров и для нескольких функций дополнительный вызов функции. Я не уверен, что загрузка селектора сегмента кода, который вызывает переход из 32-битного режима в 64-битный, медленнее для выполнения процессором, чем тот, который этого не делает - проверьте руководства по архитектуре процессора для этого.

27
ответ дан 28 November 2019 в 00:23
поделиться
Другие вопросы по тегам:

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