Задать вопрос
KernelBuilder
@KernelBuilder
Увлекаюсь программированием с 12 лет

Что делать, на QEMU всё летает, а реальный Celeron D умирает?

С марта пишу операционную систему на C/C++ и ассемблере под x86. Прошел классический путь: от вывода первой строчки в текстовом режиме до самописного GUI с грязными прямоугольниками, двойной буфферизацией , кастомными шрифтами и тасками в голубых тонах. Раньше тестировал сборки исключительно на реальном железе с Intel Celeron D 326 и встроенной графикой, которая старше меня. Чтобы не бегать постоянно с флешкой и dd, в свежей версии 3.17.9 решил вернуть поддержку QEMU. Попытка усидеть на двух стульях закончилась проблемой, которую я не могу расковырять уже несколько дней.

В чем суть бага?
В QEMU система работает идеально. Но на реальном Celeron D начинается нервотрёпка:
1. Система работает примерно в два раза медленнее, чем должна. Причем тормозит в полном покое, даже если мышь и клава вообще не двигаются. Любое мгновенное действие занимает секунду.
2. При этом системный динамик (PC Speaker / пищалка), который настроен пропищать ровно 2 секунды, отрабатывает за 1 секунду. То есть звук ускорился в два раза, а ядро замедлилось в два раза.
3. Графика работает нормально, но курсор мыши даже не отрисовывается также как и время на экране.
Если закомментировать инициализацию мыши (mouse_init), звук пищалки пролетает еще быстрее.

Ссылка на мой гитхаб: https://github.com/larcenkokirill91-max/AnalOS.git
  • Вопрос задан
  • 763 просмотра
Подписаться 2 Сложный 5 комментариев
Помогут разобраться в теме Все курсы
  • Нетология
    1C-программист: расширенный курс
    18 месяцев
    Далее
  • Академия Эдюсон
    Python-разработчик + ИИ
    9 месяцев
    Далее
  • ProductStar × РБК
    Профессия DevOps-инженер + ИИ
    5 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
BestArmor
@BestArmor
Самый обычный (восхитительный) кодер ever на c#
Я проанализировал твой проект, что могу сказать:

Симптомы 100% указывают на кривую настройку таймера (PIT / APIC), конфликт прерываний и закомментированный `hlt`.

Разбор симптомов:

1. Ускорение спикера и замедление системы
Ты настраиваешь PIT (или APIC timer) под определенную частоту, но, скорее всего, рассчитываешь делитель неправильно. Базовая частота PIT — строго 1193182 Гц. Если твой математический расчет делителя в коде глючит (или ты берешь другую базовую частоту), прерывания таймера (IRQ 0) срабатывают в 2 раза чаще.
В итоге планировщик (scheduler) получает тики в 2 раза чаще, система захлебывается в обработчиках прерываний (ISR) и переключениях контекста. Отсюда дикая просадка производительности даже в покое.
PC Speaker использует канал 2 того же PIT. Если базовая частота или делитель завышены в 2 раза, он пищит ровно в 2 раза быстрее (2 секунды превращаются в 1).

2. Влияние мыши на таймер
PS/2 мышь использует IRQ 12, таймер использует IRQ 0. И то, и другое идет через контроллер прерываний (PIC).
Если инициализация мыши меняет маску PIC или переназначает векторы, она ломает обработку IRQ 0. Ты пишешь, что закомментировал mouse_init, и звук стал пролетать еще быстрее. Значит, мышь как-то маскировала часть прерываний таймера (или генерировала спурайные прерывания), а без нее таймер срабатывает еще чаще.

3. Курсор и время не отрисовываются
Отрисовка времени и курсора у тебя, очевидно, завязана на тики ядра. Раз таймер работает криво, тики не доходят до нужного обработчика, либо ты зависаешь в ISR, и графическая подсистема не получает квант времени на перерисовку (dirty rects).

Что чинить:
1. Проверь расчет делителя для PIT (порт 0x40). Делитель = 1193182 / желаемая_частота.
2. Проверь инициализацию PIC (порта 0x20 и 0xA0). Убедись, что маскирование IRQ 0 (таймер) и IRQ 12 (мышь) сделано правильно.
3. Отключи APIC (если включал), работай только через старый 8259 PIC, пока не починишь базовый таймер.
4. Проверь, не генерирует ли мышь спурайные прерывания (spurious interrupts), которые блокируют очередь PIC.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы