Спецификация AHCI
У меня есть вопрос относительно спецификации AHCI:
Переменная pDmaXferCnt
в порту, используемом при передаче данных DMA для записи или чтения?
Описание в спецификации, кажется, указывает, что это не так, но вместо этого используются PRD. Но как HBA узнает, сколько данных нужно отправить или получить на / с устройства SATA? Эта информация будет доступна в подсчете секторов FIS H2D, но если я не пропустил ее, то, похоже, не существует регистра переменной, содержащей это значение. DX:transmit
государство также, кажется, указывает на то, что pDmaXferCnt
будет иметь установленное значение, но я не могу видеть, где он будет установлен для операции чтения / записи DMA.
Спасибо
1 ответ
Из спецификации: "Замечание по реализации: переменные состояния HBA используются для описания требуемого внешне видимого поведения. Реализациям не требуется иметь внутренние значения состояния, которые непосредственно соответствуют этим переменным". - означает, что вы (возможно) не найдете pDmaXferCnt внешне в реестре.
Есть и другой способ отследить счет.
В разделе "Использование пространства памяти HBA" спецификации AHCI имеются структуры данных списка команд (список заголовков команд) и таблицы команд (на которые указывает заголовок команды, каждая таблица команд представляет собой команду для отправки). Они оба доступны для HBA.
В заголовке команды в DW0 указывается PRDTL, который подсчитывает, сколько PRD будет использовано при передаче.
Теперь в фактической таблице команд, на которую указывает заголовок команды, содержатся фактические PRD, в каждом PRD содержится их собственный DBC или счетчик байтов данных (количество данных в байтах, которое должно быть DMA в месте, указанном в DBA). Таким образом, если вы возьмете каждый из PRD *, в котором есть свои DBC, и сложите их, вы получите объем данных для передачи.
В качестве альтернативы в заголовке команды DW1 находится PRDBC, который является числом переданных байтов, так что вы можете проверить это после команды.
HBA - хост-адаптер шины
PRDTL - длина таблицы дескрипторов физической области
PRD - дескриптор физического региона (отслеживает, куда в физической памяти и количестве байтов следует передавать)
DBC - количество байтов данных (внутри PRD)
DBA - адрес базы данных (физический адрес внутри PRD)
PRDBC - количество байтов дескриптора физической области
DMA - прямой доступ к памяти
Для получения дополнительной информации: http://www.intel.com/content/www/us/en/io/serial-ata/serial-ata-ahci-spec-rev1-3-1.html