Что __ kernel_vsyscall?

Я просто хотел защелкнуться на любые запросы ajax для всей страницы. @SuperG заставил меня начать. Вот что я закончил с:

// redirect ajax requests that are redirected, not found (404), or forbidden (403.)
$('body').bind('ajaxComplete', function(event,request,settings){
        switch(request.status) {
            case 301: case 404: case 403:                    
                window.location.replace("http://mysite.tld/login");
                break;
        }
});

Я хотел специально проверить определенные коды состояния http, чтобы основать мое решение. Однако вы можете просто привязать ajaxError к чему-то другому, кроме успеха (возможно, только 200)? Я мог бы просто написать:

$('body').bind('ajaxError', function(event,request,settings){
    window.location.replace("http://mysite.tld/login");
}
14
задан naumcho 5 December 2008 в 19:27
поделиться

4 ответа

__kernel_vsyscal метод, используемый linux-gate.so (часть ядра Linux) для создания системного вызова с помощью самого быстрого доступного метода, предпочтительно sysenter инструкция. Вещь правильно объяснена Johan Petersson .

27
ответ дан 1 December 2019 в 07:13
поделиться

При создании системного вызова (как чтение из файла, говоря с аппаратными средствами, пишущий в сокеты) Вы на самом деле создаете прерывание. Система затем обрабатывает прерывание в привилегированном режиме и Ваших возвратах вызова с результатом. Большую часть времени для Вас необычно иметь много потоков в syscall, если Вы не выполните блокирующиеся вызовы, в этом случае это ожидается.

Строго говоря, это означает, что поток ожидает на системном вызове уровня ядра. Но это уже (к сожалению для моих точек) на имя :)

9
ответ дан 1 December 2019 в 07:13
поделиться

В дополнение к уже данной хорошей ссылке на объяснение того, какой linux-gate.so, я хотел бы ответить, "почему это ядро отличается?". Новый (более новый, чем 2.5.68) 32-разрядные системы Linux используют страницу VDSO (иначе linux-gate.so.1), и 64-разрядные системы скоро запустятся также (64-разрядный VDSO был представлен в ядре 2.6.24).

, Если бы Вы разрабатываете в более старой системе, или со старым glibc, затем Вы никогда не видели бы __kernel_vsyscall(), или потому что ядро не создало VDSO вообще, или потому что (старый) glibc не использует его, даже когда VDSO присутствует.

2
ответ дан 1 December 2019 в 07:13
поделиться

As Adam said, the main reason is performance. See this link for some old numbers http://lkml.org/lkml/2002/12/9/13.

If you have a vDSO enabled kernel, you're not using interrupts to run syscalls, as Stefan said, actually was because interrupts was getting slower that the whole vDSO thing was added to the kernel.

0
ответ дан 1 December 2019 в 07:13
поделиться
Другие вопросы по тегам:

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