Драйвер виртуального диска

Автор: Пользователь скрыл имя, 29 Ноября 2011 в 19:08, курсовая работа

Описание работы

В настоящее время все усложняются программные продукты и комплексы, что приводит к росту объема обрабатываемых данных, усложнению структуры их представления и хранения на компьютере. Все это приводит к повышению требований к скорости чтения и записи данных из файлов а также уменьшению времени доступа к каждому файлу в отдельности.

Содержание

ВВЕДЕНИЕ………………………………………………………………….3
1. АНАЛИТИЧЕСКИЙ РАЗДЕЛ
1.1. Постановка задачи………………………………………………………5
1.2. Архитектура Windows XP………………………………………………5
1.3. Многослойная архитектура драйверов………………………………...8
1.4. Архитектура драйверов устройств хранения………………………….9
1.5. Выбор файловой системы……………………………………………...11
……………………….38

Работа содержит 1 файл

Курсовой проект 1.doc

— 369.00 Кб (Скачать)
">  outputBuffer->RewritePartition = FALSE;

  outputBuffer->StartingOffset = RtlConvertUlongToLargeInteger(0);

  outputBuffer->PartitionLength = RtlConvertUlongToLargeInteger(devExt->DiskRegInfo.DiskSize);

  outputBuffer->HiddenSectors = (ULONG) (1L);

  outputBuffer->PartitionNumber = (ULONG) (1L);

  status = STATUS_SUCCESS;

  information = sizeof( PARTITION_INFORMATION );}

  break;}

  Запросы IOCTL_DISK_GET_MEDIA_TYPES, IOCTL_DISK_GET_DRIVE _GEOMETRY нужны для поучения информации о геометрии диска, для этого надо заполнить структуру DISK_GEOMETRY описанную в разделе 2.7.:

  typedef struct _DISK_GEOMETRY {

  LARGE_INTEGER; //количество цилиндров

  MEDIA_TYPE; //тип носителя

  ULONG; //количество дорожек на цилиндр

  ULONG; //количество секторов на дорожку

  ULONG; //размер сектора в байтах

  } DISK_GEOMETRY, *PDISK_GEOMETRY;

  Все остальные параметры заранее  рассчитаны и определены при инициализации, и нужно только эту структуру скопировать из расширения устройства:

  PDISK_GEOMETRY outputBuffer;

  outputBuffer = ( PDISK_GEOMETRY ) Irp->AssociatedIrp.SystemBuffer;

  RtlCopyMemory( outputBuffer, &(devExt->DiskGeometry), sizeof(DISK_GEOMETRY) );

  status = STATUS_SUCCESS;

  DBGPRINT(DBG_COMP_IOCTL,DBG_LEVEL_INFO,("IOCTL_DISK_GET_DRIVE_GEOMETRY-OK!\n"));

  information = sizeof( DISK_GEOMETRY ); 

  3.4.4 Обработка запросов Plug and Play

  При запуске устройства мы получаем IRP пакет с кодом IRP_MN_START_DEVICE:

  case IRP_MN_START_DEVICE:

  {KeInitializeEvent( &event, NotificationEvent, FALSE);

  IoCopyCurrentIrpStackLocationToNext( Irp );

  IoSetCompletionRoutine( Irp, (PIO_COMPLETION_ROUTINE) RamDskIoCompletionRoutine,

  (PVOID) &event, TRUE, TRUE, TRUE );

  status = IoCallDriver( devExt->LowerDeviceObject, Irp );

  if (status == STATUS_PENDING)

  {KeWaitForSingleObject( &event, Executive, KernelMode, FALSE, NULL);}

  if ( NT_SUCCESS(status) )

  {// успешно запущен нижний драйвер

  devExt->DevState = WORKING;}

  COMPLETE_REQUEST( Irp, status, 0 );

  break;}

  Мы  пересылаем пакет драйверу, который  находится ниже при помощи вызова функции IoCallDriver. Если нижние драйвер  находится в состоянии обработки (STATUS_PENDING), то просто усыплем наш  драйвер с помощью функции KeWaitForSingleObject и просыпаемся по событию завершения операции нижним драйвером.

  При остановке устройства(IRP_MN_STOP_DEVICE), просто пересылаем запрос нижнему драйверу и устанавливаем состояние устройства STOPPED:

  case IRP_MN_STOP_DEVICE:

  {devExt->DevState = STOPPED;

  Irp->IoStatus.Status = STATUS_SUCCESS;

  IoSkipCurrentIrpStackLocation( Irp );

  status = IoCallDriver( devExt->LowerDeviceObject, Irp );

  break;}

  При обработке запросов IRP_MN_SURPRISE_REMOVAL, IRP_MN_QUERY_ REMOVE_DEVICE, IRP_MN_QUERY_STOP_DEVICE, производятся аналогичные действия, с установкой соответствующего статуса:

  case IRP_MN_QUERY_STOP_DEVICE:

  {devExt->DevState = PENDINGSTOP;

  Irp->IoStatus.Status = STATUS_SUCCESS;

  IoSkipCurrentIrpStackLocation( Irp );

  status = IoCallDriver( devExt->LowerDeviceObject, Irp );

  break;}

  case IRP_MN_STOP_DEVICE:

  {devExt->DevState = STOPPED;

  Irp->IoStatus.Status = STATUS_SUCCESS;

  IoSkipCurrentIrpStackLocation( Irp );

  status = IoCallDriver( devExt->LowerDeviceObject, Irp );

  break;}

  case IRP_MN_QUERY_REMOVE_DEVICE:

  {devExt->DevState = PENDINGREMOVE;

  Irp->IoStatus.Status = STATUS_SUCCESS;

  IoSkipCurrentIrpStackLocation( Irp );

  status = IoCallDriver( devExt->LowerDeviceObject, Irp );

  break;}

  case IRP_MN_SURPRISE_REMOVAL:

  {devExt->DevState = SURPRISEREMOVED;

  Irp->IoStatus.Status = STATUS_SUCCESS;

  IoSkipCurrentIrpStackLocation( Irp );

  status = IoCallDriver( devExt->LowerDeviceObject, Irp );

  break;}

  При удалении устройства IRP_MN_REMOVE_DEVICE, мы вызываем функцию RamDskRemoveDevice, которая освобождает  выделенную при инициализации память, символическую ссылку (она будет  описана далее):

  case IRP_MN_REMOVE_DEVICE:

  {RamDskRemoveDevice( DeviceObject, Irp );

  lockHeld = FALSE;

  break;}

  3.4.5 Выгрузка драйвера

  Выгрузка  драйвера состоит из двух частей: удаление объекта устройства и выгрузка самого драйвера.

  При удалении объекта устройства, менеджер ввода вывода посылает IRP пакет IRP_MN_REMOVE_DEVICE, тогда вызывается процедура RamDskRemove Device. IRP пакет передаем дальше драйверу нижнего уровня с помощью функции IoCallDriver. Статус драйвера устанавливается в состояние устройство удалено, чтобы новые запросы не могли быть выполнены. С помощью функции IoReleaseRemoveLockAndWait ждем пока текущие запросы не обработаются.

  Irp->IoStatus.Status = STATUS_SUCCESS;

  IoSkipCurrentIrpStackLocation( Irp );

  status = IoCallDriver( devExt->LowerDeviceObject, Irp );

  devExt->DevState = REMOVED;

  IoReleaseRemoveLockAndWait(&devExt->RemoveLock, Irp);

  driverExtension = IoGetDriverObjectExtension(DeviceObject->DriverObject,

  RAMDSK_DRIVER_EXTENSION_KEY);

  ASSERT ( driverExtension != NULL );

  driverExtension->DeviceInitialized = FALSE;

  RamDskCleanUp( DeviceObject );

  Перед удалением расширения объекта устройства в процедуре RamDskCleanUp освобождается  память под образ диска, удаляется  символическая ссылка и сам функциональный объект устройства. Также далее сбрасывается признак DeviceInitialized инициализации устройства.

  При выгрузке самого драйвера вызывается процедура RamDskUnload, которая должна обязательно  присутствовать, чтобы драйвер мог  выгружаться.

  VOID RamDskUnload(IN PDRIVER_OBJECT DriverObject)

  {PRAMDSK_DRIVER_EXTENSION driverExtension;

  DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_INFO, ("Driver Unload\n") );

  ASSERT(DriverObject->DeviceObject == NULL);

  driverExtension = IoGetDriverObjectExtension(DriverObject,RAMDSK_DRIVER_EXTENSION_KEY);

  ASSERT ( driverExtension != NULL );

  if ( driverExtension->RegistryPath.Buffer )

  {ExFreePool( driverExtension->RegistryPath.Buffer );}

  return;

  } // Конец RamDskUnload()

  В данной процедуре удаляется уже  расширение драйвера. 

                                               3.5 Установка драйвера

  Установка драйвера производится следующим образом. Полученный драйвер  (filedisk.sys)  копируем в системную папку по адресу:с\windows \ System32 \ Drivers \. Далее импортируем файл (filedisk.reg)  в реестр системы двойным нажатием левой кнопки мыши. После этого, требуется перезагрузить систему. Теперь мы можем использовать программу filedisk.exe для чтения\записи, монтажа\демонтажа файлов. Перед этим, мы размещаем по адресу, прописанному в исходнике, на диске С:\temp два файла: cdimage.iso, filedisk.image. После чего командной строкой мы можем создавать виртуальные диски (области) для данных файлов командами:

  - filedisk /mount  0 c:\temp\filedisk.img 8M f:-создание (монтаж) образа (f);

  - filedisk /mount  1 c:\temp\cdimage.iso /cd i:- создание (монтаж) образа (i);

  - filedisk /umount f:- демонтаж образа (f);

  - filedisk /umount i:- демонтаж образа (i). 

  4. ЭКСПЕРИМЕНТАЛЬНО-ИССЛЕДОВАТЕЛЬСКИЙ  РАЗДЕЛ 

                                          4.1 Описание экспериментов

  Для исследования временных характеристик  использовалась программа HD TACH 2.70, исследовались следующие характеристики:

  скорость  последовательного чтения

  время доступа при случайном обращении

  загрузка  процессора при операциях записи/чтения

  Эксперименты  проводились на компьютере AMD Turion(tm)X2 Dual Core, Windows XP SP2, 2.20 Ггц,1,74 Гб ОЗУ. 

  4.2 Результаты экспериментов

  В таблице 4 показаны результаты тестирования для рам-диска, для сравнения приведены результаты для жесткого диска Segate Barracuda 4 7200 

         Таблица 4 Результаты тестирования.

                               Характеристика              Рам-диск                      Жесткий диск
                 Скорость последовательного чтения

                                         Мб/с   

               189,5                                40,0
                  Время доступа при случайном

                                 обращении, мс

                  0,0                                15,2
                                Загрузка ЦП                 100%                                10%
 

  Как и ожидалось, для виртуального диска характерен мгновенный доступ к любому сектору на диске, в отличие от жестких дисков, время доступа которых зависит от быстродействия механики.

  Скорость  передачи данных для рам-диска также ограничивается скоростью обмена данными в памяти (для данной платформы обмен данными с оперативной памятью равен 250 Мб/с).

  Платой  за такие высокие показатели является полная загрузка процессора, т.к. он постоянно  работает с оперативной памятью.

 

                                                        ЗАКЛЮЧЕНИЕ

  В данной работе были исследованы вопросы, связанные с разработкой драйверов для устройств хранения, способами хранения данных, управление работой устройства с помощью команд PnP. Разработан классовый драйвер виртуального диска, который полностью удовлетворяет всем указанным требованиям.

  Работа  драйвера осуществляется корректно, рам-диск обеспечивает полную функциональность обычного жесткого диска. На данном диске можно создавать, читать, записывать, удалять файлы.

  Драйвер не влияет на работу других устройств, и не приводит к ощутимым задержкам с работе системы.

  Также драйвер в ходе тестирования показал  хорошие результаты производительности, которые ограничены характеристиками оперативной памяти компьютера.

 

  СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ 

  
  1. Oney W. Programming the Microsoft Windows Driver Model. — Redmond, Washington: Microsoft Press., 1999.
  2. В.Г.Олифер, Н.А.Олифер Сетевые операционные системы. Учебник для ВУЗов – СПб.: Издательство «ПИТЕР», 2004 – 544 с.: ил.
  3. Солдатов В.П. Программирование драйверов Windows. Изд. 2-е, перераб. и доп.-М.: ООО «Бином-Пресс», 2004.-480с., ил.
  4. Microsoft Windows XP DDK Documentation.

Информация о работе Драйвер виртуального диска