Обобщенный алгоритм тестирования НЖМД.
- Определение характеристик накопителя: для накопителей до 8Гб это головки, цилиндры, сектора. Такие накопители обслуживает прерывание 13h; для накопителей больше 8Гб – размеры дорожек, абсолютное количество секторов, накопители обслуживаются прерыванием 13h расширенным.
- Выбор диапазона тестирования (среднее время поиска сектора 8-10мсек).
- Выбор теста по системе адресации секторов:
- линейный,
- «бабочка»,
- random (случайный адрес из диапазона).
- Выбор теста по методу проверки сектора:
• верификация (проверка доступности сектора).
• запись-чтение со сравнением констант тестирования , , .
• проверка времени доступа тестирования сектора.
- Вывод на экран и в файл отчет вида теста, номеров проверенных секторов, результат проверки, время доступа и т.д.
- Сообщение об окончании программы и общего времени тестирования.
Использование прерывания 13h для тестирования НЖМД
Из-за конфигурации регистров контроллера 13h нерасширенное используется только для НЖМД объемом до 8Гб:
- 6 младших разрядов регистра cl содержат адрес сектора, поэтому максимальное количество секторов составляет = 64 сектора;
- 8 разрядов регистра ch и 2 старших разряда регистра cl содержат адрес цилиндра всего = 1024 дорожки / цилиндр.
- 8 разрядов регистра dh содержат номер логической головки – в общем =256 головок.
Тогда максимальный объем диска для данной конфигурации составляет:
Для тестирования используются следующие функции 13h прерывания:
- 08h – определение конфигурации;
- 04h – верификация;
- 02h – запись в буфер;
- 03h – запись прочитанного из буфера в сектор.
В отличие от НГМД измерение времени тестирования сектора НЖМД желательно выполнять с помощью функции чтения счетчиков тактов МП, функция имеет системный номер 310Fh.
Тестирование НЖМД объемом больше 8Гб
Для тестирования НЖМД объемом больше 8Гб используется прерывание 13h расширенное. Функции, используемые для тестирования следующие:
- 41h – проверка наличия 13h расширенного;
- 44h – верификация сектора;
- 48h – определение характеристик НЖМД;
- 42h / 43h – аналог 02h / 03h.
Проектирование подпрограмм для функций прерывания 13h расширенного (13h-ext)
Функция 41h.
Procedure 41h
{входные параметры:}
ah=41h {в регистр ah устанавливаем номер функции}
bx=55AAh {в bx загружаем константу}
dl=80h {выбираем диск С:\}
intr($13, r) {запуск 13h-ext,r: registers }
{Проверканаличия 13h-ext }
if (bx=$AA55) and (r.flags and 1)=0) then writeln(‘int 13h-ext OK!’)
else writeln(‘ERROR!’)
{Определение характеристик НЖМД выполняется функцией 48h}
dl=$48
{Структурные элементы для адресации объема 13h ( секторов)}
{Структура информационной части 48h}
drv_info=record
info_size : word
flags : word
cilindr=array[1..2] of word {количествоцилиндров}
sector=array[1..4] of word {количество секторов (абсолютное)}
rasm_sect : word {размерсектора}
end
info_size =26
ds=seg(drv_info) {выделениесегментадля drv_info }
si=ofs(drv_info) {определение смещения в сегменте для drv_info }
{запуск прерывания 13h }
intr($13,r)
{проверка выполнения функции 48h }
if (r.flags and 1)=0 then writeln(‘int 48h OK!’)
else writeln(‘ERROR!’)
Получение характеристик:
Количество цилиндров = поле цилиндров – младшее поле + старшее поле * 65536;
Количество головок и секторов на трек рассчитывается аналогично;
Размер диска = колич.секторов * размер сектора (512);
Структура для формирования адреса сектора.
disk_addr=record
rasm_box : byte {размерпакета}
reserve : byte {резерв}
schet : word {блоксчетчика}
segm_buf : word {сегментбуфераадреса}
ofs_buf : word {смещение буфера адреса}
nom_sect : array[1..4] of word {номерсектора}
end.
Функция 44h.
{заполняем поля таблицы disk_addr }
rasm_box=16;
reserve=0;
schet=0;
{формирование номера сектора}
nom_sect[1] mod (64K)
nom_sect[2] div
…
{Запуск функции 44h}
ah=44h
dl=80h
ds=seg(disk_addr)
si=ofs(disk_addr)
intr($13,r)
{проверка выполнения функции 44h }
if (r.flags and 1)=0 then writeln(‘int 44h OK!’)
else writeln(‘ERROR!’)
Использование функций записи / чтения со сравнением
Функция 42h.
С помощью функции 42h содержимое сектора переписывается в буфер:
ah=42h
dl=80h
info_size=26
ds=seg(disk_addr)
si=ofs(disk_addr)
intr($13,r)
{проверка выполнения функции 42h }
if (r.flags and 1)=0 then writeln(‘int 42h OK!’)
else writeln(‘ERROR!’)
Функция 43h.
Выполнение функция 43h относительно 42h отличается только формированием регистра ah:
ah=43h
Остальное аналогично.
Процедура определения числа тактов.
Сформируем процедуру определения числа тактов потраченных МП на выполнение конкретных действий:
asm
db 66h ; 32-битный режим
xor cx,cx
mov cl,10h
db 0F, 32h ; или 31h, но без cx и 10h в cl для чтения счетчика
rdmsr
db 66h
mov word ptr tsch, ax ; загрузка младших 32-х разрядов
mov word ptr tsch, dx ; загрузка старших 32-х разрядов 64-разрядного счетчика тактов
end.
Расчет количества тактов: kol_takt = tsch * exp(32 * ln2) + tscl.
Получение времени потраченного МП (сек.): t = kol_takt / f,
где f – частота МП в Гц
Рекомендации к вычислению времени.
1.выполнить 2 запуска процедуры вычисления тактов для определения тактовых затрат на процедуру;
2. запустить процедуру;
3. запустить измеряемый процесс (например, функцию 42h);
4. запустить процедуру вычисления тактов. Из тактов этой процедуры вычесть такты предыдущей процедуры и такты, потребляемые процедурой п.1. Получаем реальное количество тактов, потребляемое процессом.