OSDev

для всех
Текущее время: 01 май 2024, 21:17

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




Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Таймер APIC в Bochs
СообщениеДобавлено: 03 май 2012, 18:38 

Зарегистрирован: 22 май 2007, 15:29
Сообщения: 283
Для планирования я использую таймер Local APIC. Его опорная частота, как известно, зависит от частоты FSB проца, и, следовательно, ее необходимо измерять.
Делаю я это просто: беру второй канал PIT-а (выход которого выведен в порт 0x61 и потому быстро доступен), запускаю его в режиме одиночного срабатывания через 10 мс, запускаю таймер LAPIC с делителем 16 и отсчетом от FFFFFFFF, жду срабатывания PIT-а, смотрю, сколько тактов насчитал LAPIC, останавливаю его и высчитываю частоту FSB. На QEMU, VirtualBox и всех реалках, что мне доступны, это нормально работает и выдает реалистичные числа. В Bochs же что-то не то c PITом - похоже, он или срабатывает слишком рано, или у него вообще не работает нужный бит в 61 порту, потому что насчитывает мой алгоритм 1875 тактов от потолка (3 МГц). Код работы с PIT-ом вроде как документации соответствует.

Кто-нибудь работал с этим?


Вложения:
Комментарий к файлу: Исходник.
timer_cal.S [1.19 КБ]
Скачиваний: 633
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймер APIC в Bochs
СообщениеДобавлено: 11 май 2012, 11:58 

Зарегистрирован: 26 мар 2012, 17:32
Сообщения: 209
А можно скомпиленный образ с которого можно загрузиться?
Ну или сами соберите последний bochs из svn с ключом --enable-debugger.
Отладчик там позволяет в т.ч. состояние устройств смотреть.

И да, на всякий случай замечу что в bochs частоту эмулируемого процессора лучше выставлять где-то в 50МГц, тогда оно более-менее в реальном времени работает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймер APIC в Bochs
СообщениеДобавлено: 11 май 2012, 12:53 

Зарегистрирован: 22 май 2007, 15:29
Сообщения: 283
Ваш коммент про частоту побудил меня поглядеть в конфиг bochs-а, и оказалось, что он действительно работал на 3 МГц. А проблема была в другом: Bochs, как видно из исходника, не перезапускает таймер при записи в регистр делителя, поэтому необходимо писать в регистр делителя ДО записи в регистр начального счета.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймер APIC в Bochs
СообщениеДобавлено: 11 май 2012, 14:16 

Зарегистрирован: 26 мар 2012, 17:32
Сообщения: 209
> не перезапускает таймер при записи в регистр делителя
а должен? Тут реквестируется ссылка на IASDM или доки от AMD.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймер APIC в Bochs
СообщениеДобавлено: 11 май 2012, 14:37 

Зарегистрирован: 22 май 2007, 15:29
Сообщения: 283
Не совсем верно сказал. Перезапускать - начинать отсчет с регистра начального счета - он действительно не должен. Bochs при смене делителя не пересчитывает интервал, т.е. не применяет новый делитель до перезагрузки начального значения таймера. По сути, Bochs реализует два регистра делителя: теневой и реальный. При записи в видимый софту регистр делителя значение помещается в теневой регистр, а при загрузке регистра начального счета значение теневого регистра копируется в реальный регистр. В IASDM такое (безусловно влияющее на работу софта) поведение не описано, и, если исходить из поведения реальных процессоров, оно является ошибкой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймер APIC в Bochs
СообщениеДобавлено: 11 май 2012, 17:14 

Зарегистрирован: 26 мар 2012, 17:32
Сообщения: 209
> если исходить из поведения реальных процессоров
а можно это показать на примере, пожалуйста? Т.е. то что реальные процессоры меняют делитель на лету.
По идее, для этого достаточно настроить PIT на 100Hz, поставить максимальное значение у счётчика и по срабатыванию его поменять делитель, посмотреть насколько успеет поменяться значение счётчика.
Просто, если действительно поведение реального оборудования отличается, то надо написать авторам bochs, я напишу.
Но сначала хочется убедиться что дела обстоят реально так как тут обсуждаются.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймер APIC в Bochs
СообщениеДобавлено: 11 май 2012, 18:25 

Зарегистрирован: 22 май 2007, 15:29
Сообщения: 283
Так, сделал тест (на основе специально хакнутого ядра), который отлично показывает ошибку. Работает следующим образом:
  1. PIT настраивается на частоту 50 гц, таймер APIC - 10 кГц при делителе 16, т.е. между двумя прерываниями от PIT проходит 200 тиков таймера.
  2. В течение одного интервала PIT система считает прерывания от APIC, затем меняет делитель на 8 и считает в течение одного интервала тики.
  3. Тест перезагружает TICR (тем же значением, что и в начале) и снова считает тики.
  4. Тест отключает оба таймера и выводит результаты на экран.

На реальной машине тест, как и ожидалось, выводит 200, 400, 400, в виртуалбоксе - то же самое, только с чуть менее точными частотами, а в bochs - 200/200/400. Для тестирования прикладываю образ дискеты, если нужно будет в каком-либо другом виде - пишите, соберу.

Для работы нужен 64-битный режим, IO APIC и ACPI.


Вложения:
boot.zip [48.06 КБ]
Скачиваний: 604
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймер APIC в Bochs
СообщениеДобавлено: 12 май 2012, 12:36 

Зарегистрирован: 26 мар 2012, 17:32
Сообщения: 209
Написал разработчику, но есть один нюанс: что-то образ грузится, но не выводит ничего про тики.

Ещё предлагается кандидат на роль патча, хотя, кмк, какой-то странный:
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


Вложения:
Безымянный.PNG
Безымянный.PNG [ 26.81 КБ | Просмотров: 8838 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймер APIC в Bochs
СообщениеДобавлено: 12 май 2012, 13:22 

Зарегистрирован: 22 май 2007, 15:29
Сообщения: 283
Нет прерываний от PIT-а. Можно конфиг и версию bochs?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймер APIC в Bochs
СообщениеДобавлено: 12 май 2012, 14:08 

Зарегистрирован: 12 май 2012, 14:02
Сообщения: 18
grindars писал(а):
Нет прерываний от PIT-а. Можно конфиг и версию bochs?


Дай угадаю:

bugfix in Bochs 2.5:
[3025030] PIT mistakenly connected to IRQ0 IOAPIC instead of IRQ2

У вас похоже диск имидж под старую версию Bochs заточен.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.

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


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

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


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

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