Лекция 5 (2012-11-12)

Взаимодействие с периферией. PCIe.

Небольшая перестановка в плане курса.

Сегодняшняя тема -- периферия.

На предыдущей лекции был рассказ про память. Перескажем ее минут за 5.

Различают

Было рассмотрено взаимодействие процессора и памяти. Кэши инструкций. Блок MMU -- аппаратная поддержка виртуальной адресации (преобразование виртуальных адресов в физические). Чтобы это преобразование работало сколь либо эффективно, т.к. это страничная организация памяти, при адресации нескольких гигабайт страниц миллионы, хранение в виде линейной структуры не способствует эффективности поиска, поэтому используется иерархическая структура. Чтобы это работало эффективно используется TLB -- это тот же кэш, но обычно с полной ассоциативностью, его так же может быть несколько уровней.

Перифeрия

Нам бы хорошо бы взаимодействовать с внешним миром.

periphery_scheme.jpg

Есть периферийный устройства. Взаимодействие происходит различными способами

Все упирается в физический уровень

Параллельные интерфейсы были популярны по двум причинам

Но возникала проблема -- выравнивание дорожек. 8 выровнять ещё можно, то 100 уже печально, особенно если разные устройства висят на одной шине. Пример перехода от грустно к чуть менее грустно это эволюция от ISA до PCI Express. В х86 это основной интерфейс, подключенный непосредственно к процессору. Их может быть несколько, последовательный порт, параллельный порт, но все остальные интерфейсы глобально и надежно периферия кард интерконнект. PCI (Perepherical Card Interconnect). До этого были (E) ISA. Первоначально ISA Это Industrial Standart ARchitecture. Была 8-битная шина, устройства подключались последовательно, позволяли передавать данные. В основном управлялось портами ввода-вывода. Потом появилось возможность управления, потом стала 16-битной, но это все совсем страшное легаси, хотя и до сих пор встречается. А потом появилась 32-разрядная PCI. Схема. В стандарте можно было иметь до 8 шин на каждой по 10 устройств. Много устройств на одной шине -- проводов меньше, но работает со скоростью самого медленного устройства. Выход несколько шин, но это требует пропорционального количества проводов.

Оснавная идея шины PCI достаточно простая. Хотим преимущественно читать или писать. Есть мастер, есть таргет, мастер может читать или передавать данные бёрстами. Шина 32-разрядная. Есть 32 бита данных, есть 32 бита на адрес и есть пачка служебных сигналов. Схема. Сигналы addr [0..31], data[0..31], clk, trdy, irdy, select, frame, devsel, jtag [0..4], etc. Шина PCI жила несколько дольше чем хотелось бы. Есть некий арбитр, который говорит, ты можешь что-то поделать (выставляется сигнал REQ) Пары req gnt заводились на каждый арбитр (каждое устройство) независимо. Когда устройство хотело что-то передать оно посылало REQ, потом поднимало бит адреса, получало сигнал, каждый знал свой диапазон адресов и соответственно отвечал, после чего начиналась собственно передача. Тактировалось по внешнему клоку. Клок мог иметь довольно произвольную частоту. Тот кто им управлял мог его полностью остановить. Изначально диапазон был 16-33Мгц до полной остановки, потом ограничение снизу сняли. Это частота и ширина 32 бита давали не очень большую скорость. Это повлекло расширение PCI -- до 64 бит, потом ещё было расширение до 66 мегагерц, в PCIx ещё в 2 раза частоту разогнали, что давало аж до Гб/сек, но это все было дорого. Поэтому произошел переход на шину PCI Express, тогда же примерно произошел переход от параллельного ата к последовательному.

PCIe

Достаточно интересный стандарт -- PCI Express. 3-я версия около 800 страниц. У стандарта PCI все было скромнее -- 200-300 страниц. PCI во многом определяет электромеханические особенности работы, это довольно значительная часть протокола. В противоположность этому в стандарте PCI экспресс гораздо больше уходит на логику.
pcie_1.jpg
В PCIe несколько лэйеров

У PCIe 3 версии

Это очень красивые чиселки. Если у вас 16 лэйнов, то 16*8 это 16 гигабайт в секунду в одну сторону, очень много. Скоро ещё удвоят.

Если говорить более предметно, то PCIe определяет некоторую топологию устройств PCIe root complex -- некое устройство, с одной стороны корень иерархии, с другой стороны взаимодействует с хостом, преимущественно с его памятью. Далее топология имеет древовидную структуру, есть энд-пойнт девайсы, есть свитчи, есть всякие бриджи на PCI, которые могут подключать PCI устройства и обеспечивать интероперабельность между PCIe и PCI устройствами.
pcie_2.jpg
Есть некие сообщения которыми устройства обмениваются между собой. Чаще всего ендпойнт обмениваетс с хостом, или еп с еп. Есть ещё отдельно флоуконтрол.

Продолжение идеи PCI что отдельно выполняются запись и чтение. Посылается сообщение что происходит операция с такой то памятью. Сообщения имеют размер кратный DWORD (32 Бита). Есть префикс для служебной информации. Основная идея что у нас есть хедер, который имеет размер 2 дворда, определяет тип и разлиные характеристики, например таргет. В зависимости от типа определяется формат и размер заголовка.
pcie_3.jpg

pcie_4.jpg

pcie_5.jpg
Бывают операции, операций довольно много. Можно выделить 4 блока

В PCIe появилось более продвинутое Message Signal Interupr -- MSIx, проверяет до 4 тысяч. Немножко разный формат сообщений.

На уровне Transation Layer Protocol определены правила формирования транзакций, возможности по реордерингу, что делать если вы не умеет обрабатывать такой тип. Не одна сотня страниц посвящена тому, как рут комплекс должен обрабатывать разные типы сообщений.

На Datlink Layer Protocol добавляется чексумма транзакции (32 бита в концу) и 16 бит в начале -- номер транзакции для флоп контролл(?). Ожидается, что на этом уровне сообщения идут последовательно, если после н приходит н+2 вы по обратному каналу это сообщаете. Идея в том, что определяется закон обратной доставки и определяются кредиты для флопп контролл. В конце сообщается сколько места в буфере осталось под головы и вообще. Обеспечиваете, то не произойдет денайал оф сервис, а другая сторона будет ждать пока не придет достаточно кредитов чтобы продолжит передачу.

TLP добавляет маркеры конца и начала транзакций. Определяет, что должно происходить когда ничего не предается, что-то передается. В этом начинаются отличия ген3, изза другого кодирования на малых транзакциях может быть чуть похоже.

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

На этом же уровне вводится стейт машина. Есть начальное состояние, если появляется вольтаж, начинаете посылать синхропакеты, потом 2 конфиг пакета, потом линк поднялся. ???.

Это был сумбурный рассказ про PCIe. Что можно подчеркнуть. На данный момент это один из наиболее развитых способов передачи данных в малых и средних эвм, особенно в х86, а так же немного в паверах и спарках, хотя там и очень много интел специфичного, особенно в порядке байт. Основным конкурентом является гипертранспорт, который немножко умер, хотя по характеристикам и плюс-минус сопоставим.

В следующий раз про периферийные интерфейсы -- usb, firewire, sata.

LecturesCMC/ComputerArchitecture2012/Conspects/04 (последним исправлял пользователь Allena 2012-12-21 02:30:33)