Всем привет, вопрос, так ли это: пусть элемент 13 таблицы IDT (нарушение общей защиты) будет оформлен в виде ловушки, с DPL=0. Если в программе с PL3 фиксируется нарушение общей защиты (например, привышение лимита сегмента), то процессор попытается вызвать обработчик нарушения общей защиты и обнаружит, что шлюз сильно привилегирован. Правило защиты по привилегиям не соблюдается, и процессор сформирует второе нарушение общей защиты. Спрашиваю, потому что эта инфа из книги Микропроцессор 486, а некоторые личности говорят что в мануалах Intel сказано - DPL шлюза процессор игнорирует ! Всем спасибо за внимание
Это одна из самых жесточайших опечаток книги. К счастью, практически единственная. DPL шлюза прерывания учитывается только в том случае, если произошло "программное" прерывание, т.е. int N. Когда источник прерывания сам процессор, то DPL шлюза обработчика прерывания не учитывается. Помимо этого привилегии не учитываются для команды int3 (0xCC которая).
DPL проверяецо при int n, int 3, INTO и должен быть не меньше CPL , иначе расстрел. и в манах от интела это довольно четко описанно.. и то, что при хардварном прерывании DPL не проверяецо - тоже
Забавно, но вот что я нашёл про int3 (0xcc) "The interrupt is taken without faulting at any IOPL level." (3-471). хм... ниче не понимаю? посмотрите на дефлотные записи idt в windows что у int 1 что у int 3 DPL = 0. Но при встречающихся опкодах (в юзермоде ессесно) 0xcc, int 1, установке tf флага хендлеры int 1 и int 3 всё-же получают.
Посмотрел. Система XP SP2, чистая (никаких kernel-mode отладчиков нет). int1: DPL=0, что и понятно: tf вызывает аппаратное исключение #DB, при котором процессор не проверяет DPL. int3: DPL=3, как и должно быть.