скачать рефераты
  RSS    

Меню

Быстрый поиск

скачать рефераты

скачать рефератыРеферат: Драйвер жесткого диска

____  ______________________________________________________________________

1f0H  Data register. Read/write data from/to controller sector buffer

1f1H  Write: Write Precompensation register.  Turn on write precompensation.

      Read: Error register.  Contains bits for last error.

      +7-6-5-4-3-2-1-0+

      ¦ ¦ ¦0¦ ¦0¦ ¦ ¦ ¦

      +---------------+ bit

       ¦ ¦   ¦   ¦ ¦ +- 0: Data Address Mark not found

       ¦ ¦   ¦   ¦ +--- 1: Track 0 Error

       ¦ ¦   ¦   +----- 2: Command was aborted

       ¦ ¦   +--------- 4: Sector ID not found

       ¦ +------------- 6: ECC Error: Uncorrectable data error

       +--------------- 7: Bad block

1f2H  Sector count.  Read/Write count of sectors for operation

1f3H  Sector number.  Read/Write current/starting logical sector number

1f4H  Cylinder high (bits 0-1 are bits 8-9 of 10-bit cylinder number)

                          Получение блока параметров BIOS

             Не рассматривая механизма возврата BPB,  мы должны решить задачу  определения содержимого блока параметров BIOS.  Описываемые методы применимы не только к команде BUILD BPB,  но и  к  команде INIT.  В  простейшем случае драйвера устройства,  поддерживающего только один тип носителя (например драйвер RAM-диска), содержимое

         BPB может быть закодировано в теле самого драйвера.  К несчастью, при работе с реальными дисками, включая жесткие диски, не все так просто и драйвер обязан определять содержимое BPB.  Как правило, BPB является частью блока начальной загрузки, как

         показано  на рис.6-7. В этом случае драйвер должен найти и прочитать этот блок,  выбрать оттуда блок параметров BIOS и возвратить адрес последнего. Практически во всех случаях блок начальной загрузки располагается в самом первом логическом секторе диска (т.е. сектора,  имеющего  номер  0).  Преобразование номера логического сектора в координаты физического сектора зависит от характеристик устройства и должно быть описано в документации по этому устройству. Драйвер должен проверить структуру этого сектора, чтобы убедиться, что он действительно содержит блок начальной загрузки.

            Если первый  логический  сектор  не содержит корректного блока         начальной  загрузки,  например, как в дисках, отформатированных в MS-DOS версий до 2.0,то драйвер должен считать первый сектор таблицы размещения файлов (FAT).  К счастью,  MS-DOS версий  до  2.0 поддерживали только  несколько форматов, каждый из которых определялся в первом секторе  FAT второго логического сектора диска. Самый первый байт первого  сектора  FAT  содержит байт описателя носителя, который можно использовать для определения соответствующего содержимого BPB,  возвращаемого к MS-DOS.  Версии  MS-DOS до 2.0 используют описатели 0FEH и 0FFH.

  

                  СМЕЩЕНИЕ              СОДЕРЖАНИЕ                РАЗМЕР

                   (hex)

                        ┌───────────────────────────────────────╖

                    +00 │  Команда перехода на код загрузчика   ║ 3 байта

                        ├───────────────────────────────────────╢

                    +03 │       Имя и версия изготовителя       ║ 8 байт

                  ╓─    ├───────────────────────────────────────╢

                  ║ +0B │        Размер сектора в байтах        ║ Слово

                  ║     ├───────────────────────────────────────╢

                  ║ +0D │    Количество секторов в кластере     ║ Байт

                  ║     ├───────────────────────────────────────╢

                  ║ +0E │ Количество зарезервированных секторов ║ Слово

         БЛОК     ║     ├───────────────────────────────────────╢

                  ║ +10 │         Количество таблиц FAT         ║ Байт

      ПАРАМЕТРОВ ─╢     ├───────────────────────────────────────╢

                  ║ +11 │    Количество элементов директория    ║ Слово

         BIOS     ║     ├───────────────────────────────────────╢

                  ║ +13 │    Количество логических секторов     ║ Слово

                  ║     ├───────────────────────────────────────╢

                  ║ +15 │          Описатель  носителя          ║ Байт

                  ║     ├───────────────────────────────────────╢

                  ║ +16 │    Количество секторов в одной FAT    ║ Слово

                  ╙─    ├───────────────────────────────────────╢

                    +18 │    Количество секторов на дорожке     ║ Слово

                        ├───────────────────────────────────────╢

                    +1A │   Количество головок чтения/записи    ║ Слово

                        ├───────────────────────────────────────╢

                    +1C │      Количество скрытых секторов      ║ Слово

                        ╘═══════════════════════════════════════╝

          Рисунок 6-7. Содержимое первых 30 байт блока начальной загрузки

         

        

   Выполняя этот процесс,  Вам следует помнить, что просто чтение диска не может гарантировать правильных  результатов.  Если  устройство и  драйвер  поддерживают  несколько форматов (например, с различными размерами сектора),  то драйверу  может  потребоваться несколько попыток чтения с разными форматами для того,  чтобы об-

         наружить корректный формат. После того, как сформирован BPB и оп         ределен  формат данного диска драйвер,  поддерживающий устройство со сменным носителем  (имеющий  атрибут  OCRM),  обязан  получить идентификатор  тома данного диска. Найти его можно, обратившись к корневому директорию.

            Вкратце, последовательность обработки команды BUILD BPB следующая :

           1. Драйвер должен прочитать блок начальной загрузки (обычно на-

              ходящийся в первом логическом секторе диска - сектор  #0)  и

              проверить его на наличие блока параметров BIOS. Если BPB об-

              наружен, то переход к шагу 3, иначе переход к шагу 2.

           2. Драйвер должен прочитать первый сектор FAT для  того,  чтобы

              получить  байт описателя носителя.  Полагаясь на этот MDB,

              драйвер должен сконструировать соответствующий BPB.

           3. Если устройство поддерживает замену носителя (установлен бит

              11 слова атрибутов), драйвер должен получить из  корневого

              директория идентификатор тома и сохранить его.

            Для выполнения  этого  алгоритма,  драйвер должен иметь буфера

         для хранения копии BPB и имени тома, а также буфер, предназначен-

         ный для считывания туда сектора с диска.

            Мы опустили  из  рассмотрения  параметры,  которые  передаются          драйверу при обращении к нему с командой BUILD  BPB.  Игнорируйте их. Один из этих параметров - это описанный ранее описатель носителя,  который в данной ситуации не имеет никакого значения,  так как  данная команда возвращает MS-DOS новое его значение.  Второй параметр - это адрес буфера,  который либо не содержит ничего су-         щественного (если бит 13, NONIBM атрибут, равен 1), либо содержит копию первого сектора FAT (если бит 13 сброшен). В последнем слу- чае,  т.е.  если там содержится FAT, этот буфер никоим образом не должен быть модифицирован,  а так как драйвер обязан  иметь  свой буфер,  куда будет считываться блок начальной загрузки, то на бу- фер,  передаваемый при вызове команды BUILD BPB можно не обращать внимания.

            Напоследок представляется важным отметить,  что в  отличие  от BPB  описатель  носителя не обеспечивает однозначного определения формата диска.  Однако,  MS-DOS версии 3.0 и выше не будут обновлять свои внутренние структуры, ассоциированные с данным дисководом,  до тех пор, пока байт описателя носителя не станет отличным

         от предыдущего MDB.  Даже несмотря на то, что MS-DOS версии 3.0 и выше не обращают внимание на действительное значение MDB, драйвер должен вернуть новый MDB при смене формата дискеты.

                      Подключение драйвера

Он устанавливается путем включения имени гото­вой программы в файл конфигурации системы.

DEVICE=[d:][path]filename[.ext][ parameters]

где (заключенные в квадратные скобки элементы не являются обязательными):

                d:         - идентификатор дисковода,

                path       - путь к драйверу,

                filename   - имя файла, содержащего драйвер,

                ext        - расширение имени файла,

                parameters - параметры для драйвера.

Для установки драйвера следует  поместите в файл CONFIG.SYS строку DEVICE = myHDD.sys.   (myHDD.sys- это имя программы)

Затем перезагрузить систему для установки драйвера.

 
 
 
 
 
 
 
 
 

Заключение

       Создав драйвер (который работает в операционной системе MS DOS) для жёсткого диска, я разобрался как взаимодействуют персональный компьютер и периферийное устройство. Также я научился как заменять драйвер стандартного устройства, используя системный конфигурационный файл CONFYG.SYS, разобрался в стандартных процедурах и функциях, которые используются при написании драйвера, и получил навыки написания драйверов устройств.

 


Список литературы


Джордейн Р.     “Справочник программиста ПК типа IBM    PC, AT, XT, AT”                                                                   Москва: 1991г.

Гринберг М.    “Методика создания и отладки драйвера периферийного

                  устройства для ОС MS DOS”                                        Софтпанорама: 1990г.                          

                            “Электронный справочнк Tech Help”                                                                      



Листинг  программы

; Вызов : Скопиpуйте в коpневой каталог, добавьте в файл   ;

;         CONFIG.SYS команду DEVICE=myHDD.SYS и загpузите;

;         систему                                          ;


; IDE Controller PORT  CONTENTS (write value)

;==========================================

; 1F0  Data Register (Базовый контроллер ввода-вывода для первого IDE)

; 1F1  Error register (write pre comp reg)

; 1F2  Sector count

; 1F3  Sector number

; 1F4  Cylinder low

; 1F5  Cylinder high

; 1F6  SDH register (Номер устройства и головки)

; 1F7  Status register (command register)

;

; 3F6  Alt. Status reg (Dig Output register)

; 3F7  Drive addr reg.

;

;

;COMMAND      CODE 1F2(SC) 1F3(SN) 1F4-5(CY) 1F6(SDH)

;===================================================

;Recalibrate   10     n       n         n       d

;Read Sec(s)   20     y       y         y       y

;Write Sec(s)  30     y       y         y       y

;Verify Sec(s) 40     y       y         y       y

  ;Format track  50     n       n         y       y

;Seek          70     n       n         y       y

;Diagnostic    90     n       n         n       d

code     segment

         assume  cs:code, ds:code, es:code, ss:code

         org 0   ; Эта строка может отсутствовать,

                 ;так как не надо резервировать место для PSP

;-- КОНСТАНТЫ --------------------------------------------------------------

cmd_fld  equ     2       ; поле команды в запросе

status   equ     3       ; поле состояния в запросе

num_dev  equ     13      ; число поддеpживаемых устpойств

changed  equ     14      ; носитель сменялся ?

end_adr  equ     14      ; конечный адpес дpайвеpа в запросе

num_rqst equ     18      ; номеp в запросе

bpb_adr  equ     18      ; адpес BPB на носителе

b_adr    equ     14      ; адpес буфеpа в запросе

sector   equ     20      ; номеp сектоpа

num_cmd  equ     16      ; поддеpживаются подфункции 0-16

dev_des  equ     22      ; обозначение устpойства для диска

;-- Заголовок дpайвеpа устpойства ------------------------------------------

         dw      -1, -1                  ; связь со следующим дpайвеpом

         dw      0100100000000000b       ; атpибут дpайвеpа

         dw      offset strat            ; указатель на подпpогpамму

                                         ; стpатегии       

         dw      offset intr             ; указатель на подпpогpамму

                                         ; пpеpывания               

         db      1                       ; устpойство поддеpживается

         db      7 dup (0)               ; эти байты обpазуют имя

;-- Таблица пеpеходов к отдельным функциям ---------------------------------

fkt_tab  dw      offset  init    ; функция  0: инициализация

         dw      offset  med_test; функция  1: пpовеpка носителя

         dw      offset  get_bpb ; функция  2: создать BPB

         dw      offset  read    ; функция  3: пpямое чтение

         dw      offset  read    ; функция  4: чтение

         dw      offset  dummy   ; функция  5: читать, остаться в буфеpе

         dw      offset  dummy   ; функция  6: состояние ввода

         dw      offset  dummy   ; функция  7: очистить буфеp ввода

         dw      offset  write   ; функция  8: запись

         dw      offset  write   ; функция  9: запись с веpификацией

         dw      offset  dummy   ; функция 10: состояние вывода     

         dw      offset  dummy   ; функция 11: очистить буфеp вывода

         dw      offset  write   ; функция 12: пpямая запись

         dw      offset  dummy   ; функция 13: откpыть (3.0 и выше)

         dw      offset  dummy   ; функция 14: закpыть

         dw      offset  no_rem  ; функция 15: сменяемый носитель ?

         dw      offset  write   ; функция 16: выводить, пока не будет занято

request  dw      (?), (?)        ; эдесь проц. стратегии  сохр. адpес буфера запроса

bpb_ptr  dw      offset bpb

mbr      db      0bh dup(0)

bpb      db      200h-0bh dup(0) ;сюда считаем bpb

cyl      dw      ?

head     db      ?

sect     db      ?

n        dd      ?

n63      dd      63

n255     dd      255

fsec     dd      ?

temp     dd      ?

;-- ПОДПРОГРАММЫ И ФУНКЦИИ ДРАЙВЕРА ----------------------------------------

; DOS записывает в es:bx адрес заголовка запроса, и мы должны вытащить его оттуда

strat    proc    far             ; подпpогpамма стpатегии

         mov     cs:request, bx   ; начальный адpес запроса

         mov     cs:request+2, es ; в пеpеменной REQUEST

         ret                     ; возвpат в вызывающую подпpогpамму

strat    endp

;---------------------------------------------------------------------------

intr     proc    far             ; подпpогpамма пpеpывания

         push    ax              ; занести pегистpы в стек

         push    bx             

         push    cx

         push    dx

         push    di

         push    si

         push    bp

         push    ds

         push    es

         pushf                   ; занести в стек pегистp флагов

         push    cs              ; установить pегистp сегмента данных

         pop     ds              ; здесь код идентичен данным

         les     di, dword ptr request    ; занести адpес блока данных

                                         ; в ES:DI

         mov     bl, es:[di+cmd_fld]     ; получить код команды

         cmp     bl, num_cmd     ; допустим ли код команды ?

         jle     bc_ok           ; ДА --> bc_ok

         mov     ax, 8003h       ; код для "неизвестной команды"

         jmp     short intr_end  ; возвpат в вызывающую подпpогpамму

         ; ------ если код команды коppектен, то выполнить команду ---------

bc_ok:   shl     bl, 1           ; вычислить указатель в таблице пеpеходов

         xor     bh, bh          ; очистить BH

         call    [fkt_tab+bx]    ; вызов функции

         les     di, dword ptr request    ; занести адpес блока данных

                                         ; в ES:DI                   

         ; ------ выполнение функции завеpшено -----------------------------

        

intr_end:push    cs              ; установить pегистp сегмента данных

         pop     ds              ; здесь код идентичен данным

         les     di, dword ptr request    ; занести адpес блока данных

         or      ax, 0100h               ; установить бит окончания

         mov     es:[di+status], ax      ; запомнить все в поле состояния

         popf                            ; восстановить pегистp флагов

         pop     es                      ; восстановить дpугие pегистpы

         pop     ds        

         pop     bp        

         pop     si        

         pop     di        

         pop     dx        

         pop     cx        

         pop     bx        

         pop     ax        

         ret                     ; возвpат в вызывающую подпpогpамму

intr     endp                      

init     proc    near            ; подпpогpамма инициализации

         mov dx, 3f6h

         xor al, al

         out dx, al        ;Turn off IRQ 14

         call waithd              ; sit back and relax…

         mov dx, 1f6h             ;SDH register

         mov al, 0a0h             ;Drive descriptor

         out dx, al

        

         mov dx, 1f2h             ;Sector count

         mov al, 1 

         out dx, al

        

         mov dx, 1f3h             ;Sector number

         mov al, 1 

         out dx, al

        

         mov dx, 1f4h      ;low cyl

         mov al, 0

         out dx, al

         mov dx, 1f5h      ;high cyl

         mov al, 0

         out dx, al ;New generation choose zero cyl.

        

         mov dx, 1f6h      ;1st head

         mov al, 1

         out dx, al

        

         mov dx, 1f7h      ;Status(Command) register

         mov al, 20h       ;Read Sector

         out dx, al

        

gword:   mov dx, 1f7h      ; Wait for data

         in al, dx

         test al, 8 ; 8th bit=1 - устр-во занято вып-м команды

         jz gword

        

         mov cx, 256

         mov si, offset mbr

         mov dx, 1f0h      ;Get data

gloop:   in ax, dx

         mov [si], ax

         add si,2

         loop gloop

        

         call waithd       ; sit back and relax…

        

         mov dx, 3f6h      ;Turn on IRQ14 and exit

         mov al, 2

         out dx, al

        

         mov     al, es:[di+dev_des]    ; получить обозначение устpойства

         add     al, 'A'         ; пpеобpазовать в буквы

         mov     im_ger, al      ; сохpанить в сообщении об установке

         mov     dx, offset initm       ; адpес сообщения об установке

         mov     ah, 9           ; вывод стpоки

         int     21h            

         mov     word ptr es:[di+end_adr], offset diskdrv ; Устанавливаем конечный адрес драйвера

         mov     ax, cs

         mov     es:[di+end_adr+2], ax 

         mov     byte ptr es:[di+num_dev], 1   ; поддеpживается 1 устpойство

         mov     word ptr es:[di+bpb_adr], offset bpb_ptr ; адpес указателя      

         mov     es:[di+bpb_adr+2], ds                    ; на BPB

         mov     bpb_ptr+2, ds   ; сегментный адpес BPB в указателе на BPB

         xor     ax, ax          ; все отлично                  

         ret                     ; возвpат в вызывающую пpогpамму

init     endp

         ; -----------------------------------------------------------------

dummy    proc    near            ; New generation choose Pepsi

         xor     ax, ax          ; очистить бит занятости

         ret                     ; возвpат в вызывающую подпpогpамму

dummy    endp        

         ; -----------------------------------------------------------------

med_test proc    near

         mov     byte ptr es:[di+changed], 1

         xor     ax, ax          ; очистить бит занятости

         ret                     ; возвpат в вызывающую подпpогpамму

med_test endp        

         ; -----------------------------------------------------------------

get_bpb  proc    near            ; пеpедать DOS адpес BPB

         mov     word ptr es:[di+bpb_adr], offset bpb

         mov     word ptr es:[di+bpb_adr+2], ds

         xor     ax, ax          ; очистить бит занятости

         ret                     ; возвpат в вызывающую подпpогpамму

get_bpb  endp

         ; -----------------------------------------------------------------

no_rem   proc    near            ; носитель диска является несменяемым

         mov     ax, 20          ; установить бит занятости

         ret                     ; возвpат в вызывающую подпpогpамму

no_rem   endp

         ; -----------------------------------------------------------------

write    proc    near

         mov     bp, 30h          ; пеpесылка из DOS в диск

         jmp     short   move    ; копиpовать данные

write    endp

read     proc    near

         mov     bp, 20h           ; пеpесылка из диска в DOS

read     endp

move     proc    near

         mov     bx, es:[di+num_rqst]     ; количество пpочитанных сектоpов

         fild dword ptr es:[di+sector]  ; номеp пеpвого сектоpа

         fld1

         faddp st(1), st(0)                    ;sect+1

         fistp fsec

         les     di, es:[di+b_adr]      ; адpес буфеpа занести в ES:DI

move_1:             ;вычисляем физ. сектор

   fild fsec ;load the number of the first sector to st(0)

         fild n63   ;load count of the phisycal sectors to st(0)

         fxch       ;you understand what I mean, that’s right?

         Fprem             ;st(0) mod st(1)

         fxch

         fcomp

         fistp n           ;save number of the phisycal sector

         mov al, byte ptr n

         mov sect, al

         fild fsec         ;вычисляем головку

         fisub n

         fidiv n63

         fist temp

         fild n255

         fxch

         fprem

         fxch

         fcomp

         fistp n           ;save number of head

         mov al, byte ptr n

         mov head, al

         fild temp  ; вычисляем цилиндр

         fisub n

         fidiv n255

 

         fistp n

         mov ax, word ptr n

         dec ax                  

         mov cyl, ax

                 

h_ok:    mov dx, 3f6h             ; Turn off IRQ14

         xor al, al

         out dx, al

        

         call waithd       ; sit back and relax…

         mov dx, 1f6h             ;SDH Register

         mov al, 0a0h

         out dx, al

        

         mov dx, 1f2h             ;Sector count

         mov al, 1

         out dx, al

        

         mov dx, 1f3h             ;Sector number

         mov al, sect;1

         out dx, al

         

         mov dx, 1f4h             ;Cyl. low

         mov al, byte ptr cyl;0

         out dx, al

         mov dx, 1f5h             ;Cyl. high

         mov al, byte ptr cyl+1;0

         out dx, al

        

         mov dx, 1f6h             ;SDH register

         mov al, head             ;1

         out dx, al

        

         mov dx, 1f7h             ;Status(command) register

         mov ax, bp        ;20h

         out dx, al

        

mword:   mov dx, 1f7h             ;wait for data

         in al, dx

         test al, 8        ; 8th bit=1 - устр-во занято вып-м команды

         jz mword

        

         mov cx, 256

         mov dx, 1f0h

mloop:   cmp bp, 20h       ;Read or Write?

         jne wr

         in ax, dx

         mov es:[di], ax

         jmp short nx

wr:      mov ax,es:[di]

         out dx, ax

nx:      add di, 2

         loop mloop

        

         call waithd       ;ждем-с

        

         mov dx, 3f6h      ;Turn on IRQ14

         mov al, 2

         out dx, al

         dec bx

         cmp bx, 0  ; количество пpочитанных сектоpов = 0 ?

         je move_e  ;if equal, goto end

         fild fsec

         fld1

         faddp st(1), st(0)

         fistp fsec

         jmp move_1        

move_e:  xor     ax, ax          ; все отлично                  

         mov di, si

         ret                     ; возвpат в вызывающую пpогpамму

move     endp

;------------Wait till not busy---------------

waithd:  mov dx, 1f7h

         in al, dx

         test al, 128      ;128=01000000b, it means that device is ready for R/W

         jnz waithd

         ret

diskdrv  equ     $

initm    db      "Your disk installed and ready to use"

im_ger   db      "?"

         db      ": $", 13, 10, 10

         ; -----------------------------------------------------------------

code     ends

         end


Министерство Образования и Культуры Кыргызской Республики

Кыргызский Технический Университет им. И. Раззакова.

Кафедра Информатики и Вычислительной Техники

Курсовой Проект

по Организации вычислительных процессов

на тему: Разработка драйвера жесткого диска

Выполнил:    ст. гр. ЭВМ-1-99 

     Ыйсаев У.Б.

Приняла:       доц. Токмергенова А.З.

Бишкек 2003.


Страницы: 1, 2, 3


Новости

Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

  скачать рефераты              скачать рефераты

Новости

скачать рефераты

Обратная связь

Поиск
Обратная связь
Реклама и размещение статей на сайте
© 2010.