Добрый день! Помогите решить следующую задачу. Необходимо собрать воедино все сообщения, которые поступают к центральному процессору, а также от него. Обработка прерываний - я правильно копаю? Очень срочно нужно. Пожалуйста, откликнитесь! Спасибо.
Процессор обрабатывает поток команд. Прерывание - это просто изменения последовательного их исполненя. С этой точки зрения прерывание ничем не отличается от команды jump или call, просто причина вовне, а не в потоке комманд. Поэтому твой вопрос имеет право на существование, но непонятно пока что конкретно ты хочешь? Что есть сообщения? Процессор никаких сообщений не получает - это понятие программирования, а не аппаратное. Но да существуют архитектуры с сообщениями, но это не Интел x86.
Т.е. обмен данными с периферией типа клавиатуры или дисковых накопителей, насколько понимаю? Хорошо, тогда следующий вопрос: какова цель заведения такого буфера, в который всё это будет складироваться? Вопрос отнюдь не праздный: вполне вероятно, что исходную задачу возможно решить более простым методом.
Да, совершенно верно. Цель именно в этом. Собрать как можно больше сообщений между ЦП и различными интерфейсами. Сообщения, которые нужно собирать, должны быть непосредственно близки ЦП, т.е. прямые команды и т.п.
shchetinin В таком случае не подкинете парочку примеров на Си? )) Желательно без всяких вставочек ассемблеровских, ибо не ведаю сие совершенство. Спасибо!
что вы понимаете под интерфейсами? Контроллер флоппи-дисковода - это интерфейс? Драйвер клавиатуры - это интерфейс? Собрать воедино ВСЕ сообщения (=потоки информации между ЦП и интерфейсами) - потенциально все или все имеющиеся в данной конфигурации? Если у нас нет контроллера флоппи? Если у нас нет LPT-порта? А также вопрос КУДА их собрать воедино... и какие именно потоки. Кем поставлена задача - преподаватель или вы сами себя озадачиваете. И что вы хотите получить в итоге? Между процессором и некоторыми устройствами информация передается через порты. А некоторые устройства имеют регистры, отображаемые на память. Прерывание - вроде бы подходит, но не для всего. Кто-то и не генерирует прерываний. У клавиатуры есть. А от видео? не факт (смотря что за видео-карта) . Встроенный динамик? IRQ нет. Хотя есть порты для управления, из портов можно читать текущее состояние, и задавать новое. IRQ является "сообщением"? скорее всего да (как минимум 1 бит информации передается на ЦП). Но не факт что оно принято немедленно (это запрос на прерывание - если в это время выполняется что-то еще, этот запрос может остаться без ответа). Управляет ли прерывание (самим фактом своего возникновения) чем либо? скорее нет. Управление происходит через порты или память, при обработке прерывания. Насколько важным будет наблюдать за изменением видеопамяти? Это безусловно поступающие от ЦП к периферии потоки (и еще какие, гигабиты в секунду во время игр - прикиньте 120 fps на 32-битном цвете, и вашем разрешении экрана), но нужно ли их "собирать"? С какого момента это надо собирать? Что значит "собрать" - проконтролировать успешное выполнение? Зафиксировать в журнале? Вмешаться в процесс передачи и подменить?
Sidorma Тогда вам кроме перехвата прерываний от периферии в миниатюре надо повторить VmWare - перехватывать обращения к портам. Плюс обращения через память к шине PCI. Вроде все.
Задача странная. Откройте даташит на процессор и посмотрите сколько там ног. Порядка 1000. И это всё работает на частотах порядка 1 ГГц. Я лично вижу только один выход берём цифровой запоминающий анализатор линий(осциллограф) и пишем. Оно вам надо? Если не брать аппаратное, а только программное. То тут нужно сделать гипервизер или отладчик. Думаю отладчик будет по проще. А да и я бы не стал бы перехватывать всё, а только нужное. Тонкостей много. Но вначале сделать перехват прерываний потом портов и портов отображённых в память.
Sidorma Включите трассировку, перехватите это прерывание и смотрите какие команды пойдут в ЦП. Еще неплохо бы поставить хук на READ_PORT_UCHAR... и би хэппии!
Хорошо. У меня есть еще вопрос. Например, если пользователь открывает какое-либо окно, сообщения создания, обновления данного окна и т.п. будут направляться куда? Я подозреваю, что не к процессору, ведь так? К оконной процедуре вроде. Они вообще дойдут до него в каком-либо виде (какие-то биты хотя бы)?
Это уже поток сообщений другого рода - сообщения операционной системы. Через TranslateMessage/DispatchMessage они добираются до оконной процедуры в виде собственно самого сообщения и сопутствующих ему параметров lParam и wParam. Сами сообщения - это некие предопределенные константы.
Мне показалось, что топикстартер не совсем понимает то о чем спрашивает. Sidorma, начни изучать асм с мануалов Intel. Попробуй написать оконное приложение на асме. Поработай с каким-либо дебаггером.
На самом деле неправильно. не асмом единым )) Тут надо изучать а) устройство и логику работы этой хрени в системном блоке (кстати, странно, что никто не вспомнил про DMA, когда я написал про передаваемые процессором в видеопамять гигабиты в секунду... Не передаются эти гигабиты процессором - устройство их само из памяти качает), и б) прочитать мануалы интела, том 3-й, чтобы понимать на чем основаны современные ОС. Дальше можно изучать асм, или С++, или плюнуть на все и уйти пить пиво.
Sidorma ты поставь задачу поконкретнее... Тогда и помогут тебе быстрее. Ты хочешь отслеживать действия кого либо за компом? (что и когда запускали и т.п.) Или мот ты вообще решил троянчик написать? Скорее всего тебе надо будет создовать хуки(что немного повлияет на скорость работы). Почитай тут - http://www.rsdn.ru/article/baseserv/winhooks.xml Ну и примеров создания хуков в инете тьма! Гугл в помощь!