OSDev http://osdev.su/ |
|
APIC http://osdev.su/viewtopic.php?f=7&t=535 |
Страница 1 из 3 |
Автор: | Станислав [ 29 апр 2012, 09:56 ] | ||
Заголовок сообщения: | APIC | ||
Этот контроллер заменяет PIC, добавляя к нему 8 векторов, его регистры в оперативной памяти по постоянному адресу, сперцификуции открыты и с его помощью можно запускать процессоры. Что мы знаем про него? Вот пример его включения на простеньком загрузчике, и настройка векторов, переход в защищёнку и установка интервала для таймера и вывод колличества векторов. К примеру не смог добавить включение мыши ps/2. Начинаю читать спецификации и хотел сапросить по его функционалу, недавно узнал, что через его регистры можно перезагрузить и выключить комп. Что можно полезного с его помощью сделать, можно попробовать забить пример функционалом по этой теме. Также определиться с теми прерываниями, которые он использует, в том числе и вызов ошибок, что с ним нужно делать. Напишите, что вы с его помощью делаете? В примере кстати нет ни строчки для работы с PIC.
|
Автор: | grindars [ 29 апр 2012, 10:46 ] |
Заголовок сообщения: | Re: APIC |
Не путайте APIC и ACPI. Совершенно разные вещи. APIC - Advanced Programmable Interrupt Controller - архитектура прерываний, в которой каждый процессор имеет Local APIC, а система - IO APIC. LAPIC - не замена PIC. Это контроллер прерываний на стороне процессора. Он может работать в паре с IO APIC-ами, которые используется на всех многопроцессорных и большей части современных однопроцессорных, и обычной парой PIC-ов. В первом случае прерывания передаются по системной шине или шине APIC, во втором - на LINT0. У IO APIC-а три достоинства перед PIC-ами: у него больше векторов (24), он поддерживает распределение прерываний по процессорам и доступ к нему быстрее. Если брать систему без IOAPIC-а, но с LAPIC-ом (это пень про и старше), то прерывания там распределены следующим образом: 15 обычных ISA-шных прерываний идут на обычную пару ведущий-ведомый PIC-ов, выход ведущего идет на вход LINT0 единственного процессора, который настроен в режиме ExtINT и принимает прерывания по обычному протоколу INT - INTA. На LINT1 идет NMI, и вход настроен в режиме NMI. Если брать систему с IO APIC-ом (одним или более), то ситуация становится интереснее. Во-первых, система может работать в двух режимах: старом, на паре PIC-ов, и родном. Во втором случае прерывания на PIC-ах должны быть замаскированы, LINT0 отключен, а прерывания системы распределены по имеющимся в ней IO APIC-ам. Каждый IO APIC имеет таблицу перенаправления, в которой задается, какой процессор получает прерывание с каким номером (учтите, не IRQ, а именно вектор - номер в IDT!) получает прерывание. Так же для прерывания можно задать режим срабатывания - уровень или перепад, и полярность. Но одна из самых интересных и полезных в многопроцессорной системе фич LAPIC - это возможность посылать межпроцессорные прерывания (IPI). Один процессор может послать произвольное прерывание другому процессору или их группе. Основное назначение этой фичи - это TLB Shootdown - сброс нужных элементов TLB после изменения таблицы страниц одним из процессоров. Запуск процессоров - INIT IPI и SIPI - лишь один из вариантов IPI, и не самый главный. Ну, еще у LAPIC-а есть некоторые побочные источники прерываний, вроде таймера, но они достаточно примитивны. А теперь более сложная часть. Вся эта архитектура - число IO APIC-ов, их адреса, число процессоров и их идентификаторы, распределение ISA-шных прерываний по входам IO APIC-ов - специфична для конкретной машины. Чтобы предоставить ОС информацию о том, как именно устроены прерывания на конкретной машине, есть две таблицы - таблицы от Multiprocessor Specification и таблица ACPI MADT. MPS устарела и не всегда есть на новых машинах, ACPI же есть везде, кроме сааамых древних машин, информация там аналогична MPS и разбирать ее не сложнее. Если этой таблицы нет, а она обычно есть только с IO APIC-ом, то вы можете использовать систему только в устаревшем режиме - с LAPIC-ом и PIC-ами. Ядра можно обнаружить самостоятельно, но распределять прерывания придется через IPI, что медленно и дорого. У себя я использую только MADT и требую от системы поддержку IO APIC-а. P.S. Как были организованы многопроцессорные системы до появления APIC-а я не знаю и не хочу знать. |
Автор: | Станислав [ 29 апр 2012, 12:26 ] |
Заголовок сообщения: | Re: APIC |
Я до сих пор использую PIC, он поддерживается в новых ПК, но если используеш APIC, то из аппоратного прерывания выходиш так mov dword [APIC_EOI_REG_DEF], 0 у PIC было mov al, 20h out 020h, al out 0a0h, al Ваириант должен быть один, и в таблицу IDT добавляеш 8 векторов. Если включил APIC mov ecx, IA32_APIC_BASE rdmsr bts eax, 11 wrmsr вот этими четырьмя строчками и добавил восемь векторов в таблицу и забыл про PIC, что измениться тогда? Если вы используете MADT, то у вас выход из прерывания тоже mov dword [APIC_EOI_REG_DEF], 0? Как вы используете дополнительные 8 векторов? Какие приемущества вам даёт этот режим? 86я опять выделиласи многообразию вариантов и режимов мать её. |
Автор: | grindars [ 29 апр 2012, 12:44 ] |
Заголовок сообщения: | Re: APIC |
|
Автор: | Станислав [ 29 апр 2012, 12:59 ] |
Заголовок сообщения: | Re: APIC |
Я собственно привёл пример взятый из книжки и переделанный на загрузчик. Там работают прерывания от клавы и таймера(причём хорошо), EOI там mov dword [APIC_EOI_REG_DEF], 0, так было в книге. В книге написано, что проверку можно не делать, сразу включать, т.к. её нету только в очень древних ПК. Реч о нём и о том, что меняется в сравнении с работой через PIC(хотел в этом разобраться). Таблица MADT это полезная вещ, её как я понял нужно искать и проверять на её существование. |
Автор: | grindars [ 29 апр 2012, 13:04 ] |
Заголовок сообщения: | Re: APIC |
Да откройте по LAPIC-у главу 10 3 тома мануала на IA-32e, это самый точный источник. MADT - таблица ACPI, а значит вам надо как минимум найти RSDP (раздел 5.2.5.1 спецификации версии 4а), разобрать ее, по указателю из RSDP найти XSDT или RSDT (5.2.8, 5.2.7), разобрать их, среди всех таблиц в них найти MADT и разобрать ее (раздел 5.2.12). Описание IO APIC-а можно взять или из даташита на его первую, выделенную реализацию - i82093AA, или найти в даташите на любой новый чипсет. |
Автор: | Станислав [ 29 апр 2012, 17:35 ] |
Заголовок сообщения: | Re: APIC |
Цитата: Да откройте по LAPIC-у главу 10 3 тома мануала на IA-32e. Не могу найти, скажите точное название файла. |
Автор: | phantom-84 [ 29 апр 2012, 17:49 ] |
Заголовок сообщения: | Re: APIC |
Прикольная шутка! В натуре, нафига руководства читать, если код и так работает |
Автор: | grindars [ 29 апр 2012, 18:06 ] |
Заголовок сообщения: | Re: APIC |
Мануал на IA-32e: http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html Мануал на ACPI: http://acpi.info/ И то, и другое - по первому запросу в гугле. |
Автор: | Станислав [ 29 апр 2012, 18:28 ] |
Заголовок сообщения: | Re: APIC |
phantom-84 писал(а): :lol: Прикольная шутка! В натуре, нафига руководства читать, если код и так работает Ну если бы работало, что нужно мне, то не читал бы. Читать руководство собрался сейчас, о чём писал в первом сообщении. То, что работает описанно в книге, только что прочитал про это ещё раз и понял почему не получилось подключить мыш, возможно из за того что прерывания от клавы и таймера настраивались и для мыши тоже нужно. Для клавы был указан вектор в таблице. Напомню, что в примере не используется PIC, не настраивается и нет его, хотя в прошлых главах книги он полностью разобран, но это у меня уже работает и об этом я уже всё знал. По этому и вопрос, без PIC остальные вектора использовать можно? PIC настраивают, говорят что первый аппоратный вектор например 20h, дальше идут все по порядку, а без этой настройки? В примере настроили клаву так. mov еах, 1 cpuid and ebx, OFFOOOOOOh ; high byte = Local APIC ID mov dword [IOAPIC_IOREGSEL_REG_DEF], IOAPIC_IOAPICID mov dword [IOAPIC_IOWIN_REG_DEF], 2000000h mov dword [IOAPIC_IOREGSEL_REG_DEF], IOAPIC_IOREDTBLl_hi mov dword [IOAPIC_IOWIN_REG_DEF], ebx mov dword [IOAPIC_IOREGSEL_REG_DEF], IOAPIC_IOREDTBLl_low mov dword [IOAPIC_IOWIN_REG_DEF], 21h |
Страница 1 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |