Міністерство освіти і науки України Національний університет “Львівська політехніка” Інститут комп’ютерних технологій, автоматики та метрології кафедра “Захист інформації” ЗВІТ до лабораторної роботи № 5 з курсу "Системи запису та відтворення інформації" "ПОБУДОВА СИСТЕМИ ЗБЕРІГАННЯ ІНФОРМАЦІЇ НА MMC\SD FLASH-КАРТАХ ПАМ‘ЯТІ З ПІДТРИМКОЮ ФАЙЛОВОЇ СИСТЕМИ FAT16"
Львів 2010 РОЗДІЛ 1. МЕТА РОБОТИ Мета роботи – набути вміння організовувати файловий ввід-вивід даних на Flash-носіях інформації в портативних аудіо- та відеопристроях. РОЗДІЛ 2. ЗАВДАННЯ: Ознайомитись з теоретичним матеріалом.. Відкрити файл образу MMC/SD-карти SD_512.bin в програмі WinHex і визначити основні параметри файлової системи FAT16. Визначити основні параметри файлової системи в середовищі MatLab з допомогою розглянутих функцій і програм для образу MMC/SD-карти SD_512.bin. Визначити основні параметри файлової системи в середовищі MatLab з допомогою розглянутих функцій і програм для образу MMC/SD-карти SD_512.bin. Порівняти вміст зчитаного файлу в середовищі MatLab і WinHex. Варіант Назва файлу
11 FILE11.C
РОЗДІЛ 3. ЛІСТИНГ ПРОГРАМИ % Кількість байт в секторі BytesPerSec = 512;
% Буфер для читання/запису даних Buffer = zeros(BytesPerSec, 1);
% 1. Переводимо карту в активний режим s = MMC_SD_Init(D:\My\Системи запису та відтворення інформації\5\SD_512.bin');
% 2. Прочитати 0 сектор - VBR % Номер сектора з якого починається VBR VBR_Addr = 0; LBA = 0; [Buffer, c1] = MMC_SD_Read_Sector(s, LBA);
% Визначаємо кількість байт в секторі 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 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);
% Розмір таблиці 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('ЗА') + 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) ;
% Обчислюємо номер сектора початку області даних Data_Sect = VBR_Addr + RsvdSecCnt + SecPerFAT * NumFATs + RootDir_SectCnt; z = sprintf('Номер сектора початку області даних: %d', Data_Sect); disp(z);
for jj = 1 : RootDir_SectCnt %від 1-го до останнього сектору RootDirectory Buffer = MMC_SD_Read_Sector(s, RootDir_Sect + jj - 1); %читає поточний сектор
for ii = 1 : RootDir_SectCnt temp = Buffer(ByteCnt : ByteCnt + 10); %читає перші 11 байт (1-ші байти запису-- імя та розширення файлу) ByteCnt = ByteCnt + 32; %наступний запис (1 запис--32байти) if ByteCnt > RootEntCnt-1 ByteCnt = 1; break; end if sum((temp' == FileName)) == 11 % посимвольно порівнюємо, співпадає 1-ин елем. -- 1,сума одиничок = 11 z = sprintf('Файл знайдено'); Flag_File = 1; disp(z); break; end;
end;
if (Flag_File == 1) break; end;
end;
if(Flag_File == 0) z = sprintf('Файл не знайдено'); disp(z); return; %вихід з програми end;
Entry = Buffer(32*(ii-1) + 1 : 32*(ii-1) + 1 +31); %саме той запис в Root Directory , де наш файл DIR_F = Entry(27) + 256 * Entry(28); %DIR_F --перший кластер з даними файлу 26:27 -- позиція байту його розмір==2
z = sprintf('Номер першого кластеру файла: %d', DIR_F); disp(z);
File_size = Entry(29) + 256 * Entry(30)+256*256 * Entry(31)+ 256*256*256 * Entry(32); z = sprintf('Розмір даного файлу: %d', File_size); disp(z);
Claster_file = ceil(Sectors_file/SecPerClus); z = sprintf('Кількість кластерів файлу: %d', Claster_file); disp(z); if Claster_file ~= 1 Fat16 = zeros(Claster_file,1); Fat16(1,1) = DIR_F; t=DIR_F; for i = 1:Claster_file-1 Buffer = MMC_SD_Read_Sector(s,FAT_Sect1); t = Buffer(t*2+1)+ 256 * Buffer(t*2+2); Fat16(i+1,1) = t; end else for ii = 1 : SecPerClus Buffer = MMC_SD_Read_Sector(s,Sec_file+ii-1); z = sprintf('%c',Buffer); disp(z); end return; end
Pr_sector=0;
for i = 1:Claster_file Read_claster = Fat16(i,1);
for ii = 1 : SecPerClus if Pr_sector == Sectors_file break; else Buffer = MMC_SD_Read_Sector(s,Read_claster*SecPerClus+RootDir_Sect+ii-1); z = sprintf('%c',Buffer); disp(z); Pr_sector = Pr_sector + 1; end; end
end
fclose(s);
РОЗДІЛ 4. ІНФОРМАЦІЯ ПРО ФАЙЛОВУ СИСТЕМУ: MMC/SD-card Init Кількість байт в секторі: 512 Кількість секторів в кластері: 16 Кількість зарезервованих секторів від початку карти: 4 Кількість таблиць FAT: 2 Кількість записів в кореневому каталозі Root Directory: 512 Загальна кількість секторів MMC/SD-карти: 1006359 Розмір таблиці FAT у секторах: 246 Тип файлової системи: FAT16 Перший сектор FAT1: 4 Перший сектор FAT2: 250 Перший сектор Root Directory: 496 Кількість секторів в Root Directory: 32 Номер сектора початку області даних: 528 Файл знайдено Номер першого кластеру файла: 41 Розмір даного файлу: 8793 Перший сектор файлу: 1152 Кількість секторів файлу: 18 Кількість кластерів файлу: 2 РОЗДІЛ 5. ВИСНОВОК На цій лабораторній роботі я навчився розробляти алгоритми вводу-виводу даних на Flash-носіях аудіо та відео пристроях. Розглянув структуру файлової системи FAT-16 і змоделювали роботу карти пам’яті у системі Matlab.