Следующий код работал отлично для меня (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
Со стороны пользовательского пространства механика идентична выполнению системного вызова в 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-битный, медленнее для выполнения процессором, чем тот, который этого не делает - проверьте руководства по архитектуре процессора для этого.