OSDev http://osdev.su/ |
|
Таймер APIC в Bochs http://osdev.su/viewtopic.php?f=7&t=542 |
Страница 1 из 2 |
Автор: | grindars [ 03 май 2012, 18:38 ] | ||
Заголовок сообщения: | Таймер APIC в Bochs | ||
Для планирования я использую таймер Local APIC. Его опорная частота, как известно, зависит от частоты FSB проца, и, следовательно, ее необходимо измерять. Делаю я это просто: беру второй канал PIT-а (выход которого выведен в порт 0x61 и потому быстро доступен), запускаю его в режиме одиночного срабатывания через 10 мс, запускаю таймер LAPIC с делителем 16 и отсчетом от FFFFFFFF, жду срабатывания PIT-а, смотрю, сколько тактов насчитал LAPIC, останавливаю его и высчитываю частоту FSB. На QEMU, VirtualBox и всех реалках, что мне доступны, это нормально работает и выдает реалистичные числа. В Bochs же что-то не то c PITом - похоже, он или срабатывает слишком рано, или у него вообще не работает нужный бит в 61 порту, потому что насчитывает мой алгоритм 1875 тактов от потолка (3 МГц). Код работы с PIT-ом вроде как документации соответствует. Кто-нибудь работал с этим?
|
Автор: | Nable [ 11 май 2012, 11:58 ] |
Заголовок сообщения: | Re: Таймер APIC в Bochs |
А можно скомпиленный образ с которого можно загрузиться? Ну или сами соберите последний bochs из svn с ключом --enable-debugger. Отладчик там позволяет в т.ч. состояние устройств смотреть. И да, на всякий случай замечу что в bochs частоту эмулируемого процессора лучше выставлять где-то в 50МГц, тогда оно более-менее в реальном времени работает. |
Автор: | grindars [ 11 май 2012, 12:53 ] |
Заголовок сообщения: | Re: Таймер APIC в Bochs |
Ваш коммент про частоту побудил меня поглядеть в конфиг bochs-а, и оказалось, что он действительно работал на 3 МГц. А проблема была в другом: Bochs, как видно из исходника, не перезапускает таймер при записи в регистр делителя, поэтому необходимо писать в регистр делителя ДО записи в регистр начального счета. |
Автор: | Nable [ 11 май 2012, 14:16 ] |
Заголовок сообщения: | Re: Таймер APIC в Bochs |
> не перезапускает таймер при записи в регистр делителя а должен? Тут реквестируется ссылка на IASDM или доки от AMD. |
Автор: | grindars [ 11 май 2012, 14:37 ] |
Заголовок сообщения: | Re: Таймер APIC в Bochs |
Не совсем верно сказал. Перезапускать - начинать отсчет с регистра начального счета - он действительно не должен. Bochs при смене делителя не пересчитывает интервал, т.е. не применяет новый делитель до перезагрузки начального значения таймера. По сути, Bochs реализует два регистра делителя: теневой и реальный. При записи в видимый софту регистр делителя значение помещается в теневой регистр, а при загрузке регистра начального счета значение теневого регистра копируется в реальный регистр. В IASDM такое (безусловно влияющее на работу софта) поведение не описано, и, если исходить из поведения реальных процессоров, оно является ошибкой. |
Автор: | Nable [ 11 май 2012, 17:14 ] |
Заголовок сообщения: | Re: Таймер APIC в Bochs |
> если исходить из поведения реальных процессоров а можно это показать на примере, пожалуйста? Т.е. то что реальные процессоры меняют делитель на лету. По идее, для этого достаточно настроить PIT на 100Hz, поставить максимальное значение у счётчика и по срабатыванию его поменять делитель, посмотреть насколько успеет поменяться значение счётчика. Просто, если действительно поведение реального оборудования отличается, то надо написать авторам bochs, я напишу. Но сначала хочется убедиться что дела обстоят реально так как тут обсуждаются. |
Автор: | grindars [ 11 май 2012, 18:25 ] | ||
Заголовок сообщения: | Re: Таймер APIC в Bochs | ||
Так, сделал тест (на основе специально хакнутого ядра), который отлично показывает ошибку. Работает следующим образом:
На реальной машине тест, как и ожидалось, выводит 200, 400, 400, в виртуалбоксе - то же самое, только с чуть менее точными частотами, а в bochs - 200/200/400. Для тестирования прикладываю образ дискеты, если нужно будет в каком-либо другом виде - пишите, соберу. Для работы нужен 64-битный режим, IO APIC и ACPI.
|
Автор: | Nable [ 12 май 2012, 12:36 ] | ||
Заголовок сообщения: | Re: Таймер APIC в Bochs | ||
Написал разработчику, но есть один нюанс: что-то образ грузится, но не выводит ничего про тики. Ещё предлагается кандидат на роль патча, хотя, кмк, какой-то странный: http://forum.osdev.org./download/file.php?id=2270 inb4: пробовал образ и как образ НМЖД, и как образ дискеты цеплять, но результат совершенно одинаков. Ещё меня удивляет в логах (это без патча, впрочем, есть ли разница) : Код: 00010000004i[XGUI ] charmap update. Font Height is 16
00160546000i[CPU0 ] RDMSR: Read 00000000:fee00900 from MSR_APICBASE 00160546007i[CPU0 ] WRMSR: wrote 00000000:fee00900 to MSR_APICBASE 00160546007i[APIC0] allocate APIC id=0 (MMIO enabled) to 0x00000000fee00000 00160546056i[APIC0] set timer divide factor to 16 00161046075i[APIC0] set timer divide factor to 16 00161546076i[APIC0] set timer divide factor to 16 00162046074i[APIC0] set timer divide factor to 16 00162553377i[IOAP ] IOAPIC: setting id to 0x1
|
Автор: | grindars [ 12 май 2012, 13:22 ] |
Заголовок сообщения: | Re: Таймер APIC в Bochs |
Нет прерываний от PIT-а. Можно конфиг и версию bochs? |
Автор: | stlw [ 12 май 2012, 14:08 ] |
Заголовок сообщения: | Re: Таймер APIC в Bochs |
grindars писал(а): Нет прерываний от PIT-а. Можно конфиг и версию bochs? Дай угадаю: bugfix in Bochs 2.5: [3025030] PIT mistakenly connected to IRQ0 IOAPIC instead of IRQ2 У вас похоже диск имидж под старую версию Bochs заточен. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |