Лабораториялық жұмыс №13.

Тақырып: ATA қатты дисктерінің анықтамасы

Жұмыс мақсаты: Студенттерді бағдарламалық деңгейде қатты дисктер анықтауды үйрету.

Теориялық мәліметтер:

IDE контроллер.

ДК қолданатын стандартты IDE контроллер, 2 канал сүйейді, олардың әр бірінде АТА екі құрылғысы мүмкін (яғни барлығы 4 құрылғы болуы мүмкін). Әрбір канал өзінде меншікті бөлімі енгізу/шығару кеңістігі болады. Бірінші канал үшін -1F0h-1F7h, екінші үшін - 170h-177h. Берілген кезеңде базалық порт ұғымын енгізу керек: жалпы бұны жақсырақ мына мысалда түсіндіріледі:

Порттар адрес келесі үлгіде қалыптасады: базалық _ порт + қызметтен алу .

Базалық _ порт 1F0h немесе 170h мағынасын жүктеп, сен қандай каналмен жұмыс істейсің, себебі порттар функциялары мысалы 1F3h және 173h әр түрлі IDE каналдары үшін сәйкес келеді.

Яғни бірінші каналға арналған базалық порт болып1F0h, екінші - 170h келеді, база ретінде бұл мағыналарды бір рет жүктеп, қалғаны порттар қызметтен алулармен адрестеуге болады, бір код екі каналмен жұмыс істей алатындай. Бұл контроллерге жүктіеу тағы жұп порттар қолданылады, бірінші каналға 3F6h -3F7h және оның әріптесіне арналған 376h -377h.

Порт номері | CHS | LBA | Read | Write
1F0h (170h) |  |  | Берілгендер порты | Берілгендер порты
1F1h (171h) |  |  | Қателер порты | Қасиеттер порты
1F2h (172h) |  |  | Секторлар есепшісі | Счетчик секторов
1F3h (173h) | Сектор номері | Адрес 0-7 |  |
1F4h (174h) | Цилиндр [0:7] | Адрес 8-15 |  |
1F5h (175h) | Цилиндр [8:15] | Адрес 16-23 |  |
1F6h (176h) | Головка және құрылғы номерә | Адрес 24-27,құрылғы |  |
1F7h (177h) |  |  | Жағдайы регистрі | Командалар регистрі
3F6h (376h) |  |  | Жағдайы регистрі | Басқарма
3F7h (377h) | қолданылмайды | --- | --- | ---

4 және 5 бағана, регистрде не бар, біз оқимыз ба немесе жазамыз ба екенін көрсетеді.

2 және 3 бағаналар адрестеу режимін білдіреді, CHS жүйесі соңғы күндерге жетеді, бұл жүйе физикалық дисктердің геометрияларға негізделген - адрес 3 бөлімдерден тұрады, Цилиндр-Головка-Сектор, осыдан жүйе атауы – Cylinder-Head-Sector - CHS шығады. Бұл ұғымды былай түсіндіруге болады, бірнеше дисктің жалпы шпиндельге отырғызылған. Әрбір диск жолдарға сынған,(концентриялы, немесе серіппелі), жоғарғы дискке үшін бір нөмірмен жол сәйкесінше төменгі диск жолдарында болады. Егер оларды ойдағыдай біріктірсе, олар цилиндрды құрастырады. Әрбір дискте 2 бет (олардың бірі, әрқашан қолданылмайды, ол сервометка деп аталатын ерекше облыстардың үшін қызмет етеді, ол арқылы диск контроллері ағымдағы головка жайын анықтайды және позиционерлеу уақытына керек цилиндрға "көзделеді". Сервометка берілгендерді жазуға арналған пластиналарда қатыса алады және тұрғызылған сервоқабат - embedded servo деп аталады, бірақ оның астына сенімділік мақсаттарда бөлек пластинаны белгілейді, ерекшеленген сервоқабат - dedicated servo деп аталады), әрбірі үшін өзіне головка бар. Және әйтеуір, цилиндр секторларға бөлінген.

Оған қарамастан CHS адрестеуде теориялық винчестер жұмыс істей алады, барлық жаңа құрылғыларда LBA қолданылады.

Бірақ математикта да максималды секторлар санын есептей алады, максималды цилиндрлар санын көбейтіп,головкалар және секторлар 65536*16*255=267386880 сектор, шамамен 127Гб тең, шынында BIOS цилиндрларды 1024 көбіреу шек қояды, секторлар 63 көбірек емес, бірақ головкалар барлығы 255. Нәтижесінде 1024*255*63=16450560 секторды аламыз, 8Гб тең (сектор өлшемі 512 байт).

Биосо сервисі 13h осы жүйені қолданады. CHS толық аппараттық деңгейде қолдану (диск барлығы көлемінің бағыттау мүмкіншілігімен) сервиссіз тек қана сол жағдайда, егер берілгендерді диск геометриясымен қайсыбір нақтылы орынға жазып қою, мысалы бірінші секторға N-цилиндр (кейде бұл файлдық жүйе әртүрлі құрылымдарының орналастыруы, мысалы FAT16(32) жүйесінде) секторлардың жүктелетін бөлімдері цилиндрлардың бірінші секторларына орын алады. Сервитарды қолданумен, мысалы, int 13h, басқа проблема тұрады:

Нақты физикалықпен геометриямен CHS жүйесі әлдеқашан сәйкес келді, барлық қазіргі дисктер зоналық жазуды қолданады (зоналық жазу – секторлар жолдарының өзгергіш саны; бұл сыртқы жолдар радиусы көбірек болумен байланысты, демек және онда секторларды көбірек орналасу мүмкін, ішкі жолдарда қарағанда), сондықтан трансляция адрестерінің ішкі жүйесі қолданылады. Нәтижесі белгісіз болады.

Басқасы LBA (Logical Block Addressing) адресация, мында жалғыз параметр бар – сектордың абсолютті нөмірі 0-ден басталады (CHS секторлары 1-ден номерленеді). Диск контроллері оны трансляциялайды. Диск физикалық ұйымшыл болады. Бұл жүйе128ГБ берілгендері адрестеуге рұқсат етеді. Барлық қазіргі винчестерлер және олардың драйверлері нақ осы жүйені қолданады, және біз сонымен қатар оның ерекше қарапайымының нәтижесінде жұмыс істейміз.

Лирикалық ретінде тек қана SCSI винчестерлер LBA жүйесінде жұмыс істейді және 2 Тбайт ақпаратты адрестеуге рұқсат етеді (32 бит адрестер үшін, ал ATA үшін 28).

Адресттеуді түсіндірдік, ендіконтроллер регистрін қарастырмыз.

Порт 1F0h (170h), 16-битті контроллер портымен жалғыз келеді, одан берілгендер қабылданады және винт жұмыс жанында оған жазылады.

Қателер порты, 1F1h порты команда орындалуынан кейін қателердің кодтарынан тұрады, егер онда барлық нольдер шықса, онда " барлық жақсы ".

1F2h регистрі топталған операцияларда қолданылады (секторлар тобы бір рет оқылады және жазылады), ол секторлардың есепшісі ролінде орындалады, оның мазмұны топтан әрбір сектор өңдеуінен кейін бірлікке азайып тұрады.

Келесі регистрлер 1F3h -1F6h адрестерді сақтайды. Мұнда барлығы түсінікті.

Біз жүйеде LBA жұмыс істегендіктен, CHS-де регитрлерді тағайындау адрестерінің сақтайтын бағаналары керек болмайды.

Регистр 1F6h өзгеше белгілеп қоюға тұрадығ оның раздряды адрестдер толық сақтамайды:

7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
1 | AM | 1 | DEV | LBA27 | LBA26 | LBA25 | LBA24

[0:3] разрядымен барлығы түсінікті – сонда сәйкес LBA адрестері бөлімін жазамыз.

5 және 7 биттер кейінге сақталған, онда әрқашан 1 болу тиісті.

АМ (Addressing Mode) биттері адрестеу режимін анықтайды - 0-CHS, 1-LBA. Біздің жағдайда онда әрқашан 1 болады.

