Форум программистов, компьютерный форум, киберфорум
ОС на Assembler
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
4 / 4 / 1
Регистрация: 27.04.2019
Сообщений: 4

Соответствие между ATA Signals и адресами портов I/O

27.04.2019, 20:09. Показов 3976. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Поискал в гугле, как ОС работают с HDD, нашел ATA PIO интерфейс. Почитал про него на сайте osdev, потом еще несколько записей в блогах - там подробно описано, как и через какие порты работать с HDD.
Потом смотрел разные версии спецификаций ATA.
Везде описаны только имена сигналов (CS1FX-, CS3FX-, DA2, DA1, DA0) - которые соответствуют "лапам"(drive pins) на микросхеме, которая встраивается в хостовую машину и реализует взаимодействие с HDD.
Однако, ни в одной спецификации не описаны номера портов I/O для работы с HDD.
Посмотрел Intel Chipset Specification. Там сказано лишь, что primary ATA harddisk controller соответствует диапазон адресов 0x01F0-0x01F7. И снова конкретные порты и их функции не описаны.

Где же описано соответствие между сигналами и портами I/O?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.04.2019, 20:09
Ответы с готовыми решениями:

Соответствие портов и много подключений
Здравствуйте. Задумался над вопросом. Объекты TServerSocket и TClientSocket должны иметь одинаковые значения Порта и Адреса. Но если...

Соответствие портов вв внешним прерываниям - где это документировано?
Привет всем! В общем, столкнулся с программированием МК чисто по академическим причинам. И вот, открыв задание для лабораторной работы...

Различие между адресами
Какое главное различие между адресом сети и широковещательным адресом? По идеи, они посылают пакеты ко всем компьютерам в сети. Все это мог...

9
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
28.04.2019, 02:25
Лучший ответ Сообщение было отмечено guesswho18 как решение

Решение

Цитата Сообщение от guesswho18 Посмотреть сообщение
Где же описано соответствие между сигналами и портами I/O?
Если ты пишешь в порт 1Fx, то данные выставляются на линии Data0..Data7, три младших бита номера порта на линии Addr0..Addr2 и потом дергается сигнал I/O Write. Если читаешь, то выставляются Addr0..Addr2, дергается I/O Read и данные читаются с линий Data0..Data7. Но винт будет отрабатывать чтение и запись только и только если выставлен сигнал Chip Select 1P или Chip Select 3P .
На старых компах с шиной ISA, насколько понимаю, интерфейс IDE тупо подключался прямо к этой шине. Был только добавлен дешифратор адреса, который выставлял сигнал Chip Select 1P если номер порта с которым исполняется инструкция процессора in или out был в двоичном виде равен 01 1111 0xxx , т.е 1F0h..1F7h и сигнал Chip Select 3P если номер порта с которым исполняется инструкция процессора in или out был в двоичном виде равен 11 1111 011x , т.е 3F6h..3F7h

Добавлено через 14 минут
Цитата Сообщение от guesswho18 Посмотреть сообщение
Однако, ни в одной спецификации не описаны номера портов I/O для работы с HDD.
Определены спецификацией IDE (то бишь ATA) только три младших бита номеров портов. Вот тут
http://www.t13.org/documents/U... -ATA-1.pdf
таблица 6. А вот в какой конкретный диапазон портов эти три бита будут засунуты это вопрос. Когда-то было типично в 1F0..1F7 и 3F6..3F7, но я встречал два AT на которых диапазоны были другими. Правда, когда на этих компах работали под MS-DOS и через BIOS, то конкретные номера портов были не важны. Встречал на двух одноплатных компьютерах с 386-м процессором для станков с ЧПУ. Так вот можно ли было на эти компы поставить какую-нибудь старую винду и по какому протоколу она определила бы, что номера портов IDE не те и какие они именно мне не известно.

