Автор: Пользователь скрыл имя, 29 Ноября 2011 в 19:08, курсовая работа
В настоящее время все усложняются программные продукты и комплексы, что приводит к росту объема обрабатываемых данных, усложнению структуры их представления и хранения на компьютере. Все это приводит к повышению требований к скорости чтения и записи данных из файлов а также уменьшению времени доступа к каждому файлу в отдельности.
ВВЕДЕНИЕ………………………………………………………………….3
1. АНАЛИТИЧЕСКИЙ РАЗДЕЛ
1.1. Постановка задачи………………………………………………………5
1.2. Архитектура Windows XP………………………………………………5
1.3. Многослойная архитектура драйверов………………………………...8
1.4. Архитектура драйверов устройств хранения………………………….9
1.5. Выбор файловой системы……………………………………………...11
……………………….38
outputBuffer->StartingOffset
= RtlConvertUlongToLargeInteger(
outputBuffer->
outputBuffer->HiddenSectors = (ULONG) (1L);
outputBuffer->
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.
RtlCopyMemory( outputBuffer, &(devExt->DiskGeometry), sizeof(DISK_GEOMETRY) );
status = STATUS_SUCCESS;
DBGPRINT(DBG_COMP_IOCTL,DBG_
information
= sizeof( DISK_GEOMETRY );
3.4.4 Обработка запросов Plug and Play
При запуске устройства мы получаем IRP пакет с кодом IRP_MN_START_DEVICE:
case IRP_MN_START_DEVICE:
{KeInitializeEvent( &event, NotificationEvent, FALSE);
IoCopyCurrentIrpStackLocatio
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. Если нижние драйвер
находится в состоянии
При
остановке устройства(IRP_MN_
case IRP_MN_STOP_DEVICE:
{devExt->DevState = STOPPED;
Irp->IoStatus.Status = STATUS_SUCCESS;
IoSkipCurrentIrpStackLocatio
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;
IoSkipCurrentIrpStackLocatio
status = IoCallDriver( devExt->LowerDeviceObject, Irp );
break;}
case IRP_MN_STOP_DEVICE:
{devExt->DevState = STOPPED;
Irp->IoStatus.Status = STATUS_SUCCESS;
IoSkipCurrentIrpStackLocatio
status = IoCallDriver( devExt->LowerDeviceObject, Irp );
break;}
case IRP_MN_QUERY_REMOVE_DEVICE:
{devExt->DevState = PENDINGREMOVE;
Irp->IoStatus.Status = STATUS_SUCCESS;
IoSkipCurrentIrpStackLocatio
status = IoCallDriver( devExt->LowerDeviceObject, Irp );
break;}
case IRP_MN_SURPRISE_REMOVAL:
{devExt->DevState = SURPRISEREMOVED;
Irp->IoStatus.Status = STATUS_SUCCESS;
IoSkipCurrentIrpStackLocatio
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;
IoSkipCurrentIrpStackLocatio
status = IoCallDriver( devExt->LowerDeviceObject, Irp );
devExt->DevState = REMOVED;
IoReleaseRemoveLockAndWait(&
driverExtension
= IoGetDriverObjectExtension(
RAMDSK_DRIVER_EXTENSION_KEY)
ASSERT ( driverExtension != NULL );
driverExtension->
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->
driverExtension
= IoGetDriverObjectExtension(
ASSERT ( driverExtension != NULL );
if
( driverExtension->RegistryPath.
{ExFreePool(
driverExtension->RegistryPath.
return;
} // Конец RamDskUnload()
В
данной процедуре удаляется уже
расширение драйвера.
Установка драйвера производится следующим образом. Полученный драйвер (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.
ЭКСПЕРИМЕНТАЛЬНО-
Для исследования временных характеристик использовалась программа 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. Разработан классовый драйвер виртуального диска, который полностью удовлетворяет всем указанным требованиям.
Работа драйвера осуществляется корректно, рам-диск обеспечивает полную функциональность обычного жесткого диска. На данном диске можно создавать, читать, записывать, удалять файлы.
Драйвер не влияет на работу других устройств, и не приводит к ощутимым задержкам с работе системы.
Также драйвер в ходе тестирования показал хорошие результаты производительности, которые ограничены характеристиками оперативной памяти компьютера.
СПИСОК
ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