Работа с APIC несколько уточняющих вопросов

Тема в разделе "WASM.OS.DEVEL", создана пользователем rpy3uH, 28 янв 2010.

  1. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    С работой с APIC (Local APIC и I/O APIC) вроде разобрался. Но в документации я не понял несколько терминов, с английским у меня вроде нормально, но всё равно не понимаю я.
    Что такое Trigger Mode (edge sensitive и level sensitive) ?
    Что такое Interrupt Input Pin Polarity (active high и active low)?
     
  2. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    rpy3uH
    "Режим защёлки", если дословно. Смысл вот в чём. Когда некая линия сделана чувствительной к фронту сигнала (edge sensitive), запрос по этой линии фиксируется в момент, когда сигнал на этой линии переходит из 0 в 1 (ну или из 1 в 0, если линия инверсная, об этом ниже), и остаётся зафиксированным до тех пор, пока он не будет обработан, даже если после фиксации линия вновь перешла из 1 в 0.

    Когда же линия чувствительна к уровню сигнала (level sensitive), запрос от неё активен только в то время, когда активна сама линия, т.е. когда на ней находится 1 (ну или 0 для инверсной -- опять-таки ниже см.). Если линия падает в 0 до того, как началась обработка её запроса, считается, что этого запроса как бы и не было.

    А вот это указывает, прямая линия или инверсная. Когда она прямая (активный уровень высокий -- active high), считается, что запрос по линии присутствует, когда на ней 1. Ну а когда инверсная (активный уровень низкий -- active low), запрос присутствует, когда на ней 0.
     
  3. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Ещё может возникнуть вопрос, а на кой ляд это нужно и как используется. Тут всё, в общем-то, просто. Когда на одной линии сидит только один источник запроса (например, таймер на IRQ0 в классическом PICе), обычно нужно использовать режим защёлки: если запрос прерывания возник, он будет зафиксирован, даже если потом линия вернётся в неактивное состояние, а значит, рано или поздно будет обработан. Однако режим защёлки непригоден, если к одной линии подключено несколько источников -- а в ПК это обычное явление. Причина в том, что запрос прерывания должен быть активным всё время, пока активен запрос хотя бы от одного из подключенных устройств -- а это можно обеспечить только в режиме чувствительности к уровню сигнала (устройство, запрашивающее прерывание, просто удерживает линию в активном состоянии, пока прерывание не будет обработано и устройству не будет программно выдана команда снять запрос).

    Разные используемые активные уровни (низкий и высокий) объясняются схемотехническими причинами. Не вдаваясь в электронные глубины, замечу лишь, что обычно используется активный низкий уровень, особенно при чувствительности к уровню, а не фронту. На практике это означает, что устройство, пока ему прерывание не нужно, держит на линии 1, а когда хочет запросить прерывание, выдаёт 0 (технически -- заземляет эту линию). Ну а сама электронная схема реализована так, что при выдаче 0 хотя бы от одного источника вся линия падает в 0, даже если остальные источники пытаются держать на ней 1 -- именно это и необходимо для разделения одной линии между несколькими источниками.
     
  4. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    большое спасибо!

    Ещё один вопрос. Кто-нибудь знает частоту таймера на который подсоединён Local APIC? По моим вычислениям частота 0,8 GHz, т.е. он срабатывает с периодом 1,24 наносекунд (разумеется, без учёта регистра делителя).
     
  5. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    И ещё один вопрос. Допустим я хочу законнектить к LINT0 внешние устройства, например клавиатуру. Какие мне надо ставить значения Delivery Mode в регистре IOREDTBL1 (клавиатурный вход IO APIC) и какое значение Delivery Mode в регистре LVT LINT0 Register (Local APIC)? C LVT LINT0 Register вроде понятно, у него надо поставить ExtINT, а в регситре IOREDTBL1 какой Delivery Mode ставить?
     
  6. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    На эти вопросы не отвечу -- наизусть не знаю, в мануалах глядеть лень, а думать -- и подавно :) Однако обращу внимание на формальную некорректность второго вопроса. Клавиатуру _нельзя_ присоединить к какой-либо линии запроса прерывания. Можно присоединить контроллер интерфейса PS/2 (который 8042 в девичестве был) или контроллер USB, но не саму клаву -- она нуждается в "посреднике". Хотя смысл вопроса остаётся понятен, но в других случаях могут возникнуть проблемы (например, если кто-нибудь спросит про команды контроллера клавиатуры, а в итоге выяснится, что ему нужны команды 8042 -- что абсолютно не одно и то же, поскольку контроллер клавиатуры сидит в клавиатуре, а контроллер 8042 -- на материнке). В общем, точность в терминах всё ж нужна :)
     
  7. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    я уже все мануалы перекопал.
    Я не знаю что именно. Я хочу получать прерывания из входа INTIN1 в IO APIC, там написано что это вход клавиатуры. Я прочитал ещё пару раз :) и вроде стало понятно что в регистре IOREDTBL1 Delivery Mode надо ставить Fixed. Если не правильно, этот вопрос решаем экспериментально, разберусь по ходу тестинга программы.
     
  8. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    rpy3uH
    В википедии я описывал. Тип по которому события срабатывает прерывание. edge это перепад уровня. А level уровень.

    С точки зрения обработки первое это взятие производной второе интегрирование.
    И для второго еще уровень 0 и 1 высокий и низкий.

    edge применяется в ISA а level в PCI. У PCI используется active low.

    Зависит от реализации я не мерил.

    А говоришь разобрался. Multy Processor Specification читал?
    К LINT0 внешнее устройство ты законектить можешь только физически - припаяв. А программно на LINT0 ты можешь подключить PIC и IOAPIC .


    Тип доставки ExtINT это особый тип. Это значит что прерывания идут с PIC. При этом возможно две цепочки.
    1) LINT0 - PIC-8042
    2) LINT0 - IOAPIC(0 ввод)-PIC -8042

    Если хочешь без PIC то вместо ExtINT надо fixed (или lovest)
     
  9. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    в общем, понятно.
    LINT0 вообще не нужен.
    нужен только IO APIC у него поставить в IOREDTBL1 нужный вектор и режим Fixed (000b)
     
  10. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    Ещё два вопроса
    1. Зачем нужны поддельные прерывания (spurious interrupt) ?
    2. Почему не получается изменить Local APIC ID? пробовал на bochs 2.4.1 и на ноутбуке с Pentium D. Bochs пишет что этот регистр только для чтения. На ноутбуке пробовал изменить Local APIC ID, а в таблице IO APIC для прерывания клавиатуры указывал новый APIC ID, не работало.
     
  11. Vic3Dexe

    Vic3Dexe New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2009
    Сообщения:
    53
    Они не поддельные. Они ложные (кажущиеся). Например, в ситуации, когда девайс снимает запрос до того, как он был обработан, возникает это самое прерывание. Разумнее всего его просто игнорировать, но обработчик нужен все равно (хоть и состоящий из одного iret).
    1. А зачем?
    2. Нельзя потому, что это прерогатива биос и железа. ОС берет инфу об айдишках именно из таблиц биоса или читая таковые из LAPIC для каждого проца. Единственная ситуация, где ОС назначает айди - это дефолтные конфиги (см. MP Spec.), причем они обязаны быть 0 и 1 (т.к. при дефолте всегда 2 проца).
     
  12. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    Vic3Dexe, спасибо за ответ.
    вопрос с частотой таймера APIC остаётся открытым, экспериментально получил частоты таймера на ноутбуке и на компе, они получились разными, притом отличаются они сильно: на ноутбуке таймер срабатывает через каждые 7,5 мкс, на компе через каждые 5 мкс.
     
  13. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    rpy3uH
    Насчёт кажущихся прерываний. В обычном PIC такое возникает регулярно для младших линий IRQ -- т.е. IRQ7 и IRQ15 (ведь исторически PIC -- это две микросхемы 8259). Если контроллер выдаёт в процессор запрос прерывания и получает подтверждение, он должен выдать вектор. Но если при этом оказывается, что запрос прерывания уже снят (устройство почему-то его убрало в этот момент), контроллер не знает, какой вектор выдать -- и выдаёт вектор для своей старшей линии (IRQ7 или IRQ15 для ведущего и ведомого PIC соответственно). Поэтому обработчики этих прерываний должны были анализировать, а реальное ли прерывание произошло. Аналогично и с APIC, потому что возникновение такой ситуации там тоже не исключено.

    Что касается частоты таймера, то не связана ли она с частотой процессорной шины (FSB)? Я вот не помню...
     
  14. Vic3Dexe

    Vic3Dexe New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2009
    Сообщения:
    53
    Дополню - разница в случае АПИК в том, что АПИК умеет работать с 255, а не 16, как в случае ПИК, векторами. Поэтому для spurious int можно задать свой, выделенный вектор, куда и будет приходить подобный мусор. И тем не менее, в обработчиках IRQ все же не лишне проверять факт запроса. На всякий случай =)
     
  15. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Vic3Dexe
    Угу, совершенно согласен. Ну а в общем случае надо предусматривать анализ наличия запроса по цепочке драйверов, потому что на одной линии может сидеть несколько устройств. Такой анализ заодно покажет липовое прерывание: если оно пришло, но ни один драйвер не опознал его.
     
  16. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    всем, спасибо за ответы