Помогите ссылкой или советом! Только начал изучать ПМ и наткнулся на ряд вопросов. Скажем с IRQ0 в Реальном режиме это таймер, а в ПМ по селектору 0 это события от процессора как тогда в случае IRQ1 и т.д. Т.е. я конечно заходил на wiki.osdev.ru и здесь читал где есть замечания о том, что прийдется перепрагромировать контроллер прерываний, но нигде не видел исходных кодов или хотя-бя примеров. Еще вопрос в тему переходя в ПМ открывая линию А20, я также имею в памяти адреса процедур прерываний в первом Кб? И перепрограммирование контроллера связанно лишь с тем, что изменяется тип адресации? И когда в примерах идет смещение прерываний IRQ0-IRQ7 скажем на 50h это спасет меня в ПМ или надо делать, что то другое? Конкретно интересует события от клавиатуры IRQ1 и IRQ14-IRQ15 (винчестеры)!
fireman Не следует смешивать номера линий запросов прерываний IRQ и номера векторов прерываний процессора (которые задаются в командах INT и которые являются номерами в таблице векторов прерываний). IRQ -- это, так сказать, провод, идущий от некоего внешнего устройства (контроллера дисков, таймера, клавиатуры и т.д.) к контроллеру прерываний. Контроллер же преобразует номер линии IRQ в номер вектора прерывания. Соответствие между этими номерами устанавливается программно путём программирования контроллера прерываний.
WSD - покажи ссылку куда смотреть! Я весь сайт скачал и не нашел программирование контроллера прерываний!
Контроллер прерываний с режимом работы процессора вообще никак не связан, поэтому, в принципе, можно его не перепрограммировать, однако тогда придётся исполнять пляски с бубнами, чтобы отличить прерывания, приходящие от внешних устройств через этот самый контроллер, от прерываний, вызванных какими-либо событиями в самом процессоре (ведь Интел зарезервировала первые 32 вектора для нужд процессора, а ИБМ, делая свой ПК, положила на это большой и длинный, использовав изрядную часть векторов как для внешних устройств, так и для вызовов сервисов BIOS). Ну а располагаться таблица векторов прерываний будет там, где прописано в регистре IDTR, который необходимо загружать правильным значением в процессе перевода процессора в защищённый режим. Пример всех этих действий (кроме перепрограммирования контроллера) имеется в интеловском мануале.
А программирование обычного контроллера прерываний (PIC) описано в целой куче источников. Например, "Программирование на аппаратном уровне" Кулакова. Лично я, когда надо посмотреть что-то, пользуюсь документацией на чипсеты (причём не обязательно на тот чипсет, что используется в моей матери: PIC -- наследие проклятого прошлого, поэтому в любом чипсете он реализован в общем-то одинаково).
>SII Т.е. IDTR - адрес и размер таблицы дескрипторов, а там как и в Реальном по 4 байта дескрипторы т.е. 0х <адрес процедуры обработчика> прерывания. И IRQ0 - это 0-й дескриптор?
fireman Дескрипторы совсем другие (хотя бы потому, что сегментацию в 32-разрядном защищённом режиме никто не отменял, и адрес обработчика имеет в этом случае длину 6 байт). А IRQ0 -- это провод, а не дескриптор. И провод этот идёт не в процессор, а в контроллер прерываний. И на какой дескриптор прерывание по линии IRQ0 будет отображено, зависит от того, как запрограммирован контроллер прерываний.
по дефолту irq0 - это int 8, но так как первые 0x20 прерываний в PMODE используются/зарезервированы под исключения, то надо программировать контроллер на новые векторвы.