Әйтеуір, басты бит DEV жеттік, (Master/Slave) каналда құрылғыны анықтайды, қалғаны порттарға не жазасың соның барлығы жатады.

0- Master ,1- Slave .

1F7h, ол жағдай регистрі, ол келесі форматта болады:

7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
BSY | DRDY | DF | DSC | DRQ | CORR | IDX | ERR

BSY - құрылғы команда орындалумен бос емес.

DRDY - құрылғы команда қабылдауына дайын.

DF - құрылғы жөнге келмейтін.

DSC - іздеу аяқталған.

DRQ - құрылғы берілгендермен айырбасқа дайын.

CORR - қате болды, бірақ берілгендер түзетілген болатын.

IDX - әр түрлі қайнарларда әр түрлі жазылған, бұл бит өндірушіге байланысты болады, және ең дұрыс шешім - оны қарапайым елемеу.

ERR - команда орындалу процесінде, қателер табылған болатын, яғни нақ 1F1h көрсетеді.

Біз тек қана нақты BSY, DRDY және DRQ биттерін қолданамыз. Егер винчестермен бәрі де жақсы болса, онда қалған биттер бізге пайдаға аспайды.

Енді, порт 3F6h - оған тек қана 1 және 2 биттер қолданылады.

1 - құрылғыдан үзу тиым салынған, 0- рұқсат етілген.

2 - құрылғылардың каналына барлық қосылғандардың бағдарламалық тастауы (оның орнатуы 1).

PIO хаттамасы.

Қазір алмастыру алгоритмін талдаймыз (хаттамамен).

PIO хаттамалары (Programmable Input/Output) келесі негізгі жайларда болады (үзіліссіз жұмыс кезінде):

Құрылғы даярлығының күту (BSY=0).

Каналда құрылғы нөмірін DEV жазып қою.

1F7h немесе 3F6h =1 оқып, BSY=0, DRDY=1 күту (бірінші каналға арналған).

Қалғаны параметрлер регистрге жазып қою.

Операция коды команда регистріне жазып қою.

BSY=0 орнатып жатқанда құрылғы регистр статусын оқу.

Берілгендер алмастыру даярлығының күту (DRQ=1)

Берілгендерді қабылдау (немесе жіберу).

Схема жалпыға бірдец, бірақ мәні, анық ойлаймын ...

Әзірше, BSY орнатып жатқанда 1, ештеңе істеуге болмайды, әзірше винчестері өз проблемаларыммен шешіп жатқанда және содан кейін кімен шұғылдануға дайын болады, және BSY=1канал жұмыс бастылығына көрсетеді , ал құрылғылар емес. Мында басқа құрылғыға қатынасу алдында, екі құрылғы бір каналда паралельді жұмыстар істеу мүмкін еместігін себеп болады, құрылғы каналына қосылған екеуі босау үшін болады, дәл осылай олар BSY битын өздері арасында бөліп алады.

DRDY=1 дисктің командаларға дайынындығын көрсетеді, сондықтан протоколға сәйкес битті талдау каналда құрылғы таңдауынан кейін тиісті болады: ол нақтылы таңдалған құрылғы жұмыс бастылықты көрсетеді. DRQ=1 дисктің берілгендерді алмастыруға дайындығын айтады. DRDY және DRQ арасындағы айырмашылықты түсіну мағызды. Портқа команда жібергеннен кейін, құрылғы DRDY=0 орнатады, команда орындалуымен құрылғы жұмыс бастылығына көрсетеді, және тек қана содан кейін, берілгендер ішкі буферде оқылады, құрылғыда DRQ=1 орнату, бұл протоколда, құрылғы келесі командаларды лезде қабылдауға дайындығы айтылмайды.

7 және 8 пункттегі талаптарға сай берілгендері алмастыру командалар үшін, актуалдығын жоғалтады. Үзулермен жұмыс жанында, құрылғыда командалар орындалуы аяқталысымен, құрылғыны үзу сауал орнатылады және оның өңдеушісі қалған жұмысты орындау керек (берілгендерді қабылдау және буферге орналастыру).