Я говорил выше про ATA (IDE, PATA), поскольку ты именно про них и спрашивал. А сейчас компы клепают с SATA. И похоже у тебя присутствует убежденность, что под жесткий диск выделены какие-то конкретные порты. А вот ни фига. Ткни на своем компе в Диспетчере устройств и посмотри какие порты занимает жеский диск. Да похоже какие попало. 1F0..1F7 и 3F6..3F7 это было на старых AT-совместимых компах, да и то как я выше сказал не всегда. Короче, как определять на каких портах сидит жесткий диск на конкретном компе, это надо в исходники какого-нибудь BIOS-а глянуть. Вот как там делается так и делать.
3
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6213 / 2447 / 403
Регистрация: 29.07.2014
Сообщений: 3,178
Записей в блоге: 4
28.04.2019, 07:36
Цитата Сообщение от guesswho18 Посмотреть сообщение
Везде описаны только имена сигналов (CS1FX-, CS3FX-, DA2, DA1, DA0)
..тебе это не нужно, поддержка протокола идёт на уровне биос.
Твоя задача - циклическим опросом найти порт (на котором висит диск), и просто посылать в его регистры нужные команды. Порт - это шлюз к регистрам, которых в legacy-IDE всего 8. Например, если говорят "порты 1F0-1F7", значит тебе нужно найти в пространстве порт 1F0h, который откроет доступ к 8-ми последующим/его регистрам. Соответственно 3F0 является базовым портом второго канала ATA/IDE.

Контроллёры SATA могут работать в двух режимах - NativeIDE (в/в через IO) и DPA (в/в через MMIO). Описание всех регистров и команд управления для АТА-CHS/LBA можно найти в книжке "В.Несвижский: Программирование аппаратных средств", а современный интерфейс SATA внятно рассматривает "М.Гук: Интерфейсы АТА".
3
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
28.04.2019, 18:58
Цитата Сообщение от R71MT Посмотреть сообщение
Соответственно 3F0 является базовым портом второго канала ATA/IDE.
Hасколько помню первый канал сидел на портах 1F0h..1F7h и 3F6h-3F7h, а второй на 170h..177h и 376h-377h.
2
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6213 / 2447 / 403
Регистрация: 29.07.2014
Сообщений: 3,178
Записей в блоге: 4
28.04.2019, 21:08
Ethereal, сенкью.. опечатка у меня, базовый второго канала = 170h.
1
531 / 180 / 39
Регистрация: 18.08.2012
Сообщений: 907
30.04.2019, 16:37
Книга по теме:
ISBN: 5-94157-252-2
Всеволод Несвижский
Программирование устройств SCSI и IDE. - СПб.: БХВ - Петербург, 2003. - 592 с.
1
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6213 / 2447 / 403
Регистрация: 29.07.2014
Сообщений: 3,178
Записей в блоге: 4
30.04.2019, 18:08
Цитата Сообщение от sam063rus Посмотреть сообщение
Книга по теме:
жёсткие диски там вообще не упоминаются, а только ATAPI

Добавлено через 12 минут
guesswho18, нюансов в IDE-режиме не так-уж и много - вот некоторые из них..
Все регистры базового порта - однобайтные. Про разметку CHS можно забыть и использовать только LBA. Под макс.LBA выделяется всего 28-бит, тогда получаем ёмкость диска в режиме IDE = 128 Gb.

В трёх/однобайтых регистрах 1F3,4,5 находятся 24-младших битов LBA-адреса, а четыре/старших бита отправили в младшую тетраду следующего регистра - 1F6h. Таким образом старшая тетрада [7:4] регистра 1F6h осталась свободной, и используется для выбора M/S.

Поскольку АТА-каналов всего 2, а устройств может быть 4 (мастер/слейв), то слейвы выбираются битом(4) выше/упомянутого регистра 1F6h (для первого канала) - он так и называется "Регистр выбора устройства". Код мастера в режиме LBA выглядит как F0h:
Code
1
2
3
4
5
6
7
8
9
1F6h - чтение/запись.
Позволяет выбрать режим адресации CHS/LBA, 
а так-же указать номер устройства на канале (Device M/S).
 ___ ____ ___ _____ ___ ___ ___ ___
| 1 | AM | 1 | DEV | - | - | - | - |   Бит
|___|____|___|_____|___|___|___|___|
      |         |    +-----------+---> (3-0): старшие биты LBA-адреса;
      |         +--------------------> (4)  : Device_Select: 0-Slave, 1-Master;
      +------------------------------> (6)  : Address_Mode : 0-CHS,   1-LBA.
