Розрахункова СЗіВІ / Розрахункова робота / MMC_SD_FAT16 / Методичка_5
.pdf
2. Структура файлової системи FAT16
Файлова система FAT16 (англ. FAT – File Allocation Table) широко використовується в таких носіях інформації як змінні карти пам’яті, USB Flash Drive накопичувачі, жорсткі диски та ін. Надалі будемо розглядати FAT16 саме для MMC/SD-карт пам’яті, хоча більшість положень буде справедливо і для інших носіїв.
Використання FAT16 в MMC/SD-картах пам’яті означає, що дані на них структуровані у вигляді файлів. Підтримку файлової системи здійснює хост-мікропроцесор.
Вся область MMC/SD-карти розбита на сектори розміром512 байт (рис. 6). Це число також вказано в полі"Bytes/Sector" у Volume Boot Record. Файлова система розподіляє пам’ять лише з області даних, причому використовує в якості мінімальної одиниці дискового простору кластер. Кластер складається з одного або декількох послідовних секторів. Кількість секторів у кластері вказана в полі"Sectors/Cluster" у Volume Boot Record. Типові значення для MMC/SDкарт наведені в табл. 1.
|
Табл. 1. Типові розміри кластерів для карт різного об’єму |
|
|
|
|||
|
Об’єм носія даних |
|
Кількість секторів в кластері |
|
Розмір кластеруFAT16 |
|
|
|
7 MB–16 Mбайт |
|
4 |
|
2 Kбайт |
|
|
|
17 MB–32 Mбайт |
|
1 |
|
512 Байт |
|
|
|
33 MB–64 Mбайт |
|
2 |
|
1 Kбайт |
|
|
|
65 MB–128 Mбайт |
|
4 |
|
2 Kбайт |
|
|
|
129 MB–256 Mбайт |
|
8 |
|
4 Kбайт |
|
|
|
257 MB–512 Mбайт |
|
16 |
|
8 Kбайт |
|
|
|
513 MB–1 Гбайт |
|
32 |
|
16 Kбайт |
|
|
|
FAT16 складається з 5 частин, які наведені в таблиці 2. |
|
|
|
|||
|
|
|
|
|
|
||
|
Табл. 2. Складові частини файлової системи FAT16 |
|
|
|
|||
|
Область |
Призначення |
|
||||
|
Master Boot Record (MBR) |
Містить код початкового завантаження операційної системи та |
|||||
|
|
|
базову інформацію про носій і його партиції. |
||||
|
Volume Boot Record (VBR) |
Містить параметри форматування партиції необхідні для роботи |
|
||||
|
|
|
з нею. |
|
|
|
|
|
FAT-таблиці |
Основна і резервніFAТ-таблиці зберігають інформацію про |
|||||
|
|
|
розміщення файлів в області даних. |
|
|
|
|
|
Кореневий каталог (Root Directory) |
Містить інформацію про файли(ім’я, розширення, розмір і т. д.). |
|
||||
|
Область даних (Data Region) |
Призначена для розміщення файлів. |
|
|
|
||
Якщо MMC/SD-карта пам’яті є системною, то нульовий сектор – це завжди Master Boot Record.
Структура Master Boot Record сектора наведена в табл. 3. Він містить інформацію про носій та його партиції (Partitionen, те саме що Volume).
Табл. 3. Структура Master Boot Record
Позиція |
Розмір |
Поле |
|
Значення/Діапазон |
байту |
(байтах) |
|
||
|
|
|
||
0х000 |
446 |
Master Boot Code (Програма |
початкового |
|
|
|
завантаження операційної системи) |
|
|
0х1be |
16 |
Partition Table Entry (Запис партиції 1) |
|
Див. далі |
0x1ce |
16 |
Partition Table Entry (Запис партиції 2) |
|
Див. далі |
0x1de |
16 |
Partition Table Entry (Запис партиції 3) |
|
Див. далі |
0x1ee |
16 |
Partition Table Entry (Запис партиції 4) |
|
Див. далі |
0x1fe |
1 |
Signature (Сигнатура) |
|
0х55 |
0x1ff |
1 |
Signature (Сигнатура) |
|
0хaa |
Кожен запис партиції (Partition Table Entry) пов’язаний з Volume Boot Record та містить наступну інформацію представлену в табл. 4.
10
Табл. 4. Структура Partition Table Entry |
|
|
|
|
|
|
|
|
|
||
Позиція |
Розмір |
Поле |
|
Значення/Діапазон |
|
|
|
||||
байту |
(байтах) |
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
||
0х0 |
1 |
Boot descriptor (Дескриптор завантаження) |
0х00 – non-bootable device |
|
|
|
|||||
|
|
|
|
0х80 – bootable device |
|
|
|
||||
0х1 |
3 |
First Partition Sector (Номер |
першого |
Номер першого сектору |
|
|
|
||||
|
|
сектору партиції) |
|
(ігнорується) |
|
|
|
|
|
||
0x4 |
1 |
File System descriptor |
|
0x00 |
– empty |
|
|
|
|
|
|
|
|
|
|
0x01 |
= FAT12 |
|
|
|
|
|
|
|
|
|
|
0x04 |
= FAT16 < 32 MB |
|
|
|
|||
|
|
|
|
0x06 |
= FAT16 >= 32 MB |
|
|
|
|||
|
|
|
|
0x0B = FAT32 |
|
|
|
|
|
||
0x5 |
3 |
Last Partition Sector (Номер |
останнього |
Номер останнього |
сектору |
|
|
|
|||
|
|
сектору партиції) |
|
(ігнорується) |
|
|
|
|
|
||
0x8 |
4 |
First Sector Position (Позиція |
першого |
Номер |
першого |
сектору |
|
||||
|
|
сектору від початку MBR) |
|
VBR |
|
|
|
|
|
|
|
0xс |
4 |
Number of Sectors in Partition |
(Кількість |
Від |
1 |
до |
максимальної |
|
|
|
|
|
|
секторів в партиції) |
|
кількості |
|
секторів |
у |
||||
|
|
|
|
MMC/SD-карті |
|
|
|
|
|
||
Якщо носій не є системним (а так переважно і є для MMC/SD-карт пам’яті), то Master Boot Record може бути відсутнім і в нульовому секторі зразу розташовуєтьсяVolume Boot Record, який містить інформацію про форматування карти (рис. 15).
Рис. 15.
VBR складається з полів представлених у табл. 5.
Табл. 5. Структура Volume Boot Record
Позиція |
Розмір |
|
|
Поле |
|
Значення/Діапазон |
байту |
(байтах) |
|
|
|
||
|
|
|
|
|
||
0х000 |
3 |
Команда переходу JUMP |
|
0xeb 0xXX 0x90 |
||
0x003 |
8 |
OEM Name (Ім’я виробника) |
|
ХХХ |
||
0х00b |
2 |
Bytes/Sector (Байт на сектор) |
|
512 (0х00 0х02) |
||
0x00d |
1 |
Sectors/Cluster (Секторів на кластер) |
XXX (1-64) |
|||
0x00e |
2 |
Reserved |
sectors |
(Кількість зарезервованих |
ХХХ |
|
|
|
секторів з початку карти включно з Boot |
|
|||
|
|
Sector) |
|
|
|
|
0x010 |
1 |
Number of FAT’s (Кількість таблиць FAT) |
2 |
|||
0x011 |
2 |
Number of Root Directory Entries (Кількість |
512 |
|||
|
|
записів |
в |
кореневому |
каталозіRoot |
|
|
|
Directory) |
|
|
|
|
11
0x013 |
2 |
Number of sectors on media (Кількість |
XXX (якщо карта має більше |
|
||||
|
|
секторів носія) |
|
65535 секторів, це поле рівне 0, |
|
|||
|
|
|
|
а встановлюється поле ‘Number |
|
|||
|
|
|
|
of total sectors’) |
|
|
||
0x015 |
1 |
Media descriptor (Тип носія) |
|
0x0f = Hard disk |
|
|
||
0x016 |
2 |
Sectors/FAT (Кількість секторів в таблиці |
XXX |
|
|
|
|
|
|
|
FAT) |
|
|
|
|
|
|
0x018 |
2 |
Sectors/Track (Кількість треків) |
|
32 (немає значення) |
|
|
||
0x01a |
2 |
Number of Heads (Кількість головок) |
2 (немає значення) |
|
|
|||
0x01c |
4 |
Number of hidden sectors (Кількість |
0 |
|
|
|
|
|
|
|
прихованих секторів) |
|
|
|
|
|
|
0x020 |
4 |
Number of total sectors (Загальна кількість |
XXX |
|
|
|
|
|
|
|
секторів) |
|
|
|
|
|
|
0x024 |
1 |
Drive number (Номер диску) |
|
0 |
|
|
|
|
0x025 |
1 |
Reserved (Зарезервовано) |
|
0 |
|
|
|
|
0x026 |
1 |
Extended boot signature (Розширена |
0x29 |
|
|
|
|
|
|
|
сигнатура) |
|
|
|
|
|
|
0x027 |
4 |
Volume ID or serial number (ID тому) |
XXX |
|
|
|
|
|
0x02b |
11 |
Volume label (Мітка тому) |
|
XXX |
|
(ASCII-символи |
|
|
|
|
|
|
доповнені |
пробілами (0х20) |
|
||
|
|
|
|
якщо ім’я менше 11 символів) |
|
|||
0x036 |
8 |
File system type (Тип файлової системи) |
XXX |
(ASCII-символи, |
які |
|
||
|
|
|
|
ідентифікують |
тип |
файлової |
||
|
|
|
|
системи FAT12 або FAT16) |
||||
0x03e |
448 |
Load program code (Код |
початкового |
XXX |
|
|
|
|
|
|
завантаження) |
|
|
|
|
|
|
0x1fe |
1 |
Signature (Сигнатура) |
|
0x55 |
|
|
|
|
0x1ff |
1 |
Signature (Сигнатура) |
|
0xaa |
|
|
|
|
*XXX – залежить від MMC/SD-карти або невизначене значення.
На рис. 16 наведено вміст нульового сектора miniSD-карти пам’яті, в якому розташовано
VBR (MBR відсутній).
Рис. 16.
Рис. 17 містить розшифрування полів VBR.
12
Рис. 17.
Для збільшення надійності у FAT16 використовують дві ідентичні таблиці FAT1 і FAT2. Таблиця FAT (як основна копія, так і резервна) складається з масиву2-х байтних індексних вказівників (записів), кількість яких рівна кількості кластерів області даних. Між кластерами та індексними вказівниками існує взаємнооднозначна відповідність– нульовий вказівник відповідає нульовому кластеру, N-ий вказівник відповідає N-му кластеру і т. д.
Індексний вказівник може приймати наступні значення, які характеризують стан пов’язаного з ним кластера:
Число |
Значення |
0х0000 |
Кластер вільний (не використовується) |
0х0002 - 0хFFEF |
Кластер використовується і не є останнім кластером файлу– містить |
|
номер наступного кластеру у файлі |
0хFFF0 – 0хFFF6 |
Зарезервований кластер |
0хFFF7 |
Дефектний кластер |
0хFFF8 – 0хFFFF |
Останній кластер файлу |
Кожен файл складається з послідовності кластерів. Навіть якщо файл займає 1 байт йому виділяється цілий кластер. Послідовність номерів кластерів, в яких записаний файл, утворює список кластерів. Список будується таким чином: номер першого кластеру читається зRoot Directory, у відповідному вказівнику FAT при цьому вказаний номер другого кластеру. У записі для другого – номер третього і т. д. поки не досягнуто кінець списку (рис. 18).
Перші 4 байти FAT – обов’язковий підпис, який означає, що це початок FAT. Тому немає нульового і першого кластерів, зразу за Root Directory знаходиться кластер даних з номером
0002.
В початковому стані(після форматування) всі кластери вільні і всі індексні вказівники приймають значення "Кластер вільний" – 0х0000.
13
ü
ï
ý
ï
þ
|
|
|
Рис. 18. |
|
|
|
|
|
|
|
|
|
|
|
|
|
Кожен запис кореневого каталогу (Root Directory Entry) має розмір 32 байти, містить |
||||||||||||||
інформацію про файл і складається з полів представлених у табл. 6. |
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Табл. 6. Структура Root Directory Entry |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
Позиція |
Розмір |
Поле |
|
|
|
|
Значення/Діапазон |
|
|
|
|
|||
|
байту |
(байтах) |
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
0х00 |
8 |
DIR_FileName (Ім’я файлу) |
|
ASCII-символи |
доповнені |
пробілами |
|
|||||||
|
|
|
|
|
(0х20), якщо довжина менше 8. |
|
|
|
|
||||||
|
|
|
|
|
Якщо перший байт 0х00 – запис |
|
|||||||||
|
|
|
|
|
вільний і не використовується; |
|
|
|
|
||||||
|
|
|
|
|
Якщо 0хЕ5 – файл |
вилучений, запис |
|
||||||||
|
|
|
|
|
вільний. |
|
|
|
|
|
|
|
|
||
|
0x08 |
3 |
DIR_Extension (Розширення |
файлу) |
ASCII-символи |
доповнені |
пробілами |
|
|||||||
|
|
|
|
|
|
(0х20), якщо довжина менше 3 |
|
|
|
|
|||||
|
0х0В |
1 |
DIR_Attribute (Атрибути файлу) |
|
ATTR_LONG_NAME 0x0F |
|
|
|
|
||||||
|
|
|
|
|
|
ATTR_READ_ONLY 0x01 |
|
|
|
|
|||||
|
|
|
|
|
|
ATTR_HIDDEN |
|
0x02 |
|
|
|
|
|||
|
|
|
|
|
|
ATTR_SYSTEM |
|
0x04 |
|
|
|
|
|||
|
|
|
|
|
|
ATTR_VOLUME_ID 0x08 |
|
|
|
|
|||||
|
|
|
|
|
|
ATTR_DIRECTORY |
0x10 |
|
|
|
|
||||
|
|
|
|
|
|
ATTR_ARCHIVE |
|
0x20 |
|
|
|
|
|||
|
0x0C |
1 |
Reserved (Зарезервовано) |
|
0 |
|
|
|
|
|
|
|
|
|
|
|
0х0D |
1 |
DIR_CrtTimeMsc (Час |
створення |
|
Значення від 0-199 (1 відповідає 10 мс) |
|
||||||||
|
|
|
файлу в мілісекундах) |
|
|
|
|
|
|
|
|
|
|
|
|
|
0x0E |
2 |
DIR_CrtTime (Час створення файлу) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Біти |
|
Опис |
|
|
|
|
|
|
|
|
|
|
|
|
|
15-11 |
|
|
Година (0-23) |
|
|
|
|
||
|
|
|
|
|
|
10-5 |
|
|
Хвилина (0-59) |
|
|
|
|
||
|
|
|
|
|
|
4-0 |
|
|
Секунда/2 (0-29) |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0x10 |
2 |
DIR_CrtData (Дата створення файлу) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Біти |
|
|
Опис |
|
|
|
|
|
|
|
|
|
|
|
|
15-9 |
|
Рік (0=1980, 127=2107) |
|
|
|||||
|
|
|
|
|
|
8-5 |
|
Місяць (1-12) |
|
|
|
|
|||
|
|
|
|
|
|
4-0 |
|
День (1-31) |
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
||||||
|
0x12 |
2 |
DIR_LastAccDate (Дата останнього |
|
АналогічноDIR_CrtData |
|
|
|
|
||||||
14
|
|
доступу до файлу) |
|
|
|
|
|
|
0x14 |
2 |
Reserved (Зарезервовано) |
|
|
0 |
|
|
|
0х16 |
2 |
DIR_LastWrtTime (Час |
останнього |
Аналогічно DIR_CrtTime |
||||
|
|
запису у файл) |
|
|
|
|
|
|
0х18 |
2 |
DIR_LastWrtDate (Дата |
останнього |
Аналогічно DIR_CrtData |
||||
|
|
запису у файл) |
|
|
|
|
|
|
0х1А |
2 |
DIR_FstCluster (Номер |
|
першого |
0х0002 - 0хFFEF |
|||
|
|
кластеру з даними файлу) |
|
|
|
|
|
|
0x1C |
4 |
DIR_FileSize (Розмір |
файлу |
XXXв |
||||
|
|
байтах) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ì
ï
ï
ï
í
ï
ï
ï
ï
î
Рис. 19.
Для запису файлу хост-мікроконтролер переглядає таблицюFAT, починаючи з початку і шукає перший вільний індексний вказівник. Після його виявлення в полі записуRootDirectory DIR_FstCluster записується номер цього вказівника. В кластер з цим номером записуються дані файлу, він стає першим кластером файлу. Якщо файл поміщається в одному кластері, то у вказівник, який відповідає даному кластеру заноситься спеціальне значення"Останній кластер файлу" – 0хFFFF. Якщо ж розмір файлу більше одного кластера, то мікроконтролер продовжує перегляд FAT і шукає наступний вказівник на вільний кластер. Після його виявлення в попередній вказівник заноситься номер цього кластера, який тепер стає наступним кластером файлу. Процес повторюється до тих пір, поки не будуть розміщені всі дані файлу. Таким чином створюється зв’язаний список (ланцюг) всіх кластерів файлу.
При видалені файлу з файлової системиFAT в перший байт відповідного записуRoot Directory заноситься спеціальний маркер 0xE5 – який вказує "Файл вилучений, запис вільний". Решта даних в запису каталогу, в тому числі номер першого кластера файлу, залишаються незмінними, що дає шанси для відновлення помилково видаленого файлу.
На рис. 20 наведено приклад, який ілюструє зв’язок компонентів FAT16 між собою.
15
Рис. 20.
В даному прикладі файл "HALOWELT.TXT" починається в кластері 0х05. У FAT таблиці на позиції 0х05 знаходиться значення 0xFFFF, тобто файл "HALOWELT.TXT" складається з одного кластеру. В області даних в кластері 0х05 знаходиться вміст файлу.
Файл "FORMAT.EXE" починається у кластері 0х06 і, як видно з таблиці FAT, займає три послідовних кластери: 0х06, 0х07, 0х08.
Кластер 0х09 – дефектний.
Файл "SUPERPRO.EXE" починається з кластеру 0x0A і займає кластери 0x0D і 0x0B. Файл "ZERSTUKE.EXE" починається в кластері 0х0С та займає кластери 0х02 та 0х03. Слід пам’ятати, що в області даних нумерація кластерів починається з0. Тому кластер в
області даних = номер кластера в FAT – 2.
3. Засоби для дослідження файлової системи
Потужним інструментом для вивчення та дослідження структури файлової системи носія інформації (жорсткого диску, USB Flash Drive накопичувача, MMC/SD-карти) є програма
WinHex (рис. 21).
Щоб відкрити носій потрібно вибрати пункт менюTools\Open Disk... і у випадаючому меню вибрати потрібний носій.
Після цього зверху появиться вікно, в якому буде відображена інформація про файли, в нижньому лівому вікні – загальна інформація про носій, а в нижньому правому вікні – вміст пам’яті носія розбитий на сектори. При цьому можна переглядати вмістVolume Boot Record, таблиць FAT1 і FAT2, Root Directory як у шістнадцятковому форматі так і символьному(див. рис. 17). Для перегляду у символьному форматі потрібно вибрати пунктиBoot sector (template)
або Root directory (template).
Ви також можете зберегти повністю весь вміст носія у файлі як двійковий образ. Для цього потрібно вибрати пункт менюFile\Create Disk Image… і у вікні, що з’явиться вказати
Raw image.
При потребі Ви можете відкрити цей файл через пункт менюFile/Open….Після цього потрібно вибрати пункт менюSpecialist/Interpret Image File As Disk і далі працювати як зі звичайним носієм.
16
Рис. 21.
4.Робота з FAT16 засобами MatLab
Вданій лабораторній роботі використовується файл двійкового образуSD-карти пам’яті SD_512.bin отриманий програмою WinHex.
Функції нижнього рівня роботи з картою(драйвери) реалізовані у вигляді функцій MatLab, які працюють з файлом образу карти.
Функція descriptor = MMC_SD_Init(disk_image) – здійснює ініціалізацію MMC/SD-карти.
Якщо карта виявлена та ініціалізація пройшла успішно вертає значенняdescriptor не рівне -1.
Якщо відбулася помилка під час ініціалізації функція вертає-1. disk_image – ім'я файлу з образом MMC/SD-карти. Лістинг цієї функції
function descriptor = MMC_SD_Init(disk_image) descriptor = fopen(disk_image, 'r+b');
if descriptor == -1
disp('No MMC/SD-card or Init Error');
else
disp('MMC/SD-card Init');
end;
Функція [Buffer count] = MMC_SD_Read_Sector(file, LBA) – зчитує сектор з номером LBA
розміром 512 байт в масив Buffer. Змінна count – містить справжню кількість прочитаних байт, якщо вона не рівна 512 це говорить про помилку. file – дескриптор файлу з образом MMC/SDкарти, який повернула функція MMC_SD_Init. Лістинг цієї функції
function [Buffer count] = MMC_SD_Read_Sector(file, LBA)
BytesPerSec = 512;
Buffer = zeros(BytesPerSec, 1);;
% Обчислюємо фізичний адрес
Address = LBA * BytesPerSec;
17
%Встановити показчик у файлі на потрібний сектор
Status = fseek(file, Address, 'bof');
%Прочитати сектор
[Buffer, count] = fread(file, BytesPerSec, 'uint8');
if count ~= BytesPerSec disp('MMC/SD-card Read Error');
else
z = sprintf('Read Sector Number %d', LBA); disp(z);
end;
return;
На підставі цих функцій нижнього рівня можна розробити програму, яка визначає і виводить основні параметри файлової системи FAT16.
clear all;
%Кількість байт в секторі
BytesPerSec = 512;
%Буфер для читання/запису даних
Buffer = zeros(BytesPerSec, 1);
%1. Переводимо карту в активний режим s = MMC_SD_Init('D:\SD_512.bin');
%2. Прочитати 0 сектор - VBR
%Номер сектора з якого починається VBR VBR_Addr = 0;
LBA = 0;
[Buffer, c1] = MMC_SD_Read_Sector(s, LBA);
% Перевіряємо сигнатуру VBR
if (Buffer(511) ~= hex2dec('55') & Buffer(512) ~= hex2dec('AA')) disp('VBR FAT Error');
return;
end;
% Визначаємо кількість байт в секторі
BytesPerSec = Buffer(hex2dec('b') + 1) + 2^8 * Buffer(hex2dec('b') + 2); z = sprintf('Кількість байт в секторі: %d', BytesPerSec);
disp(z);
%Визначаємо кількість секторів в кластері
SecPerClus = Buffer(hex2dec('d') + 1);
z = sprintf('Кількість секторів в кластері: %d', SecPerClus); disp(z);
%Кількість зарезервованих секторів від початку карти
RsvdSecCnt = Buffer(hex2dec('e') + 1) + 256 * Buffer(hex2dec('f') + 1); z = sprintf('Кількість зарезервованих секторів від початку карти: %d', RsvdSecCnt);
disp(z);
% Кількість таблиць FAT
18
NumFATs = Buffer(hex2dec('10') + 1);
z = sprintf('Кількість таблиць FAT: %d', NumFATs); disp(z);
% Кількість записів в Root Directory
RootEntCnt = Buffer(hex2dec('11') + 1) + 256 * Buffer(hex2dec('12') + 1); z = sprintf('Кількість записів в кореневому каталозі Root Directory: %d', RootEntCnt);
disp(z);
% Кількість секторів MMC/SD-карти (до 32 MB)
TotSec = Buffer(hex2dec('13') + 1) + 256 * Buffer(hex2dec('14') + 1);
if TotSec == 0
% MMC/SD-карта > 32 MB
TotSec = Buffer(hex2dec('20') + 1) + 256 * Buffer(hex2dec('21') + 1) + 2^16 * Buffer(hex2dec('22') + 1) + 2^24 * Buffer(hex2dec('23') + 1);
end;
z = sprintf('Загальна кількість секторів MMC/SD-карти: %d', TotSec); disp(z);
% Розмір таблиці FAT у секторах
SecPerFAT = Buffer(hex2dec('16') + 1) + 256 * Buffer(hex2dec('17') + 1); z = sprintf('Розмір таблиці FAT у секторах: %d', SecPerFAT);
disp(z);
if (Buffer(hex2dec('36') + 1) ~= 'F' & Buffer(hex2dec('37') + 1) ~= 'A' & Buffer(hex2dec('38') + 1) ~= 'T' & Buffer(hex2dec('39') + 1) ~= '1' & Buffer(hex2dec('3A') + 1) ~= '6')
disp('FAT16 Error');
end;
temp = Buffer((hex2dec('36') + 1):(hex2dec('3A') + 1)); z = sprintf('Тип файлової системи: %s', char(temp)); disp(z);
% Обчислюємо номер сектору з якого починається таблиця FAT1 та FAT2 FAT_Sect1 = VBR_Addr + RsvdSecCnt;
z = sprintf('Перший сектор FAT1: %d', FAT_Sect1); disp(z);
if (NumFATs > 1)
FAT_Sect2 = FAT_Sect1 + SecPerFAT;
z = sprintf('Перший сектор FAT2: %d', FAT_Sect2); disp(z);
end;
%Обчислюємо номер сектору з якого починається кореневий каталог Root Directory
RootDir_Sect = VBR_Addr + RsvdSecCnt + SecPerFAT * NumFATs;
z = sprintf('Перший сектор Root Directory: %d', RootDir_Sect); disp(z);
%Обчислюємо кількість секторів в Root Directory
RootDir_SectCnt = RootEntCnt * 32 / BytesPerSec;
z = sprintf('Кількість секторів в Root Directory: %d', RootDir_SectCnt); disp(z);
19
