Я пытаюсь сгенерировать прерывание на виртуальной машине и написал простой обработчик прерываний, но когда я пытаюсь проверить генерацию и обработку прерываний, происходит сбой ядра из-за сбоя страницы. Теперь я отладил проблему и обнаружил, что в файле '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?