Следующее - это текущее состояние устройства. Нельзя подавать в порт диска команды, пока диск занят - нужно обязательно дождаться освобождения его шины, о чём предупреждает бит "BUSY". Дело в том, что ни один диск класса HDD не имеет очереди управляющих команд. Очередь команд NCQ (Native_Command_Queuing) была впервые введена в SCSI устройствах, потом в IDE её убрали, а в SSD - снова ввели. Таким образом ATA/IDE получился ущербным интерфейсом, хотя в ATAPI какая-никакая очередь имеется.

Поэтому перед тем-как посылать команду в порт диска, нужно проверить регистр 1F7h, который выполняет сразу 2-функции: при чтении это "регистр-состояния", а при записи - "шлюз-команд":
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
1F7h - Регистр состояния (чтение).
Чтение текущего состояния накопителя и результатов выполнения предыдущей команды. 
Если бит(7) BSY =1, значит диск занят и содержимое остальных битов игнорируется. 
Значимыми являются биты BSY/DRDY/DRQ.
 _____ ______ ____ ____ _____ _ _ _____
| BSY | DRDY | DF | SO | DRQ | | | ERR |    Бит
|_____|______|____|____|_____|_|_|_____|
   |      |     |    |    |         +-----> (0): 1 = ошибка предыдущей команды (Error)
   |      |     |    |    +---------------> (3): 0 = готов к обмену данными (Data_Request)
   |      |     |    +--------------------> (4): 1 = поиск завершён (Search_Off)
   |      |     +-------------------------> (5): 1 = сбой устройства (Device_Fault)
   |      +-------------------------------> (6): 1 = устройство свободно (Device_Ready)
   +--------------------------------------> (7): 1 = инфо/шина занята (Busy)
В режиме записи, через этот регистр 1F7h устройству посылаются АТА-команды. Команда должна подаваться только когда биты BSY(7) и DRQ(3) сброшены. Функция проверки диска на готовность к приёму команд может выглядеть так (предварительно в 1F6h нужно указать Master/Slave):
Assembler
1
2
3
4
5
6
7
8
DeviceReady:           ;<----- функция проверки диска на готовность ---------|
       mov   dx,1F7h             ; регистр состояния первого канала
busy:  in    al,dx               ; читаем байт состояния..
       test  al,10001000b        ; проверяем в нём биты BSY(7) и DRQ(3) - должны быть 0.
       jnz   busy                ;   ..циклимся, если не нуль..
       test  al,01000000b        ; теперь проверяем бит DRDY(6) - должен быть 1.
       jz    busy                ;   ..циклимся, если нуль..
retn                             ; значит диск свободен - на выход!
3
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6213 / 2447 / 403
Регистрация: 29.07.2014
Сообщений: 3,178
Записей в блоге: 4
02.05.2019, 11:29
В большинстве случаях, для ламерских задач с диском хватает и расширенного сервиса биос int-13h. Однако в этот сервис зашит не весь набор нативных команд, макс кол-во которых лежит в пределах 255 штук (кодируются одним байтом). В полной мере АТА-команды поддерживают только порты ввода-вывода. Но и это не всё..

Есть ещё и набор сервисных т.н. "терминальных команд" - это вообще бомба, только документированы они исключительно для Seagate_Barracuda (архитектуры "классическая" и "F3"). Сервисные команды передаются не по АТА, а по специальному Com-интерфейсу, где приём-передача осуществляется по линиями Tx - Transmit (передача) и Rx - Receiver (приём). В этом режиме с накопителем можно проделывать всё/мыслимое и немыслимое. Но вернёмся к портам..

В.Несвижский как-всегда допустил ляп (видимо не тестирует свои мысли) и на весь мир заявил, что мастер выбирается взведённым битом(4) в регистре 1F6h. Оказывается наоборот - для мастера он должен быть сброшеным, т.е. код "Master/LBA" кодируется как E0h, а не F0h. И это не единичный случай в его практике, поэтому лучше проверять его утверждения..

