Туплю че-то
Для переключения между защищенным и реальным режимом нужно выполнить следующую последовательность телодвижений :
1 Запрещаем прерывания
2 Выставляем флаг PE - и опаньки - мы в protected mode
Теперь чтобы вернуться взад , в реальность :
3 Вертаем 0 в PE
4 Разрешаем прерывания
У меня затык происходит сразу после 3-го шага - я подозреваю,что этого из-за того, что в кодовый сегмент CS надо вернуть реальное значение,
которое там было перед установкой защищенного режима :
main:
call disable_interrupts
call set_PE
call clear_PE # вот после этой команды все валится
call enable_interrupts
ret
disable_interrupts:
cli
ret
enable_interrupts:
sti
ret
set_PE:
mov %cr0,%eax
orl $1,%eax
mov %eax,%cr0
ret
clear_PE:
mov %cr0,%eax
and $0xFE,%al
mov %eax,%cr0
ret
Форум —
Development
