НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ «ХПІ»
Лабораторна робота №11
з курсу “Системне програмне забезпечення”
на тему: “Дискові структури даних DOS“.
Виконав:
студент групи АП-30б
Попов О.С.
Перевірив:
Межерицький С. Г.
Тема: “Дискові структури даних 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дотство про вичерпання завдання.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.