Доброго времени суток! Если установить в BAR (базовый регистр адреса) адрес ячецки ОЗУ, что в этом случае произойдет? Как мне теперь обратиться к памяти, которая была расположена по прежнемк адресу? С Уважением, Александр!
exst BAR адресс должна устанавливать ОС или БИОС, а не драйвер устройства. Ничего страшного не произойдет. Все зависит от того как настроенна система. Вообще Прежде чем адресс попадет в PCI он попадет к конроллеру памяти(серверный мост) так вот в нем есть дыры. Если адрес соответствует дыре то он его пропустит по шине PCI, если нет то завернет в основную оперативную память.
Pavia И тогда до устройства не доберёшься... exst Ну а вообще, конфигурирование устройств (и в частности, настройка адресов их регистров) -- вещь достаточно сложная и комплексная. Устройства не в вакууме находятся, поэтому при настройке надо учитывать массу факторов.
Пока что мне все это для общего развития. Допустим есть сетевой контроллер, доступ к регистрам которого происходит через память. Я конфигурирую устройство: устанавливаю BAR (скажем в пределах E00000000-F00000000) и вдруг в сестеме оказывается 4 ГБ ОЗУ. Чипсет трогать не желаю. Слишком сложно да и основное конфигурирование производит BIOS. Таким образом можно работать устройством?
Неа. У Memory Mapped устройств выше приоритет, если можно так выразиться. Обращения пойдут к устройству, а память станет недоступна. Если в системе 4Гб ОЗУ, все они видны не будут. Можно на примере 32-битной Windows или Linux посмотреть. Там предел в районе 3.7Гб (колеблется в зависимости от того встроенное видео или нет). Верхние адреса на которые отображены устройства станут недоступны, а доступ к устройствам будет. Хотя возможно это настраиваемо в чипсете, но думаю врядли.
Хм... Значит в современных ОС "пропадает" много памяьти? Получается выгоднее вынести устройства из 4ГБ и обращаться к ним через страничную 36битную адресацию. А возможно ли это?
Зависит от материнок. На старых будет доступно около 3 ГБ озу. В новых идет переотоброжение за 4Гб. Так что память не пропадает. ОС Борятся с этим. Вопервых старые устройства имеют ограничения и адресса выше 4ГБ могут не видить поэтому ради совместимости такии устроуства распологаются в 4 гбайте. Да и непереместишь их BAR у них 32 битный Так что не переместишь их. Те которые имеют BAR 64 бита могут распологаться в верхней дырке для PCI. А во-вторых не надо путать физические адресса и виртуальные,линейные.
Не путаю. Виртуальные - чисто для использование через PAE. Не подскаете каким образом? Часто изменяют BAR? Я ща пишу с системы, с установленной Windows x64. Диспечер устройств признается, что используемые адреса видеокарты (GF8400): EA000000-EAFFFFFF, D0000000-D7777777, E8000000-E9FFFFFF. Таким образом получаем 16M+120M+32M=168M. Тут возникают два вопроса: На видеокарте установлено 512МЬ, а тут отображено 168МБ. Собственно почему? И почему не используются адреса выше 4ГБ? Оборудование довольно свежее.
Скорее всего изменяют все BAR так что бы они занили как можно меньше места. Вопрос совместимости видео карта должна работать на машинах с 32 битной шиной и 36. А доступ к 512Мбайтам не нужен. Да и совместимость со старым софтом, поэтому БИОС настраивает адрес на 4гб. Ни кто попиксельно не пишет не читает из видио карты, так как это медленно. Используют потокувую передачу через DMA. Видео карте посылается адрес откуда забрать данные и она сама их забирает. 16M и 32M это не память, а скорее всего порты отображенные в память. А 512 очень много для 1ГБ резерва. Видюшка может и свежая, а материнка наверника урезанная. Интел до сих пор выпускает материнки которые поддерживают только 2-3ГБ. Собственно нет выгоды от использования адресов выше 4ГБайт. Хотя для отладки удобнее иметь доступ ко всей памяти.
Также я решин взглунуть на распределение памяти в Линукс-машинке (32 бита). Был немного удивлен. Тут видеокарта как раз использует все 256 МБ.
Да и при чем тут все место. выше головы все равно не прыгнешь. Мне вот интересно: как система использует ОЗУ, адреса которые заняты PCI? Постоянно менят BAR?
Устройства имеют тенденцию резервировать память в 2 раза больше чем используют на самом деле. Вот это большая загадка. Хотя есть одно предположение.
Не меняет так как это не поможет. Если материнка переотоброжает памтять за 4ГБ то все доступно под PCI не теряется. Если не переотоброжает то память теряется. Так как терять 1ГБ не сруки то ОС виндовс пробует упоковать PCI как можно плотнее. И в итоге высвыбождает 300-500МБайт.
А если поступить так: 1)Прописать BAR 2)Произвести доступ в устройство 3)Переместить BAR 4)Произвести работу с памятью. Как вы считаете, такое возможно?
Вы абсолютно правы. Скачал некую программу meminfo, которая выводит диапазоны физической памяти. На системе 5ГБ ОЗУ: До 4ГБ: 0x1000-0x9F000; 0x1000000-0xCFFF0000; Свыше 4ГБ: 0x100000000-0x170000000. (1792МБ, если бы не было переотображения - было бы 1024МБ). Во всем разобрался. Спасибо.