В отличие от адресации CHS, адресация LBA никак не связана с физическими характеристиками диска (числом цилиндров, головок и секторов): весь диск в этой системе считается непрерывным массивом блоков (секторов) одинакового размера, причём их нумерация ведётся с нуля. Благодаря этому использовать LBA в программах намного удобнее, чем адреса в формате CHS: даже в том случае, когда CHS-адреса не соответствуют реальной «геометрии» диска, они всё равно остаются разрывными, поскольку нумерация секторов в этом формате ведётся с единицы. Кроме того, из-за ограничений BIOS разрядность CHS-адреса составляет 24 бита, что при стандартном размере сектора 512 байт не позволяет применять диски с ёмкостью, превосходящей 7,875 «двоичных» Гбайта (8,4 «десятичных гигабайт»).
Для работы с дисками с помощью LBA используются расширенные функции дискового сервиса прерывания INT 13h, имеющие номера 41h—49h и 4Eh. Этот набор функций получил название Enhanced Disk Drive Service (EDD; расширенный сервис дисковых приводов). Он присутствует во всех современных версиях BIOS, однако на более старых компьютерах может отсутствовать.
Первые BIOS, поддерживающие адресацию LBA, использовали 28-разрядный логический адрес (номер) блока, хотя пакет дискового адреса, передаваемый функциям расширенного дискового сервиса BIOS, отводит под него 64 бита. Это связано с тем, что первые дисководы, поддерживающие адресацию LBA, технически должны были соответствовать имеющемуся на тот момент стандарту IDE, предусматривавшему только 28 бит под дисковый адрес и трактовавшему его в терминах номеров цилиндра, головки и сектора (CHS): фактически «железо», поддерживающее LBA, появилось раньше официального стандарта, закрепившего этот вид дисковой адресации. Позднее физическая разрядность адреса LBA была повышена до 48 бит (стандарт ATA/ATAPI 6); при необходимости без переделок в правильно спроектированном программном обеспечении она может быть увеличена до 64 бит.
Адресация LBA используется не только с жёсткими дисками, но и для оптических накопителей (CD, DVD, BluRay), флэш-дисков и других устройств с посекторной организацией хранения информации, за исключением гибких дисков, для которых по-прежнему приходится использовать систему CHS.
Подробнее
Материалы сообщества доступны в соответствии с условиями лицензии CC-BY-SA, если не указано иное.
KEY TAKEAWAYS
The technique helps the hosts a lot because it provides a simple linear address space for them to locate it easily, and all they have to do is provide it. They do not need to know anything about the physical positions of the sectors.
The LBA scheme was designed for the first time for the Small Computer System Interface (SCSI) drives.
It also resulted in a much-improved BIOS in which the computer translated the CHS addressing mode into LBA.
Over time, as technology progressed and the designs of the storage systems changed, the support offered by the ATA specifications grew to 8.4 GB, 128 GB and even more.
Then again, it was further extended up to 48 bits when, in 2003, the ATA-6 was released.
However, the size of the data entered on the disk and in the memory were stored in an address that was normally either 32 bits or 64 bits.
This particular form of addressing the hard disks is now more dominant due to the simple reason that it is much easier to work with as compared to the conventional CHS technique.
Therefore, the term LBA can indicate two things such as:
The scheme itself is also referred to as the Basic Input Output System (BIOS) INT 13h extensions drive geometry translation.
You can convert CHS into LBA by using a simple formula, which is explained in a later section of this article.
However, at this point, it is important to note a few specific facts such as:
However, fortunately, as said earlier, most of the newer hard disk drives do support LBA mode.
How to Find a Logical Block Address?
The lower the value of the LBA, the closer the physical sector of the first or the outermost cylinder of the hard drive will be.
LBA = (C × HPC + H) × SPT + (S − 1).
Here, the different alphabets signify different things such as:
How Does Logical Block Addressing Work?
This way, the process goes on.
This, in other words, means that LBA accesses the drives by addressing the sector addresses in a linear fashion.
This makes its working process as well as the entire addressing mode much simpler in comparison to the CHS technique.
CHS Vs LBA
LBA 0 actually refers to the first sector of the hard disk that is partitioned. Ideally, LBA 0 is the same as CHS 0/0/1 and contains the Primary or Master Partition Table (MPT) as well as the Master Boot Record (MBR).
Which LBA is the First Usable Sector?
If you consider a 64-bit Windows operating system, there are 32 sectors or 16,384 bytes set aside for the Globally Unique Identifier or GUID Partition Table (GPT). This means that the first usable sector on the hard disk will be the LBA 34.
Remember, irrespective of the errors in them, such writings on the disk may even be reported as successful.
Conclusion
It is easy to identify due to the unique integer index. Most of the hard drives today support this simpler addressing mode than the CHS mode.
Жёсткие диски это та часть программирования, которая покрыта мраком и тайной. Дефицит информации на эту тему накладывает свой отпечаток, и даже простое копирование больших объёмов данных становится нетривиальной задачей. Но если копнуть глубже, оказывается не всё так плохо, и большинство базовых операций на низком уровне доступно не только админу, но и простому смертному юзеру. На практике, мифы о высоком либидо и буйном темпераменте дисков несколько преувеличены, и надеюсь данная статья поможет разобраться нам в этом. Поскольку материал получился обширным, пришлось разделить его на две части – теория и практика.
В этой части:
• Общие сведения
• Интерфейсы ATA/SATA
• Регистры IDE-устройств
• Интерфейсы SCSI/SAS
Любые накопители HDD относятся к устройствам с интегрированным контролёром. Это означает, что на материнской плате находится лишь обслуживающий шлейф шинный адаптер HBA –
Ссылка скрыта от гостей
, который представляет собой обычный мост для согласования шин АТА/SATA, с магистральной системной шиной PCI. А вот управляющий непосредственно диском контролёр (и его регистры) расположены уже на плате самого жёсткого диска. Такие девайсы принимают аббревиатуру IDE, или Integrated Drive Electronics.
Термин-же АТА (AT Attachment for Disk Drive) уходит корнями в прошлое с архитектурой АТ, когда примитивный дисковый контролёр был частью материнской платы. Нужно отметить, что подобная схема благополучно дожила и до наших дней, в виде контролёра гибких дисков Floppy-Disk-Drive (здесь в устройство заложена только механика). Таким образом, на данный момент термин АТА/IDE подразумевает дисковый накопитель со-встроенным в тело контролёром.
Для прикладных программистов SCSI открывает большие возможности, хотя и требует привилегий админа в системе. Он позволяет общаться с диском напрямую, минуя даже драйверы Win. В своё время, SCSI был разработан специально для устройств со-встроенными контролёрами, которые считались мини-компьютерами (диски, принтеры, CD-ROM и прочие). Собственно об этом прямым текстом сообщает и аббревиатура SCSI –
В наш век мы стали очевидцами преображения параллельного SCSI в достойный внимания последовательный интерфейс дисковых подсистем SAS – Serial Attached SCSI. Windows всех мастей предлагает нам свою поддержку этой технологии в виде механизма ASPI – “Advanced SCSI Programming Interface”, и его расширения SPTI – “SCSI Pass-Through Interface” (сквозной интерфейс). Необходимые для его работы стандартные функции сосредоточены в системной библиотеке wnaspi32.dll, хотя если мы устанавливаем софт фирмы Adaptec, то к нему непременно прилагается сторонний их драйвер aspi.sys.
Не верьте утверждениям, что из прикладного уровня у нас нет доступа к регистрам жёсткого диска – это вовсе не так! К примеру функция взаимодействия с драйверами устройств имеет ряд IOCTL-кодов, которым в качестве параметров передаётся структура . В этой структуре имеется вложенная структура
, в которой и перечисляются все/восемь физических регистров контролёра HDD. Нам остаётся лишь указать в полях данных структур требуемые значения, и передать их драйверу посредством упомянутой функции.
Таким-макаром мы можем посылать накопителю любые АТА-команды, список которых регламентирует спецификация под названием ACS –
(доступная версия вроде 4, датированная 2016 годом)
Что касается теоретической пропускной способности параллельного интерфейса ATA/IDE, то она не превышает отметки в (в реале и того меньше, см.тест скорости в HD-Tune). Связано это с тем, что при передачи данных на более высоких частотах, сигналы на каждом из 32-х проводников начинают отставать друг-от-друга по времени, и в конечной точке приходится собирать их в буфер. А где буфер, там и тормоза.
Именно поэтому инженеры перешли на последовательный , в котором шина 1-битная, зато работает она на частоте 1.5 ГГц. В результате, получаем пропускную способность 1.5 Гбит/сек =150 Мб/с (чуть больше, чем у АТА-7). Дальше, по нарастающей мир увидел ещё две версии SATA с удвоенными частотами:
Посмотрим на рисунок ниже.
Здесь, для согласования шин ATA/SATA с транспортной жилой чипсета применяются мосты, которые играют роль интерфейсных контролёров HDD. В случае с устаревшим АТА это даже не контролёр, а простой адаптер шины. Как-правило, встроен он в боард (дискретный), хотя может быть и более совершенным в виде внешней платы PCI для организации RAID-массивов. А ТА хост-адаптер имеет два внешних порта, которые числятся в системном пространстве под номерами 1F0h и 170h. Эти порты открывают доступ к 8-ми регистрам встроенного в диск контролёра.
В отличии от АТА, хост-адаптер SATA называют уже контролёром, поскольку помимо обычного моста в него заложены и функции реального контролёра диска. Встроенный для каждого из портов отдельный UDMA-контролёр, возможность захватывать PCI-шину в своё распоряжение (Bus-Mastering), а так-же отображаемые в нём физические регистры HDD, присваивают ему более высокий приоритет, по сравнению с базовым АТА-адаптером. Рисунок ниже демонстрирует сказанное:
Посмотреть вложение 43041
Устройства АТА/IDE соединяются с хостом посредством 80-жильного кабеля. На каждом порту могут висеть 2-устройства . Не смотря, что девайсов на канале два, в каждый момент времени только одно из них может использовать шину. Причиной тому способ адресации устройств на канале, для чего выделяется всего 1-бит под названием (спрятан в регистре 1F6h для первого канала, и 176h для второго). Поскольку это бит, он может принимать только два значения – нуль адресует мастера, а единица перенаправляет запросы в Slave. Фактически, параллельно могут работать только два устройства на разных каналах АТА. Здесь радует то, что при работе с диском в Win, нам не нужно адресовать устройства явно, т.к. мы будем обращаться к диску по его дескриптору Handle – об остальном позаботиться уже системный драйвер.
В зависимости от типа HDD, чипсет может сконфигурировать АТА хост-адаптер на работу в одном из двух режимов – оставшийся в наследство , и типичный для архитектуры АТХ режим . В первом случае, обмен HDD с ОЗУ происходит только под управлением процессора и называется он PIO – Programmable I/O. Процессору приходится ждать окончания операций и в это время он не может заниматься чем-то другим. Здесь для чтения/записи секторов применяются инструкции ассемблера in/out, а так-же их мод с префиксом rep. Этот режим необходим для сервисных работ с диском (макс.скорость 14 Мб/с), но абсолютно не пригоден для обмена большими массивами данных.
Поэтому предусмотрен и второй режим работы АТА хост-адаптера – “PCI-IDE”. В нём задействуется DMA-контролёр (Direct Memory Access, прямой доступ к памяти), и вообще полностью меняется программный облик адаптера. Чипсет не может менять режимы интерфейса динамически – биос запрашивает его поддержку у диска при включении машины. В это время, процедура POST отправляет контролёру HDD запрос , на что диск возвращает свой паспорт размером 512-байт (один сектор). Анализируя поля паспорта, биос определяет версию DMA конкретного диска и по ней выставляет режим.
После того-как всё настроено, прямой обмен с памятью в режиме DMA происходит только по инициативе самого контролёра HDD. Для этого предусмотрены спец.линии в шлейфе, по которым передаются не менее специальные сигналы и (решётка обозначает активный уровень нуль). Когда диск планирует обмен по DMA, он посылает хосту запрос DREQ (DMA-Request), на что хост отвечает (или нет) сигналом подтверждения DACK# (Acknowledgment). После этого, процессор не вмешивается уже в диалог диска с памятью, и может заниматься другими делами. Сигналы, которые выставляет хост на шину, представлены рисунком ниже:
Посмотреть вложение 43042
С хост-контролёром SATA дела обстоят чуть иначе. В нём уже вырезали режим Legacy-ATA, и для совместимости оставили только PCI-IDE и то, чтобы на программном уровне эмулировать пару АТА-девайсов Master/Slave. Зато добавлен новый режим DPA – (прямой доступ к портам). В купе с архитектурным решением в виде контролёра AHCI (Advanced Host Controller Interface) он полностью отказывается от модели Master/Slave, когда все четыре SATA-порта абсолютно независимы, и обмен по ним может осуществляться параллельно во времени.
Для быстрого доступа, регистры SATA отображаются в память, а их базовые адреса можно прочитать из кфг.пространства PCI, по смещениям BAR0-BAR4. В связи с тем, что эти регионы памяти недоступны из прикладного уровня Win, мы будем программировать SATA только в унаследованном режиме PCI-IDE.
Регистры контролёра HDD
В независимости от типа интерфейса ATA или SATA, их контролёры имеют базовый набор физических регистров, которые одинаковы для всех. Отличается только доступ к ним – через системные порты 1F0-1F7h, или-же через память MMIO (Memory-Mapped-I/O). Базовый набор включает в себя восемь 1-байтных регистров, список и назначение которых представлен в таблице ниже:
Посмотреть вложение 43043
Рассмотрим одну транзакацию (цикл обмена) на шине ATA.
• Чтобы произвести какую-нибудь операцию с сектором диска, сначала в командном регистре 1F7h мы должны указать код этой операции. Ознакомиться со-списком всех кодов можно в спецификации (см.линк в начале статьи). Команда может иметь параметр, тогда заносим его в регистр-свойств 1F1h.
Выше упоминалось, что при работе с диском, функция в качестве аргумента может принимать указатель на структуру , а она в свою очередь имеет вложенную структуру (см.сишный хидер ntdddisk.h). Если приглядеться к последней, то каждый её член описывает один из регистров контролёра диска! Это позволяет прямо из прикладного уровня передавать любые АТА-команды через драйвер диску, со всеми вытекающими последствиями:
struct IDEREGS
bFeaturesReg db 0 ;// 1F1h – аргумент команд
bSectorCountReg db 0 ;// 1F2h – счётчик секторов
bSectorNumberReg db 0 ;// 1F3h – номер сектора
bCylLowReg db 0 ;// 1F4h – номер цилиндра
bCylHighReg db 0 ;// ^^^
bDriveHeadReg db 0 ;// 1F6h – номер головки
bCommandReg db 0 ;// 1F7h – АТА-команда
bReserved db 0 ;
ends
struct SENDCMDINPARAMS
cBufferSize dd sizeof. SENDCMDINPARAMS
irDriveRegs IDEREGS ;// вложенная структура с регистрами
bDriveNumber db 0 ;// номер диска (игнор, т.к. открываем по хэндлу)
bReserved rb 19 ;//
bBuffer rb 512 ;// входной буфер.
ends
В следующей части мы пощупаем эти структуры руками, а пока поверхностно рассмотрим, что из себя представляют более продвинутые интерфейсы подключения IDE.
Как-правило, на десктопных платах бесполезно искать контролёры SCSI – их там попросту нет (в отличии от серверных). Однако любой чипсет эмулирует этот интерфейс на случай, если пользователь решит установить внешний SCSI-адаптер в слот PCI. На рынке можно встретить всякие их разновидности, например как на рисунке ниже:
Посмотреть вложение 43044
SCSI имеет множество преимуществ перед интерфейсами ATA/SATA – рассмотрим их бегло.
Во-первых, для адресации устройств на шине SCSI выделяется 4-бита, а значит всего девайсов на одной 16-битной шине может быть 16 (Wide-SCSI), в то время как АТА поддерживает только Master/Slave.
Каждое устройство должно иметь свой уникальный идентификатор . В случае с параллельным SCSI, идентификатор задаётся перемычками в зад, а в случае с последовательным SAS – его назначает хост автоматически. Когда несколько устройств одновременно запрашивают шину, арбитраж выигрывает тот, у которого наивысший ID (самый приоритетный 15 хост забирает себе).
Спецификацией SCSI предусматривается параллельная передача данных по 8, 16 или 32 линиям данных. Шина является магистральной, хотя устройства подключаются к ней по принципу “последовательной цепочки”. Каждое SCSI-устройство имеет два разъема – один входной, а другой выходной. Все устройства на одной шине объединяются в цепочку, один конец которой подключается к контроллёру интерфейса. Устройства на шине работают независимо и могут обмениваться данными как с хостом, так и друг-с-другом.
Посмотреть вложение 43045
Термины и (Logical-Unit-Address) используются для адресации устройства на одной шине. Итого получаем 4-уровневую адресацию устройств:
номер SCSI-адаптера,
номер шины BUS,
идентификатор девайса Target-ID, и логический номер в цепочке LUN. С номером адаптера и шины всё ясно, а дальше – на одной шине, устройство с данным ID может быть только одно – это и есть Target или “целевое устройство”. Любое SCSI-устройство относится к IDE и содержит в себе контролёр, который может обслуживать до 8-ми дополнительных устройств – вот они-то и нумеруются с помощью LUN.
Интерфейс SAS или Serial Attached SCSI – это отдельная тема и сама потянет на пару-тройку статей. Кого интересуют детали, можете почитать материал по
, где он рассматривается во-всей красе.
Что касается программной поддержки, то здесь так-же используется функция , только у этого интерфейса свои и начинаются с приставки SCSI. Один из таких кодов SCSI_GET_INQUIRY_DATA я использовал в своей программе, чтобы просканировать чипсет на наличие в нём эмулируемых SCSI-портов. При том-что у меня нет физического адаптера, прога обнаружила целых 4-шины, на которых висят 2 моих винта и один DVD-ROM. Исходник мы обсудим в следующей части статьи. а здесь я прикреплю уже готовый экзешник, чтобы вы могли ознакомиться с портами своей машины:
Посмотреть вложение 43046
Данный IOCTL-код возвращает структуру SCSI_INQUIRY_DATA (см.хидер ntddscsi.h), и нам остаётся лишь вывести на консоль эти данные:
struct SCSI_INQUIRY_DATA
PathId db 0 ;// номер шины, на которой висит устройство
TargetId db 0 ;// номер устройства на шине
Lun db 0 ;// номер лог.единицы на целевом устройстве
DeviceClaimed db 0 ;// TRUE указывает, что устройство было запрошено “драйвером класса”
InquiryDataLength dd 0 ;// длина в байтах данных запроса
NextInquiryDataOffset dd 0 ;// смещение к данным сл.устройства
InquiryData rb 8 ;// буфер, содержащий данные запроса
ProductId rb 24 ;// имя устройства,
ProductRevisionLevel rb 4 ;// .и его ревизия.
ends
Программирование жёстких дисков в зародыше дело не простое, а без базовых знаний в этой области и вообще нечего делать. Теоретическая часть настолько обширна, что охватить весь материал в одной статье не представляется возможным. Но и в этом случае, статья вон разбухла до размеров слона, хотя я старался делать акцент только на необходимых на мой взгляд вещах. Зато теперь у нас в запазухе есть некоторый багаж, и в следующей части можно будет рассмотреть программную сторону интерфейсов. Это система АТА-команд, идентификация устройств на шинах, атрибуты S. M. A. R. T жёстких дисков, ну и конечно-же чтение/запись сырых RAW-секторов. До скорого!
Пожалуй, одной из основных задач разработчика ОС является работа с жесткими дисками и файловыми системами. В этой статье рассмотрим принципы работы с контроллерами ATA/ATAPI.
Первая часть — способы поиска контроллеров дисков и проверка наличия на них устройств.
Вторая часть — непосредственно чтение и запись данных на жёстких дисках с использованием всевозможных методов.
Вопросы, связанные с реализацией кэша и файловой системы, ищите в другом месте.
С развитием компьютера рос и объём жёсткого диска. Его геометрия менялась.
Способ адресации CHS долго использовался BIOS в прерываниях дискового сервиса. Но после появилось и расширение, способное адресовать через LBA.
С развитием геометрии дисков возросли и потребности в быстром доступе к дискам.
Вначале было два способа доступа: и . Изначально контроллер располагался на шине ISA, и поэтому скорость такого способа передачи составляла 25 МБайт/с, что обусловлено частотой шины и, в свою очередь, частотой контроллера. Впоследствии появилась шина PCI с возможностью каждому устройству обращаться к памяти компьютера напрямую (минуя процессор). Вследствие этого появились и PCI IDE контроллеры. Разработчики реализовали новый сверхбыстрый способ передачи данных — Ultra DMA (UDMA). P CI IDE контроллер захватывал шину памяти в режиме Bus Master, и уже винчестер начинал контролировать передачу данных. Раньше за него эту работу выполнял ISA DMA контроллер. Появилась возможность передавать данные на высоких скоростях (33/66/100 МБайт/с и выше).
С появлением PCI IDE контроллера расширился способ доступа к диску.
В дальнейшем появился SATA контроллер. Кто его звал? Все жили счастливо без него. Ну что же, примем как должное и будем программировать и его.
Как найти контроллер дисков? Собственно, как и любой другой. Надо знать, где искать. А искать будем на шине PCI.
Ищем контроллер по его базовому классу 01.
Просто сканируем все устройства и проверяем их класс. Как это делается, читайте в статьях про PCI.
Нас, собственно, интересует три пункта:
Что такое , думаю, и так понятно — обыкновенный контроллер.
, собственно, то же самое, только с возможностью создать .
— это контроллер -дисков с возможностями прямого доступа к портам дисков.
Собственно, -контроллер может иметь любой из этих классов.
-контроллеры бывают с фиксированным классом или, напротив, такие, у которых можно задать класс.
Надо сказать, что Programming Interface (PI) имеет сложную структуру.
Для , ниже у нечто наподобие.
Найдя контроллер, мы должны получить адреса его базовых портов и каналов.
Забудем про . Остановимся на и .
Надо сразу сказать, что контроллер может находиться в одном из двух состояний:
Также для встроенных -контроллеров есть режим совместимости (Сompatibility), когда он вместе с -контроллером делит два канала в Legacy-режиме. И при этом в конфигурационном пространстве PCI будет виден только один контроллер.
Если контролер работает в устаревшем режиме (Legacy), то для доступа к каналам используются следующие порты:
В конфигурационном пространстве PCI на месте BAR-регистров будет нулевой адрес, что будет говорить о том, что порты эти либо не используются, либо используются особые порты, как в нашем случае.
При этом BM_BASE будет выставлен.
Если контроллер находится в родном режиме (Native), то все базовые порты считываются из конфигурационного пространства PCI. И оттуда же можно извлечь номер прерывания. Адреса портов можно также изменить, но делать этого я не советую.
Если номер прерывания не выставлен или вы хотите его изменить, то вам придётся воспользоваться PCI BIOS, так как это связанно с -роутингом.
Найдя контроллеры и считав базовые порты, перейдем к определению дисков.
Чтобы не усложнять жизнь, каналы будем нумеровать с нулевого и до последнего, не различая номер контроллера (по идее, так проще).
Каждый канал имеет два диска: Master и Slave. Собственно, на SATA никаких Slave дисков нет — все устройства работают параллельно. Но -контроллер способен (даже вынужден) эмулировать Master/Slave.
Чтобы определить присутствие жесткого диска, нужно послать команду:
EXECUTE DEVICE DIAGNOSTIC=90h
Для определения оптического диска или другого специфичного устройства, способного выполнять пакетные команды, нужно послать ему команду:
По стандарту ATA/ATAPI после команды EXECUTE DEVICE DIAGNOSTIC или DEVICE RESET устройством должна возвращаться сигнатура. Если подключен оптический дисковод, то должна вернуться сигнатура поддержки пакетных устройств ATAPI:
Sector Count 01h
Sector Number 01h
Cylinder Low 14h
Cylinder High EBh
Для простых дисков ATA сигнатура следующая:
Sector Count 01h
Sector Number 01h
Cylinder Low 00h
Cylinder High 00h
Помимо сигнатуры в регистр Error должен вернуться Diagnostic code код присутствия или отсутствия диска.
После того, как мы посылаем команду EXECUTE DEVICE DIAGNOSTIC для Master-устройства, мы должны дождаться ответа от него.
Если в течение нескольких миллисекунд мы не дождались ответа, то диска нет. Признаком занятости контроллера является код BSY.
Если мы дождались, то смотрим Diagnostic_code: мы должны получить Diagnostic_code=01h или 81h -диск есть. В противном случае устройство отсутствует.
Когда мы посылаем команду EXECUTE DEVICE DIAGNOSTIC Slave-устройству, то на эту команду должен ответить Master. Если у нас есть Master, то он отвечает за Slave. Diagnostic_code=01h будет означать, что Slave есть, в противном случае его нет. Однако для Slave это не является достоверной информацией.
If Device 1 is not present, the host may see the information from Device 0 even though Device 1 is selected.
Если Master отсутствует, а Slave присутствует, то Slave сам ответит за себя.
Помимо прочего, существует несогласованность:
Приходится также проверять и результат команды DEVICE RESET.
Как уже было упомянуто, для Slave EXECUTE DEVICE DIAGNOSTIC не возвращает достоверной информации, поэтому необходимо делать дополнительную проверку.
Вызываем команду для получения параметров жестких дисков:
Или для пакетных:
IDENTIFY PACKET DEVICE=0A1h
Практика показала, что в случае эмуляции только Master-дисков при попытке обратиться к Slave будет возвращаться данные о состоянии Master-диска. Однако данные от команды не будут получены. Поэтому смотрим: если на запрос IDENTIFY DEVICE или IDENTIFY PACKET DEVICE вернулась ерунда или ошибка команды, или в Data регистре идут повторяющиеся слова, то считаем, что диска нет.
От вторичной проверки мы получаем также и практическую пользу.
Мы можем выяснить, поддерживает ли диск LBA48, и какие режимы передачи диск позволяет выполнять .
Вот мой исходник (компилятор — FASM). Громоздко вышло.
Существует несколько классов команд. Но все протоколы можно разделить на два-три типа: с приемом блока данных, с передачей блока данных и без передачи блока данных.
Для начала разберемся в структуре регистра статуса.
Объясним значения битов:
Теперь понятно, как сделать вызов команды, не использующей передачу блока данных:
Для команд, работающих с передачей блока данных:
Резонный вопрос: как работать с LBA48, если все регистры имеют разрядность 8 бит?
При адресации через LBA48 запись адреса идет в те же регистры, но более хитрым способом.
Сначала записывается старшая часть адреса и число секторов, а затем (во второй раз) в те же самые регистры записывается младшая часть.
Помимо этого, можно прочитать эти регистры, установив HOB-бит, чтобы прочитать старшую часть, или сбросив, если нужно прочитать младшую.
Все команды для LBA48 имеют суффикс EXT.
Посылка команды READ SECTOR(S)=20h
Запрос
Посылка команды READ SECTOR(S) EXT =24h
Запрос
Также важной характеристикой является максимальный адрес сектора. Код операций чтения для LBA28 и LBA48:
READ NATIVE MAX ADDRESS=0F8h
READ NATIVE MAX ADDRESS EXT=027h
В ответ на команду READ NATIVE MAX ADDRESS=0F8h
После посылки команды READ NATIVE MAX ADDRESS EXT=027h
Внимание! Это незаконченная статья. Вы можете помочь доработать статью и наполнить ее материалом.
Для улучшения статьи необходимо: Перевести таблицы в вики-разметку Grindars 15:06, 15 августа 2008 (MSD)