![]() |
Жёсткие диски это тот раздел программирования, который покрыт мраком и тайной. Дефицит информации на эту тему накладывает свой отпечаток, и даже простое копирование больших объёмов данных может стать нетривиальной задачей. Но если копнуть глубже, оказывается не всё так плохо, и большинство базовых операций на низком уровне доступно не только админу, но и простому смертному юзеру. На практике, мифы о высоком либидо и буйном темпераменте дисков несколько преувеличены, и надеюсь данная статья поможет нам разобраться в этом. Поскольку материал получился обширным, пришлось разделить его на две части – теория и практика.
В этой части: • Общие сведения • Интерфейсы ATA/SATA • Регистры IDE-устройств • Интерфейсы SCSI/SAS • Выводы ------------------------------------------------- Общие сведения Любые накопители HDD относятся к устройствам с интегрированным контролёром. Это означает, что на материнской плате находится лишь обслуживающий шлейф шинный адаптер HBA –Host Bus Adapter, который представляет собой обычный мост для согласования шин АТА/SATA, с магистральной системной шиной PCI. А вот управляющий непосредственно диском контролёр (и его регистры) расположены уже на плате самого жёсткого диска. Такие девайсы принимают аббревиатуру IDE, или Integrated Drive Electronics. Термин-же АТА (AT Attachment for Disk Drive) уходит корнями в прошлое, когда примитивный дисковый контролёр был частью материнской платы. Нужно отметить, что подобная схема благополучно дожила и до наших дней, в виде контролёра гибких дисков Floppy-Disk-Drive (здесь в устройство заложена только механика). Таким образом, на данный момент термин АТА/IDE подразумевает дисковый накопитель со-встроенным в тело контролёром. Все IDE-устройства поддерживают только блочный обмен данным, когда мин.порцией чтения/записи является сектор размером 512 байт (4096 для Advanced-Format AF). Позже, на вооружение была принята спецификация ATAPI – ATA Packet Interface. Отличается она тем, что если в АТА команды 1-байтные (плюс ещё байт как аргумент, итого 2-байта), то в ATAPI эту команду нужно заворачивать в пакет определённой структуры CDB (Command Descriptor Block) и в таком виде отсылать уже драйверу. По сути, способ с использованием командных пакетов не нов, и для интерфейса ATAPI его слизали с древней спецификации SCSI. Как говорится, "всё новое – это хорошо забытое/старое" и ничего лучше пока придумать не могут. Главное преподнести это громко.. Для прикладных программистов SCSI открывает большие возможности, хотя и требует привилегий админа в системе. Он позволяет общаться с диском напрямую, минуя даже драйверы Win. В своё время, интерфейс был разработан специально для устройств со-встроенными контролёрами, которые считались мини-компьютерами (диски, принтеры, CD-ROM и прочие). Собственно об этом прямым текстом сообщает и аббревиатура SCSI –Small Computer Systems Interface. В наш век мы стали очевидцами преображения параллельного SCSI в достойный внимания последовательный интерфейс дисковых подсистем SAS – Serial Attached SCSI. Windows всех мастей предлагает нам свою поддержку этой технологии в виде механизма ASPI - "Advanced SCSI Programming Interface", и его расширения SPTI – "SCSI Pass-Through Interface" (сквозной вариант). Необходимые для его работы функции сосредоточены в системной библиотеке Код:
wnaspi32.dllКод:
aspi.sysНе верьте утверждениям, что из прикладного уровня у нас нет доступа к регистрам жёсткого диска – это вовсе не так! К примеру функция взаимодействия с драйверами DeviceIoControl() имеет ряд IOCTL-кодов, которым в качестве параметров передаётся структура SENDCMDINPARAMS. В этой структуре имеется вложенная структураIDEREGS, в которой и перечисляются все/восемь физических регистров контролёра HDD. Нам остаётся лишь указать в полях данных структур требуемые значения, и передать их драйверу посредством упомянутой функции. Таким-макаром мы можем посылать накопителю любые АТА-команды, список которых регламентирует спецификация под названием ACS – ATA Command Set (доступная версия вроде 4, датированная 2016 годом). Эта спека в красках расписывает каждую АТА-команду, и на несколько световых лет приблизит нас к решению задач. ИнтерфейсыATA/SATA В современной архитектуре, основной информационной артерией является параллельная шина PCI. Она объединяет буквально все внешние устройства материнской платы, и в своём зародыше была даже фронтальной шиной CPU. Разрядность 32-бита при частоте 33 МГц. Чтобы получить пропускную способность, нужно разрядность в байтах [4] умножить на частоту = 132 Мб/сек. Шина полностью оправдала надежды разработчиков и позже появились ещё несколько её версий: Версия Частота Разрядность Скорость PCI ver.2.3 66 MГц 32-бит 266 Мб/с PCI64 ver.2.3 66 MHz 64-бит 533 Мб/с PCI-Х ver.2.0 533 MHz 64-бит 4096 Мб/с Что касается теоретической пропускной способности параллельного интерфейса ATA/IDE, то она не превышает отметки в 133 Мб/сек (а в реале и того меньше, см.тест скорости в HD-Tune). Связано это с тем, что при передачи данных на более высоких частотах, сигналы на каждом из 32-х проводников начинают отставать друг-от-друга по времени, и в конечной точке приходится собирать их в буфер. А где буфер, там и тормоза. Именно поэтому инженеры перешли на последовательный интерфейс SATA, в котором шина 1-битная, зато работает она на частоте 1.5 ГГц. В результате, получаем пропускную способность 1.5 Гбит/сек =150 Мб/с. Дальше, по нарастающей мир увидел ещё две версии SATA с удвоенными частотами: SATA-1 150 Мб/с PCI ver.2.0 (Parallel) SATA-2 300 Мб/с PCI-Х ver.2.0 (Parallel) SATA-3 600 Мб/с PCI-Express (Serial) Посмотрим на рисунок ниже.. Здесь, для согласования шин ATA/SATA с транспортной жилой чипсета применяются мосты, которые играют роль интерфейсных контролёров HDD. В случае с устаревшим АТА это даже не контролёр, а простой адаптер шины. Как-правило, встроен он в мат.плату, хотя может быть и более совершенным в виде внешней платы PCI для организации RAID-массивов. АТА хост-адаптер имеет два внешних порта, которые числятся в системном пространстве под номерами Код:
1F0hКод:
170hВ отличии от АТА, хост-адаптер SATA называют уже контролёром, поскольку помимо обычного моста в него заложены и функции реального контролёра диска. Встроенный для каждого из портов отдельный UDMA, возможность захватывать PCI-шину в своё распоряжение (Bus-Mastering), а так-же отображаемые в нём физические регистры HDD, присваивают ему более высокий приоритет, по сравнению с базовым АТА-адаптером. Рисунок ниже демонстрирует сказанное: https://forum.antichat.xyz/attachmen...9e9ca941bf.png Устройства АТА/IDE соединяются с хостом посредством 80-жильного кабеля. На каждом порту могут висеть 2-устройства Master/Slave. Не смотря, что девайсов на канале два, в каждый момент времени только одно из них может использовать шину. Причиной тому способ адресации устройств, для чего выделяется всего 1-бит под названием "Device Select" (спрятан в регистре 1F6h для первого канала, и 176h для второго). Поскольку это бит, он может принимать только два значения – нуль адресует мастера, а единица перенаправляет запросы в Slave. Фактически, параллельно могут работать только два устройства на разных каналах АТА. Здесь радует то, что при работе с диском в Win, нам не нужно адресовать устройства явно, т.к. мы будем обращаться к диску по его дескриптору Handle – об остальном позаботиться уже системный драйвер. В зависимости от типа HDD, чипсет может сконфигурировать АТА хост-адаптер на работу в одном из двух режимов – оставшийся в наследство "Legacy-ATA", и типичный для современной архитектуры режим "PCI-IDE". В первом случае, обмен HDD с ОЗУ происходит только под управлением процессора и называется он PIO – Programmable I/O. Процессору приходится ждать окончания операций и в это время он не может заниматься чем-то другим. Здесь для чтения/записи секторов применяются инструкции ассемблера Код:
IN/OUTКод:
REPПоэтому ввели и второй режим работы АТА хост-адаптера - это "PCI-IDE". В нём задействуется DMA-контролёр (Direct Memory Access, прямой доступ к памяти), и вообще полностью меняется программный облик адаптера. Чипсет не может менять режимы интерфейса динамически – биос запрашивает его поддержку у диска при включении машины. В это время, процедура POST отправляет контролёру HDD запрос IDENTIFY_DEVICE, на что диск возвращает свой паспорт размером 512-байт (один сектор). Анализируя поля паспорта, биос определяет версию DMA конкретного диска и по ней выставляет режим. После того-как всё настроено, прямой обмен с памятью в режиме DMA происходит только по инициативе самого контролёра HDD. Для этого предусмотрены спец.линии в шлейфе, по которым передаются не менее специальные сигналы DREQ и DACK# (решётка обозначает низкий активный уровень нуль). Когда диск планирует обмен по DMA, он посылает хосту запрос DREQ (DMA-Request), на что хост отвечает (или нет) сигналом подтверждения DACK# (Acknowledgment). После этого, процессор не вмешивается уже в диалог диска с памятью, и может заниматься другими делами. Сигналы, которые выставляет хост на шину, представлены рисунком ниже: https://forum.antichat.xyz/attachmen...e65b42de83.png С хост-контролёром SATA дела обстоят чуть иначе. В нём уже вырезали режим Legacy-ATA, и для совместимости оставили только PCI-IDE и то, чтобы на программном уровне эмулировать пару устройств Master/Slave. Зато добавлен новый режим DPA – Direct-Port-Access (прямой доступ к портам). В купе с архитектурным решением в виде контролёра AHCI (Advanced Host Controller Interface) он полностью отказывается от модели M/S, когда все четыре SATA-порта абсолютно независимы, и обмен по ним может осуществляться параллельно во времени. Для быстрого доступа, регистры SATA отображаются в память, а их базовые адреса можно прочитать из кфг.пространства PCI, по смещениям Код:
BAR0-BAR4Регистры контролёра HDD В независимости от типа интерфейса ATA или SATA, их контролёры имеют базовый набор физических регистров, которые одинаковы для всех. Отличается только доступ к ним – через системные порты Код:
1F0-1F7hhttps://forum.antichat.xyz/attachmen...13014cff29.png Рассмотрим одну транзакацию (цикл обмена) на шине ATA.. • Чтобы произвести какую-нибудь операцию с сектором диска, сначала в командном регистре Код:
1F7hКод:
1F1h• Если операция подразумевает чтение/запись секторов, то в регистре-счётчика Код:
1F2hКод:
1F3-1F6hКод:
1F7h• Мин.порцией обмена с диском является 512-байтный сектор, но регистр-данных Код:
1F0hКод:
1F0hКод:
1F7hКод:
1F1h• Биты [7,5] старшей тетрады регистра Код:
1F6hВыше упоминалось, что при работе с диском, функция DeviceIoControl() в качестве аргумента может принимать указатель на структуру SENDCMDINPARAMS, а она в свою очередь имеет вложенную IDEREGS (см.сишный хидер ntdddisk.h). Если приглядеться к последней, то каждый её член описывает один из регистров контролёра диска! Это позволяет прямо из прикладного уровня передавать любые АТА-команды через драйвер диску, со всеми вытекающими последствиями: C-подобный: Код:
struct IDEREGSИнтерфейсыSCSI иSAS Как-правило, на десктопных платах бесполезно искать контролёры SCSI – их там попросту нет (в отличии от серверных). Однако любой чипсет эмулирует этот интерфейс на случай, если пользователь решит установить внешний SCSI-адаптер в слот PCI. На рынке можно встретить всякие их разновидности, например как на рисунке ниже: https://forum.antichat.xyz/attachmen...bf9eb6b547.png SCSI имеет множество преимуществ перед интерфейсами ATA/SATA – рассмотрим их бегло.. Во-первых, для адресации устройств на шине выделяется 4-бита, а значит всего девайсов на одной 16-битной шине может быть 16 (Wide-SCSI), в то время как АТА поддерживает только Master/Slave. Каждое устройство должно иметь свой уникальный идентификатор Target-ID. В случае с параллельным SCSI, идентификатор задаётся перемычками в зад, а в случае с последовательным SAS – его назначает хост автоматически. Когда несколько устройств одновременно запрашивают шину, арбитраж выигрывает тот, у которого наивысший ID (самый приоритетный #15 хост забирает себе). Спецификацией SCSI предусматривается параллельная передача данных по 8, 16 или 32 линиям данных. Шина является магистральной, хотя устройства подключаются к ней по принципу "последовательной цепочки". Устройства SCSI могут иметь два разъёма – один входной, а другой выходной. Все устройства на одной шине объединяются в цепочку, один конец которой подключается к контролёру интерфейса. Устройства на шине работают независимо и могут обмениваться данными как с хостом, так и друг-с-другом. https://forum.antichat.xyz/attachmen...9c833b6aca.png Термины Target и LUN(Logical-Unit-Address) используются для 4-уровневой адресации устройств на одной шине: (1)номер SCSI-адаптера, (2)номер шины, (3)идентификатор девайса Target-ID, и его логический номер LUN в цепочке. С номером адаптера и шины всё ясно, а дальше.. На одной шине, устройство с данным ID может быть только одно – это и есть Target или"целевое устройство". Любое SCSI-Device относится к IDE и содержит в себе контролёр, который может обслуживать до 8-ми дополнительных устройств – вот они-то и нумеруются с помощью LUN. Вся эта котовасия с лунами и таргет на практике нам не нужна, поскольку мы будем открывать устройства по их именам функцией CreateFile() и дальше уже обращаться к нему по дескриптору. Однако знать теорию нужно хотя-бы для того, чтобы понимать, зачем предусмотрено то-или-иное поле в структурах. Интерфейс SAS или Serial Attached SCSI - это отдельная тема и сама потянет на пару-тройку статей. Кого интересуют детали, можете почитать материал поэтой ссылке, где он рассматривается во-всей красе. Что касается программной поддержки, то здесь так-же используется функция DeviceIoControl(), только IOCTL-коды у этого интерфейса свои. Один из таких кодов Код:
SCSI_GET_INQUIRY_DATAhttps://forum.antichat.xyz/attachmen...6f218cc2ff.png Данный IOCTL-код возвращает структуру Код:
SCSI_INQUIRY_DATAC-подобный: Код:
struct SCSI_INQUIRY_DATAПрограммирование жёстких дисков в зародыше дело не простое, а без базовых знаний в этой области и делать нечего. Теоретическая часть настолько обширна, что охватить весь материал в одной статье не представляется возможным. Но и в этом случае, вводная часть вон разбухла до размеров слона, хотя я старался делать акцент только на необходимых на мой взгляд вещах. Зато теперь у нас в запазухе есть некоторый багаж, и в следующей части можно будет рассмотреть программную сторону интерфейсов. Это система АТА-команд, идентификация устройств на шинах, атрибуты S.M.A.R.T жёстких дисков, ну и конечно-же чтение/запись сырых RAW-секторов. До скорого! |
Цитата:
Пономарев В.А. Моделирование и оптимизация функционирования твердотельной системы хранения данных Климов Р.В. ИССЛЕДОВАНИЕ МЕТОДОВ ОПТИМИЗАЦИИ НАГРУЗКИ ВОССТАНОВЛЕНИЯ РАСПРЕДЕЛЕННЫХ СИСТЕМ ХРАНЕНИЯ ДАННЫХ НА БАЗЕ КОРРЕКТИРУЮЩИХ КОДОВ Акберов Р.В. ЭЛЕКТРОННОЕ УЧЕБНОЕ ПОСОБИЕ «ЭКСПЛУАТАЦИЯ И ДИАГНОСТИКА ЖЕСТКОГО ДИСКА» |
Цитата:
|
| Время: 13:32 |