DMA режимінде алмастыру DMA каналымен болады, команда өңдеуінен кейін хостпен инициаланған. Құрылғы командалар өндеуден кейін, DMA сауалын орнатады, және жадтағы берілгендерді каналмен жібереді.

DMA режимі тек қана көптапсырмалы жүйелерде пайдалы, яғни процессорға шұғылданатын жұмыс бар, винчестер даярлығы күтуден басқа, яғни шұғылдану процессор басқа тапсырмаға ауыстырып қалады, ал қашан берілгендер болады, құрылғы үзу сауалымен хабарлайды. Біртапсырмалы ОЖ-де PIO режимі кейбір жағдайларда берілгендерді алмастыруды жоғары жылдамдықпен қамсыз етеді.

АТА командалары.

Енді ATA командаларын қарастырайық. Жалпы АТА командалары өте көп, стандартталғаны 20, бірақ олардың ішінде тек қана нақты 10 данасы қолданылады.

Біз бір сектор оқу/жазу командалары қарастырамыз, жинақтағыш идентификациясы, сонымен қатар винчестер аяқтау командалары (ол жалпы стандартқа кірмейді, бірақ винчестерлердің көпшілігі абсолютті сүйенеді), барлық ОЖ-де энергия тұтыну төмендетілген режимге компа аударалыды. Барлық мысалдар бірінші канал құрылғысына Master жатады, қалауын бойынша кез келген конфигурацияға жеңіл бейімдендіруге оларды болады.

Винчестерден секторларды оқуы келесі үлгідей көрсетіледі:

3F6h жазумен үзулер тиым салу

1F7h портта BSY битті оқу канал даярлығының күту

1F6h жазумен каналда құрылғы таңдау

DRDY=1 және BSY=0 күту

LBA адресін жүктеу.

(20h) оқу командасын жіберу

BSY=0 күту

(DRQ=1) берілгендермен алмастыру даярлығының күту

Порттан енгізу жол операциясымен 1F0h арқылы құрылғыдан берілгендерді қабылдау

Құрылғыдан үзуді рұқсат беру .

Міне мынау коды. (ESI адрес, ES=DS, берілгендер сегментте буфер сыйымдылығы 512 байт, 28 бит ESI құрылғыны адрестейді).

Жалпы 20h командасы нақты бір секторды оқу командасы болып келеді, винчестерлерінің көпшілігінде абсолютті регистр мазмұны 1F2h (секторлармен топталған операцияларға арналған есепші) ештенег әсер етпейді (листингіде ол қатыспайды), бірақ кейбір даналарда міндетті түрде оны 1 орнату керек, егер сіздердің винчестеріңізде берілген листингілер осы себеппен жұмыс істемесе, менімен байланысуды өтінмін (мануала соңысында пошташы).

    mov dx,3f6h        ;Үзулер тиым салу, 1 бит 1 регистра 3F6h орнату

    mov al,2h

    out dx,al

    mov dx,01f7h       ;Әзірше күтеміз BSY=1, егер  девайс бос емес жағдайда

    m1:

    in   al,dx

    test al,80h

    jnz  m1

    mov ecx,esi           ;LBA режимін таңдау және кейінге сақталған биттерді орнату

    shr ecx,24

    or  cl,0E0h

    mov dx,01f6h       ;Каналда құрылғыны таңдау

    mov al,cl

    out dx,al

    mov  dx,01f7h

    m2:                       ;Күтеміз, DRDY=1 и BSY=0

    in   al,dx

    test al,80h

    jnz  m2

    test al,40h

    jz   m2

    mov eax,esi

    mov dx,1f3h    ;Адресті жүктейміз

    out dx,al          ;LBA[0:7]

    mov dx,1f4h

    shr eax,8

    out dx,al          ; LBA [8:15]

    mov dx,1f5h

    shr eax,8

    out dx,al          ; LBA [16:23]

    mov dx,01f7h       ;Секторды оқк командасы

    mov al,020h

    out dx,al

    mov  dx,03f6h

    m3:                       ;және орындалғанша дейін қайтадан күтеміз

                                 ;регистрдің баламалық жағдайын оқимыз

    in   al,dx

    test al,80h

    jnz  m3

    mov  dx,01f7h

    m4:                        ;DRQ қалын қараймыз, егер 1 – берілгендер дайын

    in   al,dx

    test al,08h

    jz   m4

    cld                         ;DF в EFLAGS жалау тастауы

    lea di,buffer

    mov dx,01f0h

    mov cx,256          ;512 байт (1 сектор)

    rep insw               ;Берілгендерді қабылдау

