Интерфейс PCI Express
ВВЕДЕНИЕ
Возможностей шины PCI вполне достаточно для большинства современных приложений, однако потребность в ускорении ввода-вывода постепенно дезорганизует некогда стройную внутреннюю архитектуру ПК. Суть проблемы заключается в том, что со временем появляется все больше устройств ввода-вывода, требования по быстродействию которых не соответствуют возможностям шины PCI. Разгон тактовой частоты шины - далеко не лучшее решение, поскольку только усугубляет перекос шины, перекрестные помехи между проводниками и емкостное сопротивление. При появлении каждого нового устройства, которое оказывается слишком быстрым для шины PCI (будь то графический адаптер, жесткий диск, сетевой контроллер и т. д.), разработчикам Intel приходится создавать очередной специализированный порт, с помощью которого мост позволяет этому устройству обходить шину PCI. Естественно, такое решение с каждым прецедентом становится все менее эффективным.
Сейчас предлагается несколько вариантов решения указанных проблем, но, скорее всего, победителем в конкурентной борьбе окажется технология PCI Express, которую активно продвигает Intel. Несмотря на название, она не имеет почти ничего общего с шиной PCI; более того - это вообще не шина. Тем не менее маркетологи решили не избавляться от названия "РСI" - благо, оно у всех на слуху. Некоторые ПК уже сейчас поддерживают эту технологию. Посмотрим, что она собой представляет.
1 Структура интерфейса
Суть технологии PCI Express заключается в замене параллельной шины с ее многообразием задающих и подчиненных устройств высокоскоростными двухточечными последовательными соединениями. Это решение знаменует собой окончательный отход от шинной топологии, реализованной в шинах ISA/EISA/PCI, и переход на топологию локальных сетей (особенно коммутируемых сетей Ethernet). Основная идея такова: по сути, ПК - это набор микросхем процессора, памяти и устройств ввода-вывода, которые необходимо соединить между собой. С учетом этого обстоятельства PCI Express выполняет роль универсального коммутатора, соединяющего микросхемы по последовательным каналам. Стандартная конфигурация PCI Express изображена на рисунке 1.
Рисунок 1 - Стандартная компоновка системы PCI Express
Как видно из рисунка, процессор, память и кэш подключены к мосту традиционным способом. Новым элементом здесь является подключенный к мосту коммутатор (иногда он встраивается непосредственно в микросхему моста). Между каждой микросхемой устройства ввода-вывода, с одной стороны, и коммутатором, с другой, устанавливается двухточечное соединение. Любое такое соединение состоит из двух однонаправленных каналов - по одному в каждом из направлений между устройством и коммутатором. Каналы состоят из двух проводов (сигнального и заземляющего), что обеспечивает высокую помехозащищенность в ходе высокоскоростной передачи сигналов. Такая архитектура отличается от предыдущей большей унификацией и равноправием всех устройств.
Три основных момента отличают архитектуру PCI Express от архитектуры PCI. Два из них мы уже рассмотрели - это наличие централизованного коммутатора, пришедшего на смену принципу многоотводной шины, и применение узких последовательных двухточечных соединений вместо широкой параллельной шины. Третье отличие меньше бросается в глаза. Концептуальная модель, на которой основана шина PCI, сводится к тому, что задающее устройство шины передает подчиненным устройствам команды на чтение слова или блока из нескольких слов. PCI Express основывается на другом принципе, предусматривающем отправку пакетов данных от одного устройства другому. Понятие пакета, состоящего из заголовка и полезной нагрузки, заимствовано из сетевых технологий. В заголовке содержится управляющая информация, а значит, отпадает потребность в многочисленных управляющих сигналах, которые играют важную роль при передаче по шине PCL Полезная нагрузка содержит непосредственно передаваемые данные. Таким образом, ПК, поддерживающий технологию PCI Express, напоминает сеть с коммутацией пакетов в миниатюре.
Помимо вышеперечисленных
1.1 Стек протоколов
Следуя модели сети с коммутацией пакетов, технология PCI Express реализуется на основе многоуровневого стека протоколов. Протоколом называется набор правил, определяющих механизм взаимодействия между двумя сторонами. Соответственно, стек протоколов - это иерархическая система протоколов, которые регламентируют различные аспекты взаимодействия на тех или иных уровнях. Рассмотрим для примера деловое письмо. Существуют определенные соглашения о местоположении и содержании шапки письма, адреса получателя, даты, формы приветствия, тела письма, подписей и т. д. Все эти условности можно обобщенно назвать протоколом делового письма. Помимо этого, есть стандарты, касающиеся размера и формата конверта, размещения штампа и тому подобных тонкостей. Эти два уровня и соответствующие протоколы независимы друг от друга. К примеру, можно полностью изменить формат письма, положив его в стандартный конверт, и наоборот. Подобные многоуровневые протоколы, которые делают возможной модульную разработку с высоким уровнем гибкости, уже несколько десятилетий широко применяются в области сетевого ПО. В технологии PCI Express сделана попытка реализовать их в аппаратном обеспечении "шины".
Стек протоколов PCI Express изображен на рисунке 2 а.
Рисунок 2 - Стек протоколов PCI Express (а); формат пакета (б)
1.2 Физический уровень
Рассмотрим уровни по восходящей. Самым нижним является физический уровень (рисунок 3). Его можно разделить на два подуровня: подуровень физического доступа к среде передачи данных (Physical Media Attachment Layer, PMA) и подуровень физического кодирования (Physical Coding Sublayer, PCS).
Рисунок 3 - Физический уровень шины PCI Express
На физическом уровне линия PCI Express представляет собой две низковольтные дифференциальные пары проводов. Использование именно низковольтных дифференциальных сигналов (когда уровень сигнала в одном проводе измеряется относительно уровня сигнала в другом проводе) позволяет уменьшить влияние электромагнитных помех. Кроме того, с целью увеличения помехоустойчивости при передаче используется кодирование 8b/10b, которое производится на подуровне PCS.
Смысл такого кодирования достаточно прост — каждая последовательность 8 бит при передаче (рис. 3.1) заменяется последовательностью 10 бит в соответствии со специальной таблицей замены. При этом в исходной последовательности 8 бит содержится 256 различных комбинаций нулей и единиц, а в результирующей — 1024. Данный подход позволяет избежать нежелательных последовательностей бит при передаче. Например, длинные последовательности логических нулей или единиц приводят к потере синхронизации. В результирующей последовательности можно отобрать комбинации (всего потребуется 256 комбинаций из 1024), в которых не встречаются длинные последовательности нулей и единиц — это приведет к улучшению самосинхронизирующих свойств кода. Кроме того, не все комбинации считаются разрешенными при передаче — обнаружение запрещенной последовательности при приеме трактуется как наличие ошибки. Таким образом, избыточное кодирование позволяет приемнику распознавать ошибки.
Рисунок 3.1 - Преобразование данных на
физическом уровне при передаче данных
Подуровень физического кодирования связан по 16-битному интерфейсу с верхним уровнем доступа к среде передачи данных (Media Access Level, MAC). Поэтому первоначально полученные по параллельному 16-битному интерфейсу данные разбиваются на группы по 8 бит, то есть частично сериализуются. Частота параллельного 16-битного интерфейса составляет 125 МГц, а после преобразования к 8-битному параллельному интерфейсу частота шины становится уже 250 МГц. После этого данные подвергаются кодированию 8b/10b и уже по 10-битному параллельному интерфейсу поступают на подуровень PMA, где преобразуются к последовательному типу и передаются непосредственно по линии связи, но уже на частоте 2,5 ГГц.
При приеме (рисунок 3.2) данные на физическом уровне претерпевают обратный порядок преобразования, то есть первоначально данные с частотой 2,5 ГГц поступают в дифференциальный приемник, после чего преобразуются к параллельному 10-битному интерфейсу. По этому интерфейсу данные, уже с частотой 250 МГц, подвергаются декодированию 10b/8b и по 8-битному интерфейсу поступают в блок преобразования к параллельному 16-битному типу. По 16-битной шине с частотой 125 МГц данные передаются на верхние уровни.
Рисунок 3.2 - Преобразование данных
на физическом уровне при приеме данных
В случае когда используется не одна
линия для передачи данных, то есть
при организации
Рисунок 3.4 - Организация шины PCI Express при наличии
нескольких магистральных
1.3 Канальный уровень
Отвечает за передачу пакетов. На этом уровне к заголовку и полезной нагрузке, переданным с уровня транзакций, добавляется порядковый номер и код исправления ошибок - так называемый CRC (Cyclic Redundancy Check - циклический контроль избыточности). CRC-код генерируется путем выполнения определенного алгоритма в отношении заголовка и полезной нагрузки. По получении пакета устройство проводит аналогичные вычисления с заголовком и данными и сравнивает результат с величиной, указанной в пакете. Если два результата совпадают, первоначальному отправителю отсылается пакет подтверждения правильности полученных данных. В противном случае получатель делает запрос на повторную передачу. Таким образом, значительно повышаются показатели целостности данных по сравнению с шиной PCI, в которой не реализованы средства контроля и повторной передачи данных.
Во избежание перегрузки медленного получателя пакетами, исходящими от быстрого отправителя, реализуется механизм управления
потоками. Этот механизм основывается
на выдаче получателем
1.4 Уровень транзакций
На этом уровне выполняются все операции шины. К примеру, для считывания слова из памяти нужно выполнить две транзакции, из которых одну инициирует процессор или канал DMA, запрашивающий данные, другую - целевой объект (поставщик данных). Впрочем, чтение и запись - не единственные операции, которые выполняются на уровне транзакций. Этот уровень, в частности, расширяет возможности передачи пакетов, предоставляемые канальным уровнем. Каждая полоса на уровне каналов подразделяется на несколько (до восьми) виртуальных каналов, по каждому из которых передаются данные того или иного типа. На уровне транзакций пакеты маркируются согласно классу трафика, определяющему ряд свойств, таких как "высокий приоритет", "низкий приоритет", "запрет слежения", "допускается доставка вне последовательности" и т. д. Выстраивая порядок обработки пакетов, коммутатор, помимо прочего, основывается на информации из маркеров.
Любая транзакция проходит в одном из четырех адресных пространств:
- пространство памяти (при выполнении стандартных операций чтения и записи);
- пространство ввода-вывода (для адресации регистров устройств);
- конфигурационное пространство (для инициализации системы и т
. д.); - пространство сообщений (для отправки сигналов, прерываний и т. д.).
Пространства памяти и ввода-вывода
аналогичны традиционным тем, что
реализованы в современных
1.5 Программный уровень
Выступает посредником между PCI Express и операционной системой. Помимо прочего, на нем предусмотрен режим эмуляции шины PCI, позволяющий устанавливать в компьютерах, оснащенных PCI Express, старые операционные системы без каких-либо изменений. Естественно, при работе в таких условиях реализация всех возможностей PCI Express невозможна, однако обеспечение обратной совместимости является необходимой мерой - по крайней мере, до того момента, пока во всех операционных системах не будет полностью реализована поддержка PCI Express. Опыт показывает, что этот процесс займет немало времени.
Информационный поток, характерный для PCI Express, иллюстрирует рисунок 2.б. Команда, поступающая на программный уровень, передается на уровень транзакций, где из нее формируются заголовок и полезная нагрузка. Затем эти компоненты отправляются на канальный уровень, на котором в заголовке пакета устанавливается порядковый номер, а в хвостовике - CRC-код. Далее этот расширенный пакет передается на физический уровень, где с обоих концов к нему добавляются параметры кадра, и получившийся в результате физический пакет передается от отправителя получателю. На стороне получателя происходит обратный процесс - заголовок и хвостовик кадра канального уровня удаляются, а результат передается на уровень транзакций.
Схема, согласно которой на каждом последующем уровне стека протоколов к исходному набору прибавляются дополнительные данные, применяется в компьютерных сетях уже очень долго и успешно. Основное различие между сетевыми технологиями и PCI Express заключается в том, что в первом случае код, действующий на различных уровнях стека, почти всегда является программным и управляется операционной системой. В PCI Express, напротив, операции на всех уровнях реализуются аппаратно.
2 Описание протокола
Для подключения устройства PCI Express используется двунаправленное последовательное соединение типа точка-точка, называемое линией (англ. lane — полоса, ряд); это резко отличается от PCI, в которой все устройства подключаются к общей 32-разрядной параллельной двунаправленной шине.
Соединение
(англ. link — связь, соединение) между
двумя устройствами PCI Express состоит
из одной (x1) или нескольких (x2, x4, x8, x12,
x16 и x32) двунаправленных
На электрическом уровне каждое соединение использует низковольтную дифференциальную передачу сигнала (LVDS), приём и передача информации производится каждым устройством PCI Express по отдельным двум проводникам, таким образом, в простейшем случае, устройство подключается к коммутатору PCI Express всего лишь четырьмя проводниками.
Использование
подобного подхода имеет
- карта PCI Express помещается и корректно работает в любом слоте той же или большей пропускной способности (например, карта x1 будет работать в слотах x4 и x16);
- слот большего физического размера может использовать не все линии (например, к слоту x16 можно подвести проводники передачи информации, соответствующие x1 или x8, и всё это будет нормально функционировать; однако, при этом необходимо подключить все проводники питания и заземления, необходимые для слота x16).
В обоих случаях, на шине PCI Express будет использоваться максимальное количество линий, доступных как для карты, так и для слота. Однако это не позволяет устройству работать в слоте, предназначенном для карт с меньшей пропускной способностью шины PCI Express. Например, карта x4 физически не поместится в стандартный слот x1, несмотря на то, что она могла бы работать в слоте x1 с использованием только одной линии. На некоторых материнских платах можно встретить нестандартные слоты x1 и x4, у которых отсутствует крайняя перегородка, таким образом, в них можно устанавливать карты большей длины, чем разъем. При этом не обеспечивается питание и заземление выступающей части карты, что может привести к различным проблемам.
PCI Express пересылает всю управляющую информацию, включая прерывания, через те же линии, что используются для передачи данных. Последовательный протокол никогда не может быть заблокирован, таким образом задержки шины PCI Express вполне сравнимы с таковыми для шины PCI (заметим, что шина PCI для передачи сигнала о запросе на прерывание использует отдельные физические линии IRQ#A, IRQ#B, IRQ#C, IRQ#D).
Во всех высокоскоростных последовательных протоколах (например, гигабитный Ethernet), информация о синхронизации должна быть встроена в передаваемый сигнал. На физическом уровне, PCI Express использует метод канального кодирования 8b/10b (8 бит в десяти, избыточность — 20%) для устранения постоянной составляющей в передаваемом сигнале и для встраивания информации о синхронизации в поток данных. В PCI Express 3.0 используется более экономное кодирование 128b/130b с избыточностью 1,5%.
Рисунок 4 - Видеокарта для PCI Express x16
3 Транзакция интерфейса
Устройство, начинающее транзакцию, называется запросчиком. Устройство, завершающее транзакцию, называется комплитором. Как запросчиком, так и комплитором при выполнении различных транзакций может служить как корневой комплекс, так и любая конечная точка. Топология связей в интерфейсе - древовидная (рисунок 5).
Рисунок 5 - Топология связей PCI Express
Битовая скорость передачи информации в канале равна:
· 0,5 Гбайт/с (2,5 Гбит/с ´ 2 = 5 Гбит/с = 0,5 Гбайт/с) при использовании 2 витых пар на канал (´1);
· 1 Гбайт/с (2,5 Гбит/с ´ 4 = 10 Гбит/с = 1 Гбайт/с) при использовании 4 витых пар на канал (´2);
· 2 Гбайт/с (2,5 Гбит/с ´ 8 = 20 Гбит/с = 2 Гбайт/с) при использовании 8 витых пар на канал (´4);
· 4 Гбайт/с (2,5 Гбит/с ´ 16 = 40 Гбит/с = 4 Гбайт/с) при использовании 16 витых пар на канал (´8);
· 6 Гбайт/с (2,5 Гбит/с ´ 12 = 60 Гбит/с = 6 Гбайт/с) при использовании 24 витых пар на канал (´12);
· 8 Гбайт/с (2,5 Гбит/с ´ 32 = 80 Гбит/с = 8 Гбайт/с) при использовании 32 витых пар на канал (´16);
· 16 Гбайт/с (2,5 Гбит/с ´ 64 = 160 Гбит/с = 16 Гбайт/с) при использовании 64 витых пар на канал (´32).
Транзакция в интерфейсе PCI-XP определяется как последовательность нескольких (в частном случае одной) передач пакетов информации между запросчиком и комплитором. В качестве запросчика могут выступать и корневой комплекс, и конечная точка. В качестве комплитора могут выступать и корневой комплекс, и конечная точка, и переключатели, и мосты.
Последовательность пакетов
Различают непочтовые и почтовые типы транзакции. В непочтовых транзакциях запросчик передает пакет-запрос комплитору. В ответ комплитор посылает пакет-завершение (в общем случае пакеты-завершения) запросчику, которые содержат уведомление о получении пакета-запроса. В дополнение пакет-завершение в транзакции чтения содержит запрашиваемые данные. В транзакции записи данные содержатся в пакете-запросе. В почтовых транзакциях запросчик лишь передает пакет-запрос комплитору.
Все транзакции делятся на 5 категорий. В таблице 1 приведены категории и типы транзакций, а также типы пакетов, их образующих.
Таблица 1 – Типы Транзакций PCI Express
Категории транзакций |
Транзакция |
Тип транзакции |
Запросчик |
Комплитор |
Пакет-запрос (тип пакета) |
Пакет-завершение (тип пакета) |
Транзакции памяти |
Чтение памяти |
Непочтовая |
Корневой комплекс, конечная точка |
Корневой комплекс, конечная точка, переключатель, мост |
MRd (00000) |
CplD (01010) Или Cpl (01010) |
Запись памяти |
Почтовая |
Корневой комплекс, конечная точка |
Корневой комплекс, конечная точка |
MWr (00000) |
- | |
Чтение памяти с блокировкой |
Непочтовая |
Корневой комплекс |
Традиционная конечная точка |
MRdLk (00001) |
CplDLk (01011); CplLk (01011) | |
Продолжение Таблицы 1 | ||||||
Чтение I/O |
Непочтовая |
Корневой комплекс, конечная точка |
Корневой комплекс, конечная точка, переключатель, мост |
IORd (00010) |
CplD (01010) Cpl (01010) | |
Транзакции устройств ввода/ вывода |
Запись I/O |
Непочтовая |
Корневой комплекс, конечная точка |
Корневой комплекс, конечная точка, переключатель, мост |
IOWr (00010) |
Cpl (01010) |
Транзакции конфигурации |
Конфигурационное чтение (тип 0 и тип 1) |
Непочтовая |
Корневой комплекс |
Корневой комплекс, конечная точка, переключатель, мост |
CfgRd0 (00100); CfgRd1 (00101) |
CplD (01010) или Cpl (01010) |
Конфигурационная запись (тип 0 и тип 1) |
Непочтовая |
Корневой комплекс |
Корневой комплекс, конечная точка, переключатель, мост |
CfgWr0 (00100); CfgWr1 (00101) |
CplD (01010) Или Cpl (01010) CplDLk (01011) Или CplLk (01011) | |
Транзакции сообщений |
Сообщение |
Почтовая |
Корневой комплекс, конечная точка |
Корневой комплекс, конечная точка |
Msg (10RRR); MsgD (10RRR) |
- |
4 Алгоритм реализации PCI Express
Шина PCI Express поддерживает ряд обязательных (таблица 2) и ряд факультативных сигналов (таблица 3). Оставшиеся выводы используются для питания, земли и разнообразных сопутствующих сигналов. В столбцах "Задающее устройство" и "Подчиненное устройство" указывается, какое из устройств устанавливает сигнал при обычной транзакции. Если сигнал устанавливается другим устройством (например, CLK), оба столбца остаются пустыми.
Таблица 2 – Обязательные сигналы PCI Express
Таблица 3 – Факультативные сигналы PCI Express
Сигнал CLK запускает шину. Большинство сигналов совпадают с ним во времени. В отличие от шины ISA, в шине PCI Express транзакция начинается на спаде сигнала CLK, то есть не в начале цикла, а в середине.
Сигналы AD (их 32) нужны для адресов и данных (для передач по 32 бита). Обычно адрес устанавливается во время первого цикла, а данные - во время третьего. Сигнал PAR - это бит четности для сигнала AD. Сигнал С/ВЕ# выполняет две функции. Во время первого цикла он содержит команду (считать одно слово, считать блок и т. п.). Во время второго цикла он содержит массив размером 4 бита, который показывает, какие байты 32-разрядного слова действительны. Использовав сигнал С/ВЕ#, можно считать 1, 2 или 3 байта из слова, а также все слово целиком.
Сигнал FRAME# устанавливается задающим устройством, чтобы начать транзакцию. Этот сигнал сообщает подчиненному устройству, что адрес и команды в данный момент действительны. При чтении одновременно с сигналом FRAME# устанавливается сигнал IRDY#. Он сообщает, что задающее устройство готово принять данные. При записи сигнал IRDY# устанавливается позже, когда данные уже переданы в шину.
Сигнал IDSEL связан с тем, что у каждого устройства шины должно быть конфигурационное пространство на 256 байт, которое другие устройства могут считывать (установив сигнал IDSEL). Это конфигурационное пространство содержит характеристики устройства. В некоторых операционных системах механизм автоматического конфигурирования (Plug and Play, РпР) использует это пространство, чтобы выяснить, какие устройства подключены к шине.
А теперь рассмотрим сигналы, которые устанавливаются подчиненным устройством. Сигнал DEVSEL# означает, что подчиненное устройство распознало свой адрес на линиях AD и готово участвовать в транзакции. Если сигнал DEVSEL# не поступает в течение определенного промежутка времени, задающее устройство предполагает, что подчиненное устройство, к которому направлено обращение, либо отсутствует, либо неисправно.
Следующий сигнал - TRDY#. Его подчиненное устройство устанавливает при чтении, чтобы сообщить, что данные находятся на линиях AD, и при записи, чтобы сообщить, что оно готово принять данные.
Следующие три сигнала требуются для передачи сообщений об ошибках. Один из них, сигнал STOP#, устанавливается подчиненным устройством, если произошла какая-нибудь неполадка и нужно прервать текущую транзакцию. Следующий сигнал, PERR#, используется для сообщения об ошибке четности в данных на предыдущем цикле. Для чтения этот сигнал устанавливается задающим устройством, для записи - подчиненным устройством. Необходимые действия должно предпринимать устройство, получившее этот сигнал. Наконец, сигнал SERR# служит для сообщения об адресных и системных ошибках.
Сигналы REQ# и GNT# предназначены для арбитража шины. Они устанавливаются не тем устройством, которое является задающим в данный момент, а тем, которому нужно стать задающим. Последний обязательный сигнал, RST#, применяется для перезагрузки системы, которая происходит, либо если пользователь нажимает кнопку RESET, либо если какое-нибудь системное устройство обнаруживает фатальную ошибку. После установки этого сигнала компьютер перезагружается.
Перейдем к факультативным сигналам, большинство из которых связано с расширением разрядности с 32 до 64 бит. Сигналы REQ64# и АСК 64# позволяют задающему устройству попросить разрешение осуществить 64-разрядную транзакцию, а подчиненному устройству принять эту транзакцию. Сигналы AD, PAR64 и С/ВЕ# являются расширениями соответствующих 32-разрядных сигналов.
Следующие три сигнала не связаны с переходом с 32 на 64 бита. Они используются в многопроцессорных системах. Не все платы PCI поддерживают такие системы, поэтому эти сигналы являются факультативными. Сигнал LOCK позволяет блокировать шину для параллельных транзакций. Следующие два сигнала связаны с фазой слежения, позволяющей сохранить согласованность кэшей разных процессоров.
Сигналы INTx нужны для запроса прерываний. Плата PCI может содержать до четырех логических устройств, каждое из которых имеет собственную линию.
Шина PCI E в действительности очень проста. Чтобы лучше понять это, рассмотрим рисунок 6. Здесь мы видим транзакцию чтения, за ней следуют пустой цикл и транзакция записи, которая осуществляется тем же задающим устройством.
Рисунок 6 – Транзакция на шине PCI Express
Во время цикла Т{ на спаде
синхронизирующего сигнала
Во время цикла Т2 задающее устройство переключает шину, чтобы подчиненное устройство могло воспользоваться ею во время цикла Т3. Задающее устройство также изменяет сигнал С/ВЕ#, чтобы указать, какие байты в слове ему нужно считать.

- Интерфейс USB 3.0
- Интерфейс и функциональные возможности редактора GIMP
- Интерфейс периферийных устройств PSI PSI exspress
- Интерфейс приложений DirectX и графическая библиотека OpenGL
- Интерфейс туралы түсінік
- Интерфейсы компьютерных систем.Аптека
- Интерфейсы современных компьютеров. Виды, типы, характеристики
- Интерпретация права: понятия и способы толкования
- Интертекст в произведении Код да Винчи
- Интертекст в рекламном дискурсе
- Интертекстуальность в произведении "Евгений Онегин"
- Интертекстуальность в романе Джона Фаулза «Коллекционер»
- Интертекстуальные элементы в романе Фаулза Коллекционер
- Интерфейс CAN