Linux Kernel (Ядро линукса) (часть 2)


Когерентность КЭШа

Архитектура системы не обязательно предлагает протокол когерентности между аппаратным кэшем и схемами DMA на аппаратном уровне, поэтому вспомогательные функции DMA должны принимать во внимание аппаратный кэш при реализации операции отображения. Чтобы понять, почему это так, предположим, что драйвер устройства заполняет буфер некоторыми данными и затем немедленно выдает устройству команду на чтение этих данных с использованием прямого доступа к памяти. Если схема DMA обратится к физическим ячейкам оперативной памяти, но соответствующие строки аппаратного кэша еще не будут записаны в оперативную память, то устройство прочитает старое содержимое буфера памяти.

Разработчики драйверов могут обращаться с DMA-буферами двумя разными способами, пользуясь двумя разными классами вспомогательных функций. Употребляя терминологию Linux, можно сказать, что разработчик выбирает между типами отображения прямого доступа к памяти:
- когерентное отображение — когда задействован этот тип отображения, ядро гарантирует отсутствие проблем когерентности кэша при взаимодействии памяти и аппаратного устройства. Это означает, что каждая операция записи в память, выполненная центральным процессором, немедленно становится видимой аппаратному устройству, и наоборот. Такой тип отображения еще называется синхронным, или согласованным;
- потоковое отображение — при этом типе отображения драйвер устройства должен позаботиться о когерентности кэша, используя вспомогательные функции синхронизации. Такой тип отображения называется также асинхронным, или не когерентным.

При использовании прямого доступа к памяти в архитектуре 80x86 проблемы когерентности кэша никогда не возникают. Дело в том, что устройства сами следят за обращениями к аппаратным кэшам. Поэтому драйвер устройства, разработанный специально под архитектуру 80x86, может выбрать любой из двух типов DMA-отображения: здесь они равноценны. С другой стороны, во многих архитектурах (например, MIPS, SPARC и в некоторых моделях PowerPC) устройства не всегда отслеживают аппаратные кэши, и проблемы когерентности имеют место. Вообще правильный выбор типа отображения
прямого доступа к памяти для архитектурно-независимого драйвера является нетривиальной задачей.

В качестве общего правила, можно сказать, что, если центральный процессор и процессор DMA обращаются к буферу непредсказуемым образом, следует обязательно выбирать когерентное отображение (пример — буферы для командных структур адаптеров SCSI). В других случаях потоковое отображение прямого доступа к памяти предпочтительнее, поскольку в некоторых архитектурах когерентное отображение громоздко и может понизить производительность системы.

Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

Linux Kernel (Ядро линукса) (ч...

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть...

Linux Kernel (Ядро линукса) (ч...

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

Linux Kernel (Ядро линукса) (ч...

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...