Почему код ввода обработчика прерываний проверяет флаг переноса? - PullRequest
0 голосов
/ 16 июня 2011

Я пытаюсь сгенерировать прерывание на виртуальной машине и написал простой обработчик прерываний, но когда я пытаюсь проверить генерацию и обработку прерываний, происходит сбой ядра из-за сбоя страницы. Теперь я отладил проблему и обнаружил, что в файле 'entry_64.S', где 'error_entry' вызывается, чтобы поместить регистры в стек и проверить GS там следующий код:

    xorl %ebx,%ebx
    testl $3,CS+8(%rsp)
    je error_kernelspace
 error_swapgs:
    SWAPGS

Когда обрабатывается прерывание, ЦП переводит EFLAGS в положение (rsp) + CS + 8. Таким образом, в приведенном выше коде команда 'testl' проверяет, был ли установлен флаг Carry флага во время прерывания, чтобы определить, было ли прерывание в режиме ядра или в режиме пользователя.

Может кто-нибудь объяснить, почему здесь установлен флажок Carry?

1 Ответ

1 голос
/ 17 июня 2011

На самом деле, я думаю, что он проверяет, соответствует ли CS потоку ядра, см. Комментарий для аналогичной конструкции в ret_from_fork.

...