Дискові структури даних DOS. Визначення номерів кластерiв диску

Страницы работы

Содержание работы

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ «ХПІ»

Кафедра “Обчислювальна техніка та програмування”

Лабораторна робота №11

з курсу “Системне програмне забезпечення”

 на тему: “Дискові структури даних DOS“.

Виконав:             

                                 студент  групи АП-30б   

                                               Попов О.С.

Перевірив:

       Межерицький С. Г.

Харків 2002

Тема: “Дискові структури даних DOS”.

Мета: Отримання практичних навичок роботи з FAT.

Постановка задачі №1: Визначити номери усiх кластерiв  диску,  якi  займає  заданий викладачем файл у поточному каталозi.

Структура програми.

Програма складається  з головної функції main() та одинадцяти допомiжних функцiй.

    void Read_Mbr(void) - функцiя читання MBR та пошуку потрiбного роздiлу.

    void Read_Boot(void) - функцiя читання  boot-сектору.

    void Get_First(void) - функцiя визначення  абсолютного номеру сектору початку логiчного диску.

    void Read_Fat(void) - функцiя читання FAT.

    void Read_13(void  *mem) - функцiя читання сектора за допомогою переривання 13.

    void Sect_to_Daddr(dword  sect) - функцiя формування фізичної дискової адреси з # сектору.

    dword Clust_to_Sect(word  clust)  - функцiя визначення номеру сектора за номером кластеру.

    word Next_Clust(word  clust)  -  функцiя  вибiрки  наступного кластеру з FAT.

    char *Get_Name(char *s,  char *d) - функцiя видiлення наступного елементу iз строки-завдання.

    int Find_Name() - функцiя пошуку iменi у каталозi.

    void End_of_Job(int n) - функцiя видачи повiдомлень  або аварiйного завершення.

Опис змінних.

 У програмi описанi структури такого виду:

Фiзична дискова адреа:

struct DADDR { };

Структура елемента роздiлу;

struct PART { };

Стpуктуpа Головного Завантажувального Запису;

struct MBR

       { };

Структура кореневого запису;

struct BootRec { };

Структура елемента змiсту;

struct Dir_Item { };

Змінні глобальні для всієї програми :

    part - поточний елемент роздiлу;

    buff1[512] - буфер MBR та boot;

    *mbr - покажчик на таблицю роздiлiв;

    *boot - покажчик на кореневий запис;

    buff2[512] - буфер каталогу та тексту;

    *dir - покажчик на частину каталогу;

    *text - покажчик на текстовий буфер ;

    *fat - покажчик  на FAT;

    job[81] - строка-завдання;

    jobptr - поточний покажчик у job;

    cname[12] - поточне iм`я для пошуку;

    Fdisk - фiзичний номер диску;

    caddr - поточна дискова адреса;

    sect - поточний  номер сектору;

    clust - поточний  номер кластеру;

    fat16 - ознака формату FAT;

    fsize - розмiр файлу;

    dirnum - номер елемента у змiстi;

    FirstSect - абсолютний номер сектору початку;

    rootdir=1 - ознака кореневого каталогу або пiдкаталогу (1/0);

    lastsect - останнiй сектор при читаннi;

    fatalloc=0 - ознака виділення пам`ятi.

Опис алгоритму програми.

Функцiя main запитує iм`я файла,  потiм оброблює його i, якщо все нормально,  то запускає допомiжнi функції, які необхiднi для просмотру FAT заданого файла.

    Функцiя Read_Mbr виконує вибiрку  елемента з таблицi  роздiлiв для заданого диска.

    Функцiя Read_Boot зчитує boot-сектор логiчного диска, причому для гнучкого диска адреса цього сектора назначається - 0, 0, 1, а для жорсткого - вибирається з part.

    Функцiя Get_First  визначає абсолютний номер початкового сектора логiчного диска та зберiгається  у  змiннiй  First_Sect.  Це значення пiдраховується з фiзичної адреси початку,  яка береться з полiв Begin_Hd, Begin_SecTrk елемента таблицi роздiлiв.

    Функцiя Read_Fat зчитує у пам`ять FAT цiлком,  адреса початку FAT на диску  та  її  розмiр  визначаються  з  ранiше  прочитаного Boot-сектора.

    Функцiя Read_13 читає один  сектор  за  допомогою  преривання BIOS.

    Функцiя Sect_to_Daddr перетворює номер  логiчного  сектора  у фiзичну адресу.

    Функцiя Clust_to_Sect перетворює номер кластера у номер  сектора.

    Функцiя Next_Clust  визначає   номер   наступного   кластера, аналiзуючи FAT. Для останнього кластера (i для кореневого каталогу) ця функцiя повертає нульове значення.

    Функцiя Get_Name  призначена для лексичного розбору завдання, вона видiляє з завдання чергове слово  та  переназначає  jobptr. Пусте  (NULL) значення jobptr - свiдотство про вичерпання завдання.

Похожие материалы

Информация о работе