Работа с устройствами в архитектуре x86

Тема в разделе "WASM.BEGINNERS", создана пользователем barmaley57, 17 авг 2010.

  1. barmaley57

    barmaley57 New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2009
    Сообщения:
    58
    Доброго всем времени суток.
    Хотелось бы пообщаться на околоаппаратную тему, а именно работу с устройствами через память и порты ввод/вывода. Хочется систематизировать кашу в голове. Если позволите я приведу некоторые умозаключения и надеюсь меня кто-нибудь поправит.

    Итак, имеем: процессор 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 - куда она проецируется?
    В общем много написал - хватит наверное.

    Если тут написан бред - модератор, удаляй тему нафиг, а так заранее спасибо за ответы.
    Может кто подскажет литературые источники.
     
  2. barmaley57

    barmaley57 New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2009
    Сообщения:
    58
    Про непрерывность оперативки я конечно бред написал :) Понял, когда посмотрел в диспетчере устройств карту памяти.
     
  3. zicker

    zicker Member

    Публикаций:
    0
    Регистрация:
    23 дек 2008
    Сообщения:
    132
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    у процессора x86 есть ножка IO/M на которой выставляется 0 при обращении к памяти (RAM, ROM) или 1 при обращении к портам ввода/вывода
     
  5. EFiR

    EFiR New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2010
    Сообщения:
    28
    в диспетчере устройств нет карты памяти. Там диапазоны памяти занятые девайсами. Озу по умолчанию отображается с нулевого адреса непрерывным массивом. Начиная вроде с 965 чипсета озу может перепроецироваться выше 4-х гигабайтового диапазона кусками по 1 гигу. Если перепроекции нет и озу например установлено 4 гига, - будет перекрываться устройствами. Читайте даташиты по чипсетам, там есть картинки )
     
  6. barmaley57

    barmaley57 New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2009
    Сообщения:
    58
    Всем спасибо за ответы. Но про перекрывание ОЗУ все-таки закрадываются сомнения :) Если устройство перекрывает часть ОЗУ, то как эта ситуация разруливается? Кто арбитр? В соседнем топике Pavia если не ошибаюсь писал что устройствам отдают 3-й гигабайт физ.пространства адресов, а память перенаправляется выше. Хотя у меня например адреса устройств на шине PCI начинаются с 0x80000000. В общем информация рознится. Пойду курить даташиты...