mov dx,3f6h ; Құрылғыдан үзулерді рұқсат беру

    mov al,0

    out dx,al

" 5 минутта " сериядан, егер девайса жоқ болса, біз BSY, 0 болғанша дейін шексіз күтеміз. Бұл біріншіден. Екіншіден - егер оқумен проблемалар туса (біз "қайталап оқы" командасын қолданамыз, тағыда қайталаусыз оқу бар, оның коды 21h , егер сектор 1 ретте оқылмаса, демек тағдыр емес). Үшіншіден, оқу қателегінде тексеру жоқ және т.б.

Дискке жазу жағдайында, барлығы ұқсас орындалады, тек қана берілгендер жіберіледі, бірақ қабылданбайды. Дискке жазбас бұрын, алдымен қандай болмасын ескі девайсемен жаттығындар.

Теңестіру және аяқтау командаларын бөлек қарастырамыз.

IDENTIFY DEVICE командасы жинақтағыш туралы әртүрлі инфы бүтін секторын қайтарып береді, оның коды - EСh , параметрлер жоқ . Біз винчестер көлемін анықтаймыз, сектор форматының барлығын – кез келген жүйелік бағдарламалауға арналған сайтта табуға болады.

(ES буфер адресіндегі сегменттік бөлігі)

    mov dx,01f7h  ;Әзірше күтеміз BSY=0

    m1:

    in   al,dx

    test al,80h

    jnz  m1

    mov dx,01f6h ;Девайс таңдаймыз

    mov al,0E0h  ;LBA адрестеу (берілген жағдайда бұл принципті емес)

    out dx,al

    mov  dx,01f7h

    m2:                    ;Күтеміз DRDY=1 және BSY=0

    in   al,dx

    test al,80h

    jnz  m2

    test al,40h

    jz   m2

    mov dx,01f7h

    mov al,0ECh  ;Ech – идентификация командасының коды

    out dx,al

    mov  dx,03f6h ;

    m3:                  ;Әзірше барлығы дайын болғанша дейін күтеміз

    in   al,dx

    test al,80h

    jnz  m3

    mov  dx,01f7h

    m4:                  ; (DRQ=1) берілгендермен алмастыру даярлығын күтемез

    in   al,dx

    test al,08h

    jz   m4

    cld                   ;жалау DF=0

    mov di,offset buffer

    mov dx,01f0h

    mov cx,256     ;512 байт

    rep insw

    mov  ax,word ptr [buffer+60*2]

    ;60-61 буферде сөздар – дискта LBA режимде секторлардың жалпы саны;

    mov  dx,word ptr [buffer+61*2]

     ;В DX:AX – дисктің сектордағы көлемі.

Ал енді, винчестер аяқтау командасы. Барлық алдындағы пунктіге абсолютті ұқсас, тек қана коды - E6h, және 1F7h байтты E6h жібергеннен кейін, ешқандай берілгендерді қабылдаудың қажеті жоқ, ол ұйықтауға кетеді, (аяқтау процесі естіледі). Оны ояту үшін тастау керек(бит 2 в 3F6h орнатумен).

Тапсырма:

С дисктен 10-шы секторда жадқа оқу және файлға жазу.

С дисктен15565610-шы секторда бірлікт жүйелігімен жазу.

Әдебиет: 1, стр. 49-68; 7, стр. 35- 39.

Бақылау сұрақтар

1. ДК қолданатын стандартты IDE контроллері қаншат каналдарды сүйенеді?

2. CHS адресі неден тұрады?

3. Секторлардың максималды санын қалай есептейді?

4. LBA-адрестеу принципі неде ?

5. Винчестерден секторларды оқуы қалай болады?