Доброго всем времени суток. Хотелось бы пообщаться на околоаппаратную тему, а именно работу с устройствами через память и порты ввод/вывода. Хочется систематизировать кашу в голове. Если позволите я приведу некоторые умозаключения и надеюсь меня кто-нибудь поправит. Итак, имеем: процессор x86, адресная шина 36 бит, 4GB оперативки, 32-х разрядная ОСь (Win XP например) в режиме PAE и гипотетическое устройство на шине PCI. Включаем компьютер. Исполняется программа BIOS, устройства на шине PCI конфигурируются системой - им назначаются диапазоны физических адресов памяти, портов ввода/вывода, прерываний. Установки сохраняются в конфигурационное пространство PCI. При загрузке драйвера устройства, он ищет на PCI шине свое устройство по VendorID/DeviceID, обращается к его конф. пространству и считывает настройки, сохраняя их попутно например в DEVICE_EXTENSION. Далее, если работа идет с пространством памяти, то драйвер должен смапировать память устройства на виртуальную память (mmMapIoSpace) и собственно работать с помощью стандартных команд пересылки. Память мапируется без кэширования. Если работа идет с пространством ввода/вывода, то просто используются функции hal для работы с портами. Если я все правильно понимаю, то в x86 архитектуре физически память и порты приходят в одни и те же контакты адресной шины. В зависимости от типа обращения, к памяти (команды MOVxx) или к портам (INx,OUTx), на отдельной шине процессор выставляет необходимые флаги. Так ли это? Еще один вопрос, который который меня терзает: куда, как, и кем проецируется оперативная память? Т.е. проецируется ли она на какой-то непрерывный диапазон физ.адресов? Могут ли адреса, выданные устройствам, перекрывать адреса оперативки? (По идее не должны). Запрос от процессора выставляется параллельно всем устройствам на шине или этим рулит какой-то арбитр, типа: диапазон оперативки - посылаем контроллеру памяти, диапазон шины PCI - посылаем на шину PCI ? Взять туже видеопамять 512 MB - куда она проецируется? В общем много написал - хватит наверное. Если тут написан бред - модератор, удаляй тему нафиг, а так заранее спасибо за ответы. Может кто подскажет литературые источники.
Про непрерывность оперативки я конечно бред написал Понял, когда посмотрел в диспетчере устройств карту памяти.
у процессора x86 есть ножка IO/M на которой выставляется 0 при обращении к памяти (RAM, ROM) или 1 при обращении к портам ввода/вывода
в диспетчере устройств нет карты памяти. Там диапазоны памяти занятые девайсами. Озу по умолчанию отображается с нулевого адреса непрерывным массивом. Начиная вроде с 965 чипсета озу может перепроецироваться выше 4-х гигабайтового диапазона кусками по 1 гигу. Если перепроекции нет и озу например установлено 4 гига, - будет перекрываться устройствами. Читайте даташиты по чипсетам, там есть картинки )
Всем спасибо за ответы. Но про перекрывание ОЗУ все-таки закрадываются сомнения Если устройство перекрывает часть ОЗУ, то как эта ситуация разруливается? Кто арбитр? В соседнем топике Pavia если не ошибаюсь писал что устройствам отдают 3-й гигабайт физ.пространства адресов, а память перенаправляется выше. Хотя у меня например адреса устройств на шине PCI начинаются с 0x80000000. В общем информация рознится. Пойду курить даташиты...