Попробуем в режиме PIO считать с накопителя его "Stuff" - в простонародье "паспорт диска". Функции биос сделать этого не в состоянии. Команда называется Identify_Device и имеет код ECh. При успешной операции, буфер будет содержать 512 байт различной инфы о накопителе. Не буду описывать все/512 (см.доки), а остановлюсь только на некоторых полях (смешение указывается в словах):
Code
1
2
3
4
5
6
7
8
9
10
11
---------+----------+------------------------------------------------
 Offset  |  Size    |  Description
---------+----------+------------------------------------------------
   00       2 байта    Конфиг устройства:
                       бит(15)- интерфейс: 0 = ATA/HDD, 1 = ATAPI/DVD
 
   10      20 байт     Серийный номер: 20 ASCII-символов
   23       8 байт     Версия м/кода.:  8 ASCII-символов
   27      40 байт     Устройство....: 40 ASCII-символов
 
---------------------------------------------------------------------
Что интересно, все ASCII-строки указываются в дампе не_поймёшь_как. Точнее каждая пара-символов строки, имеет обратный порядок. Например строка "Seagate" будет указана как: "eSgatae" (чё они там курят?). Поэтому при выводе строк нужно читать словами, и переставлять байты местами через xchg. Вот пример:
Assembler
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
; fasm-code
;------------
org  100h
jmp  start
 
mes0     db  13,10,' READY DEVICE: $'
mes1     db  13,10,'    SAVE DATA: $'
mes2     db  13,10,'  DEVICE NAME: $'
mes3     db  13,10,'SERIAL NUMBER: $'
mes4     db  13,10,'     FIRMWARE: $'
mOk      db  'OK! $'
mErr     db  'ERROR! $'
buff     db  512 dup(0)
 
start:   mov   dx,mes0            ;// = READY DEVICE =
         call  Message            ;
 
         call  DeviceReady        ; DX = 1F7h. ждём готовности мастера на первом..
         jnc   @ok                ; 
         mov   dx,mErr            ; CF=1 - ошибка!
         call  Message            ; 
         jmp   @exit              ; на выход..
 
@ok:     mov   dx,mOk             ; винт готов!
         call  Message            ;
         mov   dx,mes1            ;// = SAVE_DATA =
         call  Message            ;
;;;
         mov   dx,1f7h            ; 
         mov   al,0ECh            ;
         out   dx,al              ; код 'Device_Id' в 1F7h
         cld                      ; дефолтный direction (слева-направо)
         mov   di,buff            ; ES:DI для INSW (адрес приёмного буфера)
         mov   dx,1f0h            ; регистр данных
         mov   cx,256             ; сколько читать (512 байт, или 256 слов)
         rep   insw               ; читаем с порта словами! (в режиме PIO)
 
         mov   dx,1f7h            ; проверим последнюю операцию!
         in    al,dx              ;
         and   al,1               ; сбросим всё, кроме бита(ERR)
         jz    @next              ; если ERR=0
         mov   dx,mErr            ; иначе: ошибка и на выход!
         call  Message            ;
         jmp   @exit              ;
;;;
@next:   mov   dx,mOk             ; OK!
         call  Message            ;
         mov   dx,mes2            ; выводим из буфера "DEVICE-NAME"
         call  Message
         mov   si,buff            ; адрес начала буфера в DS:SI
         push  si si              ; (запомнить 2-раза)
         add   si,27*2            ; перемещаемся в нём на нужный адрес
         mov   cx,20              ; считать 20 слов (40 ascii символов)
         call  Print              ; Выводим инфу на экран
;;;
         mov   dx,mes3            ; выводим "SERIAL-NUMBER"
         call  Message            ;
         pop   si                 ; 
         add   si,10*2            ; адрес инфы в буфере
         mov   cx,10              ; считать 10 слов
         call  Print              ; выводим инфу на экран
;;;
         mov   dx,mes4            ; версия микрокода "FIRMWARE"
         call  Message            ;
         pop   si                 ;
         add   si,23*2            ; 
         mov   cx,4               ; считать 4 слова
         call  Print              ; выводим инфу на экран
 
@exit:   xor   ax,ax              ; ждём клаву..
         int   16h                ; 
         ret                      ; выйти в MS-DOS!!!
 
;//==========================================================|
;----- Функция вывода сообщений
Message:
       mov   ah,9
       int   21h
       ret
 
