Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
11
Добавлен:
12.02.2016
Размер:
1.46 Mб
Скачать

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

Соседние файлы в папке MMC_SD_FAT16