Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
#define HD_STATUS 0x1f7 /* регистр состояния/команд */
Протокол взаимодействия
Обычный протокол взаимодействия хоста с устройством выглядит следующим образом:
1. Хост читает регистр состояния устройства, дожидаясь нулевого значения бита BSY.
2. Дождавшись освобождения устройства, хост записывает в регистр номера устройства и головки байт, у которого бит DEV указывает на адресуемое устройство.
3. Хост читает основной регистр состояния адресованного устройства, дожидаясь признака его готовности (DRDY = 1).
4. Хост заносит требуемые параметры в блок командных регистров.
5. Хост записывает код команды в регистр команд.
6. Устройство устанавливает бит BSY и переходит к исполнению команды.
Для команд, не требующих передачи данных (ND):
7. Завершив исполнение команды, устройство сбрасывает бит BSY и устанавливает запрос прерывания. К этому моменту в регистрах состояния и ошибок уже имеется информация о результате выполнения.
Для команд, требующих чтения данных в режиме PIO:
8. Подготовившись к передаче первого блока данных по шине АТА, устройство устанавливает бит DRQ. Если была ошибка, она фиксируется в регистрах состояния и ошибок. Далее устройство сбрасывает бит BSY и устанавливает запрос прерывания.
9. Зафиксировав обнуление бита BSY (или по прерыванию), хост считывает регистр состояния, что приводит к сбросу прерывания от устройства.
10. Если хост обнаружил единичное значение бита DRQ, он производит чтение первого блока данных в режиме PIO (адресуясь к регистру данных). Если обнаружена ошибка, считанные данные могут быть недостоверными.
После передачи блока данных возможно одно из следующих действий:
n если на шаге 8 ошибка не обнаружена, а требуется передача следующего блока, устройство устанавливает бит BSY, и данная последовательность повторяется с шага 7.
n если есть ошибка или передан последний блок данных, устройство сбрасывает бит DRQ и выполнение команды завершается.
Операцию записи на жесткий диск рассматривать не будем.
Доступ к жесткому диску через порты АТА-контроллера
Задача прежняя – получить информацию идентификации устройства и считать MBR. Рассмотрим программный код.
Заголовочные файлы:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/hdreg.h>
Для работы с портами ввода/вывода определим несколько макросов:
#define OUT_P_B(val,port)
asm(
"outb %%al, %%dx"
::"a"(val),"d"(port)
)
#define IN_P_B(val,port)
asm(
"inb %%dx, %%al"
:"=a"(val)