;----- Функция чтения ASCII-строк из буфера "Stuff"
Print: lodsw                 ; читаем в АХ словами
       xchg  ah,al           ; байты лежат наоборот, и нужно их поменять местами. 
       int   29h             ; выводим AХ на экран
       shr   ax,8            ;
       int   29h             ;
       loop  Print           ; мотаем цикл CX раз
ret
 
;----- Функция проверки диска на готовность
DeviceReady:
       mov   bx,4             ; три попытки
       mov   dx,1F6h          ; выбираем устройство
       mov   al,0E0h          ;   ..мастер на первом.
       out   dx,al            ;
       mov   dx,1F7h          ; регистр состояния
@busy: stc                    ; выставим флаг ошибки CF (set carry)
       mov   cx,-1            ; повторов для 'loop' (макс)
       loop  $                ; небольшая пауза (стоим на месте)
       dec   bx               ; уменьшить счётчик попыток!
       jz    @stop            ; выйти с флагом(cf), если три попытки кончились.
       in    al,dx            ; иначе: читаем байт-состояния из 1F7h
       test  al,10001000b     ; BSY и DRQ ???
       jnz   @busy            ;   ..нет готовности
       test  al,01000000b     ; DRDY ???
       jz    @busy            ;   ..нет готовности
       clc                    ; иначе: снять флаг ошибки(cf)
@stop: retn                   ; ОК (или ошибка)
Миниатюры
Соответствие между ATA Signals и адресами портов I/O  
2
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,305
Записей в блоге: 12
02.05.2019, 18:17
Цитата Сообщение от R71MT Посмотреть сообщение
DeviceReady:
Чуток меньше jcc-шек
Assembler
1
2
3
4
5
6
7
DeviceReady:           ;<----- функция проверки диска на готовность ---------|
       mov   dx,1F7h             ; регистр состояния первого канала
busy:  in    al,dx               ; читаем байт состояния
       and   al,11001000b        ; выделяем в нём биты BSY(7), DRDY(6) и DRQ(3)
       cmp   al,01000000b        ; проверяем биты (BSY и DRQ должны быть 0, DRDY должен быть 1)
       jne   busy                ; циклимся, если совпадают
retn                             ; значит диск свободен - на выход!
3
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
08.05.2019, 13:13
Ты пишешь ПО для музея вычислительной техники? Уже давно используется AHCI для доступа к HDD.
Цитата Сообщение от guesswho18 Посмотреть сообщение
Где же описано соответствие между сигналами и портами I/O?
Есть стандартные порты, но IDE совместимые контроллеры могут работать по любым портам, нужно вычитывать из шины PCI.
Если в регистрах PCI у контроллера IDE не будет назначенных портов, то значит используются стандартные 1F0h-1F7h и 3F6h-3F7h, 170h-177h, 376h-377h (т.к. называемых режим Legacy IDE и последний мой комп, который это поддерживает - это ноут 2008 года выпуска).
https://osdev.fandom.com/ru/wiki/HDD
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.05.2019, 13:13
Помогаю со студенческими работами здесь

Разница байт между адресами переменных
Добрый день, форумчане. Изучаю работу с памятью в С++ через указатели. Я узнал, что существует стековая память, и сам стек организован по...

Карта на форме и расстояние между адресами
Доброго времени суток, делается дипломный проект &quot;Автоматизированная служба такси&quot;, всё почти готово, база, приложение и т.п. НО, на...

На W7 пропали оба DVD дисковода (ASUS DRW-1608P3S ATA и Sony NEC Optiarc DVD RW AD-7170A ATA
После неудачной инсталляции NERO на W7 и его ручного удаления перестали быть видимыми оба DVD дисковода (ASUS DRW-1608P3S ATA и Sony NEC...

Как посчитать объем памяти между адресами?
Всем привет! Помогите рассчитать сколько памяти находится между адресами 0A000:0000h и 0B800:0FFFFh (видеопамять) Автор пишет, что там...

Delphi XE определить длину пути между 2 адресами
Можно ли с помощью gmlib определить длину пути, которую проедет автомобиль от одного адреса к другому?если да, то как? Distance :=...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru