Запрет прерываний перед переключением в защищенный режим

Тема в разделе "WASM.OS.DEVEL", создана пользователем Treant, 10 окт 2009.

  1. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    Не понимаю зачем выключать все прерывания, не спрашивайте зачем это знать просто за душу тянет что не понимаю...
    Код (Text):
    1.     ; открываем адресную линию A20
    2.     in   al, 92h
    3.     or   al, 2
    4.     out  92h, al
    5.  
    6.     ; запрет всех прерываний
    7.     cli
    8.     in   al, 70h
    9.     or   al, 80h
    10.     out  70h, al  ; запрет NMI
    11.  
    12. ;    mov  ax, 0x2000
    13. ;    mov  ds, ax
    14. ;    xor  ax, ax
    15. ;    mov  es, ax
    16. ;    mov  si, GDTR-LDR_BASE
    17. ;    xor  di, di
    18. ;    mov  cx, buffer-GDTR
    19. ;    cld
    20. ;    rep  movsb
    21.  
    22.     ; загрузка GDTR
    23.     lgdt fword [GDTR]
    24.  
    25.     ; переключение в PM
    26.     mov  eax, cr0
    27.     or   al, 1
    28.     mov  cr0, eax
    В статье Great'a (Кстати код из GR8OS loader)
    Сказано
    Не понимаю что такого может сделать тик таймера... очевидно он вызовет какое то аппаратное прерывание и что то испортит...
    В общем просветите пожалуйста.
    Заранее спасибо.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Когда мы переключились в защищенный режим, таблица прерываний еще не настроена и первый же тик таймера форсирует процессор обратиться к таблице прерываний и уйти вникуда, будет исключение #GP (кажется), обработчика этого исключения тоже еще нет, будет исключение двойной ошибки #DF, его обработчика тоже нет, будет triple fault (тройная ошибка), что чаще всего приводит к перезагрузке процессора.
     
  3. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    Great
    Понятно, спасибо
    Полегчало)
     
  4. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Трипл фолт вызывает перезагрузку всегда за исключением случаев когда событие прехватывается (VT-x), там рулит гипервизор. Однако надо отличать (хотя в большинстве случаев пох) init от reset'a. В случае трипл фолт - чипсетом генерится #init в ответ на
    на shutdown цикл проца, немало регистров остаются неизменными. Без участия чипсета перезагрузка имела быть на 286.
     
  5. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    Еще вот такой вопрос:
    во flat модели дескриптор кода(да и не только кода) вписан в GDT как:
    Здесь P=1, что означает что сегмент реально присутствует в памяти...
    Но у нас скорее всего меньше 4 ГБ памяти
    Если обратиться к несуществующему адресу - что будет?
    Просто #GP и обращение к IDT для обработки или что то другое?
    Почему бы просто не написать правду, что он реально отсутствует, поставив туда 0?
     
  6. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    #PF - это если paging включен и в таблице страниц прописано, что страница отсутствует. Вопрос был в том, что будет при обращении к отсутствующей физической памяти.
     
  7. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    А вообще flat-модель используется вместо сегментной (т.е. чтобы не возиться с сегментами) поверх страничной переадресации, на которой и базируется управление памятью.
     
  8. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    хм... дело в том что у меня пока IDT нету *ушел делать*
     
  9. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    читаются 0xFF, прерываний/исключений нет (я думал, что, может, NMI выскочит)...
     
  10. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    Разобрался вчера с IDT
    И вот думаю что будет исключение 10 неверный tss но когда ставлю на него шлюз прерывания - перезагрузка
    Нашел вот что:
    Думаю нужно поставить вместо шлюза прерывания шлюз задачи, но пока не сделал еще.
    Сделаю отпишу здесь
     
  11. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    Не не не.
    Думаю что точно не неверный tss... ошибался
     
  12. Quatre_R_Winner

    Quatre_R_Winner Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    66
    При обращении к отсутствующей физической памяти никаких исключений не будет. Просто запишите в никуда или получите какой нить мусор ну или нули. Проверенно на практике + это есть в умных книжках, да и манах от интела. Умные книжки рулят. :) Исключения получаются только если выйти за пределы указанных вами же параметров защиты. Если сегмент 4 Гб, то выйти за его пределы по размеру вам не удастся. Исключения тут могут быть только из за нарушения атрибутов (типа только чтение, ядро или отсутствие сегмента).
     
  13. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    Quatre_R_Winner
    Спасибо