OSDev

для всех
Текущее время: 19 окт 2019, 17:58

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Обсуждение вопросов по xAPIC
СообщениеДобавлено: 07 мар 2013, 09:35 
Аватара пользователя

Зарегистрирован: 17 фев 2013, 16:13
Сообщения: 163
Пытаюсь разобраться с программированием xAPIC, но появились вопросы к специалистам, ответы на которые не удалось получить из документации.

Прочитал следующие документы:
  1. Intel® 64 and IA-32 Architectures Software Developer’s Manual. CHAPTER 10 ADVANCED PROGRAMMABLE INTERRUPT CONTROLLER (APIC)
  2. Intel® 82093AA I/O ADVANCED PROGRAMMABLE INTERRUPT CONTROLLER (IOAPIC)
  3. Руслан Аблязов. Программирование на ассемблере на платформе х86-64

Вопросов много, но начну с самых первых.

  1. Правильно ли будет таким образом включать xAPIC одновременно с переносом отображённых в память регистров по адресу 80000h? -
    Код:
       ; Включение и установка адресов APIC
       mov ecx, APIC_BASE_MSR ; Значение APIC_BASE_MSR = 1Bh
       rdmsr                  ; Считать регистр APIC_BASE_MSR
       xor edx, edx           ; Старшая часть адреса будет 0...
       and eax, 0x00000FFF    ; ...младшая тоже
       ; Установить адрес 0x80000 и включить APIC (бит 11 = 1)
       or eax, 0x00080800
       wrmsr                  ; Записываем новое значение регистра
  2. Ничего непонятно с тем, как перенаправить прерывания через I/O APIC. В документации Architectures Software Developer’s Manual вообще ничего не сказано про адрес, по которому находится IOREGSEL и IOWIN, об этом написано только во втором источнике, но там же есть загадочная фраза
    Цитата:
    The IOREGSEL and IOWIN Registers (Table 3.1) can be relocated via the APIC Base Address Relocation Register in the PIIX3

    Это что вообще такое? Это документация 1996 года, может с тех пор что-то изменилось?

    Далее идёт табличка, из которой видно, что IOREGSEL находится по адресу FEC0xy00h, где вот это "xy" нужно узнавать как раз из APIC Base Address Relocation Register in the PIIX3.

    Вот например, у меня есть клавиатура (странно, да?). Где-то в блогах пишут, что от неё прерывания поступают через LVT LINT1 Register. Почему это так? Где это написано в документации? Как мне направить прерывание от клавиатуры на номер 21h, например. В источнике [3] в списке выше даётся уже готовый рецепт и поверхностное описание, которое мне непонятно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обсуждение вопросов по xAPIC
СообщениеДобавлено: 07 мар 2013, 14:30 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1113
Счастливый человек 7 числа с трезвой головой!

1.
Код:
Правильно ли будет таким образом включать xAPIC одновременно с переносом отображённых в память регистров по адресу 80000h?

Скорее всего нет. Надо детальнее читать документацию.
Дело в том что в документации не сказано кто должен это настраивать. В одних архитектурах это делает БИОС в других он не делает этого.
Во вторых какой-то из APIC ов настраивается только единоразово(перемещение адреса блокируется до перезагрузки).

Тут лучше разобраться с ACPI.
2. В обычном компьютере есть несколько APIC'ков. Есть те что находятся в каждом ядре процессора - LOCAL APIC, а есть те что находятся на материнской плате - IO APIC.
Разумеется в документации на процессор описан только LOCAL APIC ,но не описан IO APIC.
Для того что-бы понять как работать со вторым надо читать документацию на чипсет.
PIIX3 - это южный мост времён пентиума второго (чипсет обычно именуется по южному мосту)

Цитата:
Это документация 1996 года, может с тех пор что-то изменилось?
В общем ничего не поменялась. В частностях да есть.


Цитата:
Вот например, у меня есть клавиатура (странно, да?). Где-то в блогах пишут, что от неё прерывания поступают через LVT LINT1 Register. Почему это так? Где это написано в документации? Как мне направить прерывание от клавиатуры на номер 21h, например. В источнике [3] в списке выше даётся уже готовый рецепт и поверхностное описание, которое мне непонятно.

Это деза. Смотри картинку, на ней реальное подключение. Взята из MultiProcessor Specification.
Изображение
Клавиатура посылает сигнал в 8042. Который дёргает линию IRQ1

Включения APIC мы уже обсуждали на этом форуме поищи. А так правильнее через ACPI работать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обсуждение вопросов по xAPIC
СообщениеДобавлено: 07 мар 2013, 14:52 

Зарегистрирован: 10 сен 2012, 18:39
Сообщения: 5
Цитата:
Ничего непонятно с тем, как перенаправить прерывания через I/O APIC. В документации Architectures Software Developer’s Manual вообще ничего не сказано про адрес, по которому находится IOREGSEL и IOWIN, об этом написано только во втором источнике, но там же есть загадочная фраза

Перенаправляются прерывания логикой материнской платы. Тебе надо замаскировать либо все, либо отдельные(будут баги на многих ACPI совместимых матерях) прерывания PIC. А потом сбросить IOAPIC бит 16(Interrupt Mask) в нужном тебе прерывание в I/O Redirection Table.
Баги будут потому как ACPI официально поддерживает только либо PIC либо IOAPIC но не оба сразу.

Цитата:
Далее идёт табличка, из которой видно, что IOREGSEL находится по адресу FEC0xy00h, где вот это "xy" нужно узнавать как раз из APIC Base Address Relocation Register in the PIIX3.

Не вижу смысла даже задумываться о перенарпавлении так как адреса в рамках которых можно перенаправить очень ограничены.

Цитата:
Вот например, у меня есть клавиатура (странно, да?). Где-то в блогах пишут, что от неё прерывания поступают через LVT LINT1 Register. Почему это так? Где это написано в документации? Как мне направить прерывание от клавиатуры на номер 21h, например. В источнике [3] в списке выше даётся уже готовый рецепт и поверхностное описание, которое мне непонятно.

Скорей всего PIC Также подключён к процессорному LINT1 (или LINT0). PIC посылает сигнал к процессорному LAPIC а процессор вызывет IDT прерывание номер которого передал PIC. Если замаскируешь весь PIC то это должно прекратиться. Сам LINT тоже замаскировать. После, ты можешь размаскировать соответствующий номер в IOAPIC. Какой номер прерывания размаскировать — определяется через ACPI таблицы (в случаее с ps2 клавой/мышкой легче всего воспользоваться MADT таблицой).

Есть ещё Intel MPTable таблица вместо(для твоих нужд) ACPI. Гораздо удобнее и проще но после лоббирования Microsoft была заменена на неповоротливую ACPI. http://www.intel.com/design/pentium/dat ... 201606.pdf

А ещё может быть что устройства (например PIT или ps2) к ioapic не подключены (нету записей в [del]ACPI[/del] или MPTable) то тогда LINT это единственый способ получать прерывания. Но это редкость, хотя, кто знает.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB