LINUX.ORG.RU

Как видеопамять отображается в адресное пространство проца?


0

3

У меня фантазии такие:
схема 1:
выделяется память в RAM, куда процессор пишет, потом происходит нечто (типа прерывания кадровой развертки) и видеопроцессору выдаются инструкции - взять из памяти и скопироват в видеопамять, откуда уже всё будет видно на экране.
Сомнения у меня в том, что такое прерывание существует в современных системах. Да и не верю я, что реально память выделяется.

схема 2:
Процессор выводит значение по адресу, контроллер памяти CPU обращается к контроллеру PCI-e и передает ему пакет, контроллер PCI обращается к Memory Controller на GPU и тот уже пакет ловит и пишет в видеопамять.
Смущает то, что это вообще медленно такие процедуры на каждый записываемый байт выполнять...

Так как же оно работает на самом деле? Не говорите «прочитай про DMA», там написано, как жесткие диски передают свои сектора в память из своего кеша. А мне надо пример с CPU и GPU.

Оба твоих варианта неправильные. У процессора есть шины данных и адреса, на них, помимо памяти, могут висеть любые другие устройства, которые откликаются на свой диапазон адресов, выставленный процессором на шине адреса

Harald ★★★★★
()
Ответ на: комментарий от tailgunner

поясни свою мысль? Несколько cpu между собой, и чипсетом общаются через QuickPathInterconnect, а с прочими устройствами общается уже чипсет через PCIe (даже если он физически внутри проца)

Indaril_Shpritz
() автор топика
Ответ на: комментарий от Harald

потому что есть такая шина PCI-e, там не шина адреса, а последовательная передача через четыре провода - два в одну сторону, два в другую

Indaril_Shpritz
() автор топика
Ответ на: комментарий от Indaril_Shpritz

Это уже детали реализации, главное что где-то на шине адреса висит дешифратор, который в зависимости от выставленного адреса подключает к шине данных соответствующие устройства (в данном случае точнее было бы сказать контроллер PCI-e (или AGP раньше), а как он там дальше передает данные видеокарте - это уже его дело. Почитай какую-нибудь книжку по процессорам и схемотехнике

Harald ★★★★★
()
Ответ на: комментарий от Harald

как он там дальше передает данные видеокарте - это уже его дело

видишь-ли, у видеоплаты нет прерываний, не умеет она их обрабатывать. Так что как он там дальше передает, это не его дело, а очень интересный вопрос.

Indaril_Shpritz
() автор топика
Ответ на: комментарий от tailgunner

Плакал.

Назрела необходимость в Царе по железу.

i-rinat ★★★★★
()
Ответ на: комментарий от Harald

Почитай какую-нибудь книжку по процессорам и схемотехнике

да мне не надо, я spectrum собирал. вот твои высказывания - на том же уровне, а в железе уже поменялось всё.

Indaril_Shpritz
() автор топика

объясняю на примере radeon:

с точки зрения проца на шину торчит бок HDP(host data path) дающий доступ к первым 256 мб памяти

с точки зрения остальных блоков GPU, видно следующее: 40битное адресное пространство.

в нем есть окно system aperture, и окно допустимых адресов mmu. если попали в system aperture: address_out = address_in если попали в допустимые адреса mmu, address_out=mmu(address_in). иначе просто нули возвращаются или данные теряются.

после этого шага, есть окно набортной памяти. если попали в него, идет обращение к набортной памяти. иначе запрос уходит на PCI(PCI_e) как есть

ckotinko ☆☆☆
()
Ответ на: комментарий от Indaril_Shpritz

видишь-ли

Я тебе поражаюсь. Вроде всё знаешь и тем не менее зачем-то вопросы задаёшь. Ты пиши сразу ответ, который хочешь увидеть. Мы его и напишем, правда.

i-rinat ★★★★★
()
Ответ на: комментарий от ckotinko

на пальцах: [---] - это окно в памяти, заданное start-addr — end-addr

   -------шейдеры-------
    [tex0] [buf1]      [tex2]        [tex3]    [buf4]
    ------mmu-----------------                                       
                                  [video ram address space]
   [ pci-e adddress space.................................................................]

часть запросов шурует мимо tlb - через [system aperture]. так лазают UVD2 и сам TLB

ckotinko ☆☆☆
()
Ответ на: комментарий от i-rinat

походу да. там все индусы из бангалора теперь пишут. вообще все в бангалор уехало

ckotinko ☆☆☆
()
Ответ на: комментарий от Indaril_Shpritz

ну тогда бери какую-нибудь спецификацию PCI-E и вкуривай до просветления

Harald ★★★★★
()

По разному. На RPi к примеру память общая и нужно просто сообщить видеоадаптеру адрес фреймбуфера, а потом туда пишешь, а адаптер читает.

zinfandel ★★
()
Ответ на: комментарий от Indaril_Shpritz

Смотря где. В большинстве ARM SoC связаны.

anonymous
()
Ответ на: комментарий от Indaril_Shpritz

Несколько cpu между собой, и чипсетом общаются через QuickPathInterconnect,

но почему контроллер памяти обращается к контроллеру PCIe если он контролирует внешнуюю память ? Quick Path такой quick :)

anonymous
()
Ответ на: комментарий от anonymous

С какого хера I/O request выполняет контроллер внешней памяти ? посмотри вафля на процессоры с DDIO - там вообще к контроллеру памяти нет обращений, чтение напрямую с LLC.

anonymous
()

Разрешите маленько вмешаться (просто приходилось разрабатывать PCIe девайсы).

Дело в том, что PCI-e, строго говоря, это вообще не шина (в том понимании, что обычно называют шиной). Это последовательный интерфейс и он больше похож на сеть, по которой рассылаются пакеты данных, если сравнивать грубо.

У девайсов есть адреса. Система адресов древовидная (т.е. каждый узел с адресом x может содержать подузлы x.y1, x.y2 ... x.yN, которые будут адресоваться через него (нечто вроде роутера), каждый подузел тоже может иметь свои дочерние узлы, и так далее. В реальной практике юзерские девайсы обычно представляют один уровень адресации и не имеют дочерних узлов на борту, но в архитектуре это заложено. Родительский девайс перенаправляет пакеты дочерним девайсам, согласно адресам, как в сети. На этапе регистрации девайсы заявляют о себе и получают адреса. Родитель может что-то знать о своих дочерних узлах и как-то их упорядочивать.

Обмен идёт через пакеты и все адреса (это могут быть адреса девайса или физические адреса в памяти для работы с IO) и данные находятся внутри пакета. Подробно про формат пакетов можно почитать, например, здесь: http://xillybus.com/tutorials/pci-express-tlp-pcie-primer-tutorial-guide-1

Как-то так, если упрощённо.

Iron_Bug ★★★★★
()

Ещё дополнение: все операции по передаче больших объёмов - это DMA-трансферы, когда за один burst прогоняется большое количество данных. При этом шина занята и другие девайсы ждут. Вообще говоря, если девайс не завершил операцию нормально и не отпустил шину - всё зависает и система перестаёт реагировать на любые сигналы от внешних устройств. Мы на такое насмотрелись при отладке. При инициализации, если требуется работа с памятью, девайс получает прямые физические адреса буфера для записи. Обычно их задаёт драйвер. И когда начинается трансфер девайс пишет данные без вмешательства процессора. Весь контроль границ адресов - на самом девайсе.

Iron_Bug ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.