Не понимаю зачем выключать все прерывания, не спрашивайте зачем это знать просто за душу тянет что не понимаю... Код (Text): ; открываем адресную линию A20 in al, 92h or al, 2 out 92h, al ; запрет всех прерываний cli in al, 70h or al, 80h out 70h, al ; запрет NMI ; mov ax, 0x2000 ; mov ds, ax ; xor ax, ax ; mov es, ax ; mov si, GDTR-LDR_BASE ; xor di, di ; mov cx, buffer-GDTR ; cld ; rep movsb ; загрузка GDTR lgdt fword [GDTR] ; переключение в PM mov eax, cr0 or al, 1 mov cr0, eax В статье Great'a (Кстати код из GR8OS loader) Сказано Не понимаю что такого может сделать тик таймера... очевидно он вызовет какое то аппаратное прерывание и что то испортит... В общем просветите пожалуйста. Заранее спасибо.
Когда мы переключились в защищенный режим, таблица прерываний еще не настроена и первый же тик таймера форсирует процессор обратиться к таблице прерываний и уйти вникуда, будет исключение #GP (кажется), обработчика этого исключения тоже еще нет, будет исключение двойной ошибки #DF, его обработчика тоже нет, будет triple fault (тройная ошибка), что чаще всего приводит к перезагрузке процессора.
Трипл фолт вызывает перезагрузку всегда за исключением случаев когда событие прехватывается (VT-x), там рулит гипервизор. Однако надо отличать (хотя в большинстве случаев пох) init от reset'a. В случае трипл фолт - чипсетом генерится #init в ответ на на shutdown цикл проца, немало регистров остаются неизменными. Без участия чипсета перезагрузка имела быть на 286.
Еще вот такой вопрос: во flat модели дескриптор кода(да и не только кода) вписан в GDT как: Здесь P=1, что означает что сегмент реально присутствует в памяти... Но у нас скорее всего меньше 4 ГБ памяти Если обратиться к несуществующему адресу - что будет? Просто #GP и обращение к IDT для обработки или что то другое? Почему бы просто не написать правду, что он реально отсутствует, поставив туда 0?
#PF - это если paging включен и в таблице страниц прописано, что страница отсутствует. Вопрос был в том, что будет при обращении к отсутствующей физической памяти.
А вообще flat-модель используется вместо сегментной (т.е. чтобы не возиться с сегментами) поверх страничной переадресации, на которой и базируется управление памятью.
Разобрался вчера с IDT И вот думаю что будет исключение 10 неверный tss но когда ставлю на него шлюз прерывания - перезагрузка Нашел вот что: Думаю нужно поставить вместо шлюза прерывания шлюз задачи, но пока не сделал еще. Сделаю отпишу здесь
При обращении к отсутствующей физической памяти никаких исключений не будет. Просто запишите в никуда или получите какой нить мусор ну или нули. Проверенно на практике + это есть в умных книжках, да и манах от интела. Умные книжки рулят. Исключения получаются только если выйти за пределы указанных вами же параметров защиты. Если сегмент 4 Гб, то выйти за его пределы по размеру вам не удастся. Исключения тут могут быть только из за нарушения атрибутов (типа только чтение, ядро или отсутствие сегмента).