Почему в QEMU сразу после запуска ядра возникает прерывание 0x20?

Здравствуйте! Я разработал своё ядро и после инициализации контроллера прерываний заметил постоянные прерывания 0x20, которые возникают с задержкой примерно в 0,2 секунды и не прекращаются. Вместе с ними корректно работают другие прерывания. <br/><br/> <br/> Это нормальное поведение или проблема может быть не связана с контроллером? Если потребуется, могу предоставить информацию о IDT или данные из отладчика.
  • 24 января 2025 г. 10:54
Ответы на вопрос 2
Здравствуйте!

Прерывание 0x20 — это прерывание таймера, связанное с системным таймером, которое происходит от программируемого таймерного контроллера (PIC) или другого таймера, настроенного для генерации прерываний о времени. Это поведение не является нормальным, если 0x20 возникает постоянно и с фиксированным интервалом, особенно если это происходит сразу после инициализации вашего ядра.

Причины, по которым вы можете видеть постоянные прерывания 0x20, могут включать следующее:

1. **Неправильная инициализация таймера**: Если вы не настроили таймер должным образом, он может продолжать генерировать прерывания, что приводит к постоянным вызовам обработчика прерываний.

2. **Запуск обработчика прерываний**: Возможно, ваш обработчик прерываний для 0x20 не завершает выполнение должным образом или неправильно обрабатывает статус прерываний. Убедитесь, что в конце вашего обработчика вы вызываете ACK (подтверждение) для PIC или APIC, в зависимости от вашей архитектуры.

3. **Неправильная работа IDT**: Если у вас неправильно настроена таблица векторизации прерываний (IDT), это может привести к тому, что процессор неправильно обрабатывает прерывания.

4. **Тестирование в QEMU**: Убедитесь, что вы правильно настроили конфигурацию QEMU. Возможно, есть какие-либо параметры, которые влияют на работу таймера.

Чтобы диагностировать эту проблему, я бы рекомендовал следующее:

- Проверьте настройки вашего таймера и убедитесь, что он конфигурирован для генерации прерываний именно так, как ожидается.
- Убедитесь, что вы правильно обрабатываете прерывания 0x20 и не забываете отправлять подтверждение на контроллер прерываний.
- Используйте отладчик, чтобы отслеживать входы в обработчик прерываний и убедиться, что никаких других ошибок не происходит.

Если вы дадите больше информации о настройках вашего IDT и обработчика прерываний, это может помочь более детально разобраться в проблеме.
Может это нормальное поведение или проблема не с контроллером?

INT 0x20 это IRQ0 в твоей конфигурации, как я понимаю. IRQ0 обычно таймер дёргает.
Похожие вопросы