русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Проектирование программ тестирования накопителей на жестких магнитных дисках

Обобщенный алгоритм тестирования НЖМД.

  1. Определение характеристик накопителя: для накопителей до 8Гб это головки, цилиндры, сектора. Такие накопители обслуживает прерывание 13h; для накопителей больше 8Гб – размеры дорожек, абсолютное количество секторов, накопители обслуживаются прерыванием 13h расширенным.
  2. Выбор диапазона тестирования (среднее время поиска сектора          8-10мсек).
  3. Выбор теста по системе адресации секторов:
    • линейный,
    • «бабочка»,
    • random (случайный адрес из диапазона).
  4.  Выбор теста по методу проверки сектора:
    • верификация (проверка доступности сектора).
    • запись-чтение со сравнением констант тестирования , , .
    • проверка времени доступа тестирования сектора.
  5. Вывод на экран и в файл отчет вида теста, номеров проверенных секторов, результат проверки, время доступа и т.д.
  6. Сообщение об окончании программы и общего времени тестирования.

 

Использование прерывания 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. Получаем реальное количество тактов, потребляемое процессом.

Просмотров: 15428


Вернуться воглавление




Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Полезен материал? Поделись:

Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.