Студопедия — КАК НАПИСАТЬ ДРАЙВЕР
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

КАК НАПИСАТЬ ДРАЙВЕР

WINDOWS 2000

 

В Windows 2000, как и во всех операционных системах семейства NTдрайверы бывают следующих типов: − Драйверы режима ядра (Kernel mode drivers). Основной тип драйвера. Если точно неизвестно, какого именно типа драйвер нужен, используют именно этот тип. − Графические драйверы (Graphics drivers). Драйверы видеокарт. Обычно они создаются одновременно с самой видеокартой. Очень сложны в написании, так как должны учитывать множество противоречивых требований и поддерживать множество стандартов. − Мультимедийные драйверы (Multimedia drivers). Драйверы для: o аудиоустройств – считывание, воспроизведение и сжатие аудиоданных. o устройств работы с видео – захват и сжатие видеоданных. o позиционных устройств – джойстики, световые перья, планшеты и пр. − Сетевые драйверы (Network drivers) – работа с сетью и сетевыми протоколами на всех уровнях. − Virtual DOS Drivers – драйверы для виртуальных машин MS-DOS. Наибольший интерес для программиста представляют драйверырежима ядра. Прежде всего, необходимо представить окружение драйвера,среду, в которой он работает. Как уже было показано, ядро системы представляется наборомотдельных изолированных модулей с четко определенными внешнимиинтерфейсами. Все драйверы NT имеют множество стандартных методовдрайвера, определенных системой, и, возможно, несколько специфическихметодов, определенных разработчиком. Существует три типа драйверов ядра, каждый тип имеет четкоопределенные структуру и функциональность. − Драйверы устройств (Device drivers), такие как драйвер клавиатуры или дисковый драйвер, напрямую общающийся с дисковым контроллером. Эти драйвера также называются драйверами низкого уровня, т. к. они находятся в самом низу цепочки драйверов Windows NT. − Промежуточные драйверы (Intermediate drivers), такие как драйвер виртуального или зеркального диска. Они используют драйверы устройств для обращения к аппаратуре. − Драйверы файловых систем (File system drivers). Драйверы файловых систем, таких как FAT, NTFS, CDFS, для доступа к аппаратуре используют промежуточные драйверы и драйверы устройств. Драйверы Windows NT должны удовлетворять следующимтребованиям: − переносимость с одной платформы на другую, − программная конфигурируемость, − прерываемость, − мультиплатформенность, − объектно-ориентированность, − поддержка пакетного ввода-вывода с повторно используемыми IRP (запросами ввода-вывода), − поддержка асинхронного ввода-вывода. Каждая операционная система имеет модель ввода-вывода для управления потоками данных к периферийным устройствам и от них. Модель ввода-вывода Windows NT имеет следующие особенности: − менеджер ввода-вывода NT представляет интерфейс для всех драйверов режима ядра, включая драйверы физических устройств, драйверы логических устройств и драйверы файловых систем, − операции ввода-вывода послойные, то есть, что вызов, сделанный пользователем, проходит через несколько слоев, генерируя несколько пакетных запросов ввода-вывода и обращаясь к необходимым драйверам, − менеджер ввода-вывода определяет множество стандартных процедур, которые должны быть реализованы разработчиком драйвера, − подобно NT в целом, драйверы имеют объектную архитектуру, то есть, их устройства и системное оборудование представлены как объекты Windows NT. 3.1 Стандартные процедуры Любой драйвер должен реализовывать основное множествопроцедур и, возможно, еще несколько дополнительных подмножеств взависимости от разновидности драйвера. На рисунке 3.1 показанстандартный цикл работы драйвера, заключающийся в обработке запросана прерывание IRP. Ниже показаны основные процедуры, которые должен иметь каждыйдрайвер. DriverEntry NTSTATUS (*PDRIVER_INITIALIZE) (IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath); Каждый драйвер должен иметь инициализационную процедуру,которую менеджер ввода-вывода вызывает автоматически, если этапроцедура называется DriverEntry. Dispatch NTSTATUS (*PDRIVER_DISPATCH) (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); Каждый драйвер должен иметь, по крайней мере, одну процедуруDispatch. StartIo (или Queue-management) VOID (*PDRIVER_STARTIO) (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); Если драйвер устройства не может завершить все возможныезапросы ввода-вывода в его Dispatch процедуре, он должен иметь либопроцедуру StartIo, либо заводить одну или более внутренних очередей иуправлять собственным механизмом отложенных запросов на прерывание. 3.2 Дополнительные стандартные процедуры В зависимости от типа и от уровня, занимаемого драйвером в стекеобработки запроса на прерывание, драйвер может обладать следующимидополнительными процедурами: Reinitialize VOID (*PDRIVER_REINITIALIZE) (IN PDRIVER_OBJECT DriverObject, IN PVOID Context, IN ULONG Count); Вдобавок к процедуре DriverEntry драйвер может иметь процедуруReinitialize, вызываемую один или несколько раз в процессе загрузкисистемы после того, как DriverEntry вернет управление. InterruptService (ISR) BOOLEAN (*PKSERVICE_ROUTINE) (IN PKINTERRUPT Interrupt, IN PVOID ServiceContext // usually points to device object); Любой драйвер физического устройства, который генерируетпрерывания, должен иметь эту процедуру. Этот драйвер всегда самыйнизкий в стеке. DpcForIsr или CustomDpc VOID (*PIO_DPC_ROUTINE) (IN PKDPC Dpc, IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context); VOID (*PKDEFERRED_ROUTINE) (IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2); Любой драйвер, имеющий ISR должен иметь DpcForIsr илиCustomDpc. Рисунок 3.1 – Стандартные процедуры драйвера SynchCritSection BOOLEAN (*PKSYNCHRONIZE_ROUTINE) (IN PVOID SynchronizeContext); Любой низкоуровневый драйвер устройства, у которого данные илирегистры сопряженного устройства могут изменяться в его ISR и другихпроцедурах драйвера, должен иметь одну или более процедур SynchCritSection. AdapterControl и/или ControllerControl IO_ALLOCATION_ACTION (*PDRIVER_CONTROL) (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID MapRegisterBase, IN PVOID Context); Любой драйвер устройства, использующий DMA, должен иметьпроцедуру AdapterControl. Любой драйвер устройства, который долженсинхронизировать операции с физическим контроллером для несколькихустройств или каналов устройства, должен иметь ControllerControl. Cancel VOID (*PDRIVER_CANCEL) (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); Клавиатура, мышь, последовательный, параллельный, звуковойдрайверы и драйвер файловой системы имеют процедуру Cancel. Любойдрайвер, обрабатывающий запрос в течение длительного промежуткавремени (в течение которого пользователь может отменить операцию),должен иметь процедуру Cancel. Обычно эту процедуру имеет высшийдрайвер в стеке обработки запроса. IoCompletion NTSTATUS (*PIO_COMPLETION_ROUTINE) (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context); Любой драйвер верхнего уровня, который создает запросы к болеенизкоуровневым драйверам, должен иметь, по крайней мере, однупроцедуру IoCompletion для освобождения всех структур IRP, созданныхдрайвером. Таким образом, любой драйвер высшего уровня должен иметьпроцедуру IoCompletion. Другие процедуры драйвера могут сказать, чтобыIoCompletion была вызвана, когда все низкоуровневые драйверыобработают текущий запрос. IoTimer и/или CustomTimerDpc VOID (*PIO_TIMER_ROUTINE) (IN PDEVICE_OBJECT DeviceObject, IN PVOID Context); VOID (*PKDEFERRED_ROUTINE) (IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, // reserved for system use IN PVOID SystemArgument2 // reserved for system use); Для отслеживания времени, занимаемого процедурой ввода-вывода,или для других целей, определяемых разработчиком, любой драйвердолжен иметь процедуры IoTimer и/или CustomTimerDpc. IoTimerвызывается раз в секунду, когда драйвер включает таймер. CustomTimerDpcможет вызываться в более часто или нерегулярно интервал. Unload VOID (*PDRIVER_UNLOAD) (IN PDRIVER_OBJECT DriverObject); Драйвер должен иметь процедуру Unload, если он может бытьвыгружен во время работы системы. 3.3 Сервисные системные вызовы Для выполнения обращений к микроядру, работы с реестром,памятью, объектами, синхронизацией и пр. существует набор функций,называющихся функциями поддержки ядра. Рассмотрим только самыенеобходимые. IoCreateDevice Создает новый объект устройства и инициализирует его дляиспользования драйвером. Объект устройства представляет собойфизическое, виртуальное или логическое устройство, которое необходимодрайверу для поддержки динамического управления этим устройством. NTSTATUS IoCreateDevice(IN PDRIVER_OBJECT DriverObject, указатель на объект драйвера IN ULONG DeviceExtensionSize, размер блока пользовательской информации в байтах IN PUNICODE_STRING DeviceName, имя устройства (иногда опускается) IN DEVICE_TYPE DeviceType, тип устройства (последовательное, диск, мышь и т.д.) IN ULONG DeviceCharacteristics, параметры устройства (вынимаемое и пр.) IN BOOLEAN Exclusive, параллельность доступа к устройству OUT PDEVICE_OBJECT *DeviceObject, указатель на объект создаваемого устройства); IoCreateSymbolicLink Создает символическую связь между устройством и видимымпользователем именем. NTSTATUS IoCreateSymbolicLink(IN PUNICODE_STRING SymbolicLinkName, символическое имя, видимое пользователю IN PUNICODE_STRING DeviceName, имя устройства в пространстве имен ядра Windows); IoCompleteRequest Объявляет менеджеру ввода-вывода, что обработка текущего запросаввода-вывода закончена. VOID IoCompleteRequest(IN PIRP Irp, указатель на запрос ввода-вывода IN CCHAR PriorityBoost повышение приоритета драйвера для обработки запроса. Зависит от обрабатываемого устройства. O_NO_INCREMENT при ошибке или очень быстрой обработке запроса); 3.4 Драйвер виртуального диска Рассмотрим конкретный пример – драйвер виртуального диска. Помере необходимости будем снабжать текст программы необходимымиописаниями. Драйвер создает виртуальный диск, отформатированный по умолчанию как FAT. Выбор этого типа драйвера обусловлен следующим: − простота реализации, не требуется кода для работы с оборудованием, − легкость демонстрации, пример не требует специфических устройств, и может быть продемонстрирован практически на любой машине, − малый объем исходного текста, позволяющий изучить основные принципы работы, не вдаваясь в подробности. В целях экономии места и концентрации на основной теме опустимнезначительные, но необходимые детали – инициализацию и освобождение памяти, получение параметров из реестра, обработку ошибок, – заменив их комментариями, вкратце описывающими процесс. Начнем с рассмотрения функции DriverEntry – точки входа вдрайвер, служащей для инициализации программы. С нее начинаетсявыполнение драйвера. Функция устанавливает, какие системные вызовыона будет обрабатывать и создает собственно виртуальный диск. NTSTATUS DriverEntry(IN OUT PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) Аргументы: DriverObject – указатель на объект, представляющий этот драйвер. RegistryPath – указатель на строку, задающую точку входа в реестре,отведенную для этого драйвера. Через реестр может осуществлятьсяконфигурирование драйвера. Возвращаемое значение: STATUS_SUCCESS если драйвер нормально инициализировался,иначе код ошибки { NTSTATUS ntStatus; UNICODE_STRING paramPath; static WCHAR SubKeyString[] = L"\\Parameters"; … Считывание параметров из реестра …Инициализация объекта драйвера и его точек входа. Соответствующимэлементам массива DriverObject->MajorFunction присваиваются адресаподдерживаемых функций. DriverObject->MajorFunction[IRP_MJ_CREATE] =RamDiskCreateClose; DriverObject->MajorFunction[IRP_MJ_CLOSE] =RamDiskCreateClose; DriverObject->MajorFunction[IRP_MJ_READ] = RamDiskReadWrite; DriverObject->MajorFunction[IRP_MJ_WRITE] = RamDiskReadWrite; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = RamDiskDeviceControl; ntStatus = RamDiskInitializeDisk(DriverObject, &paramPath); … return ntStatus;} NTSTATUSRamDiskInitializeDisk(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING ParamPath) RamDiskInitializeDisk вызывается во время инициализации функциейDriverEntry(). Создает и инициализирует объект устройства для диска. Память дляобраза выделяется в несвопируемой области. RamDiskFormatFatвызывается для создания файловой системы FAT. Два параметра могут быть заданы при помощи реестра: − DiskSize определяет размер виртуального диска в байтах. Если система не может выделить достаточно памяти, возвращается STATUS_INSUFFICIENT_RESOURCES. По умолчанию – 1 МБ. − DriveLetter используется для указания имени диска. Строка должна быть буквой или буквой с двоеточием. Аргументы: DriverObject – указатель на объект, представляющий этот драйвер. ParamPath – указатель на подключ Parameters реестра. Возвращаемое значение: STATUS_SUCCESS если драйвер нормально инициализировался, иначе код ошибки. { STRING ntNameString; Имя устройства NT"\Device\RamDisk" UNICODE_STRING ntUnicodeString; Unicode версия ntNameString UNICODE_STRING Win32PathString; Имя Win32 "\DosDevices\Z:" PDEVICE_OBJECT deviceObject = NULL; Указатель на объектустройства PRAMDISK_EXTENSION diskExtension = NULL; Указатель на специфические данные устройства NTSTATUS ntStatus; ULONG defaultDiskSize = DEFAULT_DISK_SIZE; ULONG diskSize = DEFAULT_DISK_SIZE; UNICODE_STRING driveLetterString; WCHAR driveLetterBuffer[sizeof(WCHAR) * 10]; … Инициализация и считывание параметров конфигурации из реестра … Создание устройства «виртуальный диск» ntStatus = IoCreateDevice(DriverObject, Наш драйвер устройства sizeof(RAMDISK_EXTENSION), Размер дополнительной информации &ntUnicodeString, Имя устройства "\Device\RamDisk" FILE_DEVICE_VIRTUAL_DISK, Тип устройства 0, Свойства устройства FALSE, Особое устройство. Драйвер обрабатывает только одного клиента &deviceObject); Возвращает указатель на объект устройства … Размещение и обнуление образа диска, установление данных boot сектора, корневого каталога и пр. … Форматирование файловой системы FAT RamDiskFormatFat(diskExtension, ParamPath); … Создание символической связи между именем устройства "\Device\RamDisk" и именем Win32 "\DosDevices\Z:" ntStatus = IoCreateSymbolicLink(&diskExtension->Win32NameString,&ntUnicodeString); RamDiskInitializeDiskExit: return ntStatus;} Функция RamDiskFormatFat не представляет интереса. Она размечает выделенный образ диска в соответствии со стандартом файловойсистемы FAT. NTSTATUSRamDiskCreateClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) Функция вызывается системой ввода-вывода каждый раз, когда RamDisk открывается или закрывается. Реализация ничего не выполняет, просто корректно закрывая запрос. Аргументы: DeviceObject – указатель на объект представляемого устройства Irp – указатель на запрос ввода-вывода для этого вызова Возвращаемое значение: STATUS_INVALID_PARAMETER если параметры заданы неверно,иначе STATUS_SUCCESS. { Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS;}NTSTATUSRamDiskDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) Функция реализует ioctl функции Аргументы: DeviceObject – указатель на объект устройства Irp – указатель на запрос ввода-вывода Возвращаемое значение: STATUS_SUCCESS если поддерживаемый запрос, иначеSTATUS_INVALID_DEVICE_REQUEST. { PRAMDISK_EXTENSION diskExtension; PIO_STACK_LOCATION irpSp; NTSTATUS ntStatus; … Инициализация По умолчанию – неверный запрос Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; Определяет, какая функция требуется switch (irpSp->Parameters.DeviceIoControl.IoControlCode) { case IOCTL_DISK_GET_MEDIA_TYPES: case IOCTL_DISK_GET_DRIVE_GEOMETRY: … Возвращает параметры диска, так называемую геометрию { PDISK_GEOMETRY outputBuffer; outputBuffer = (PDISK_GEOMETRY) Irp-AssociatedIrp.SystemBuffer; outputBuffer->MediaType = RemovableMedia; outputBuffer->Cylinders = RtlConvertUlongToLargeInteger(diskExtension->NumberOfCylinders); outputBuffer->TracksPerCylinder = diskExtension->TracksPerCylinder; outputBuffer->SectorsPerTrack = diskExtension->SectorsPerTrack; outputBuffer->BytesPerSector = diskExtension->BytesPerSector; Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = sizeof(DISK_GEOMETRY); } break; case IOCTL_DISK_GET_PARTITION_INFO: … Возвращает информацию о разделе { PPARTITION_INFORMATION outputBuffer; PBOOT_SECTOR bootSector = (PBOOT_SECTOR) diskExtension->DiskImage; outputBuffer = (PPARTITION_INFORMATION)Irp- >AssociatedIrp.SystemBuffer; outputBuffer->PartitionType = (bootSector->bsFileSystemType[4] == '6')? PARTITION_FAT_16: PARTITION_FAT_12; outputBuffer->BootIndicator = FALSE; outputBuffer->RecognizedPartition = TRUE; outputBuffer->RewritePartition = FALSE; outputBuffer->StartingOffset =RtlConvertUlongToLargeInteger(0); outputBuffer->PartitionLength = RtlConvertUlongToLargeInteger(diskExtension- >DiskLength); outputBuffer->HiddenSectors = 1L; Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = sizeof(PARTITION_INFORMATION); } break; case IOCTL_DISK_VERIFY: { Выполняет проверку носителя. Операция идентична чтению PVERIFY_INFORMATION verifyInformation; verifyInformation = Irp->AssociatedIrp.SystemBuffer; irpSp->Parameters.Read.ByteOffset.LowPart = verifyInformation->StartingOffset.LowPart; irpSp->Parameters.Read.ByteOffset.HighPart = verifyInformation->StartingOffset.HighPart; irpSp->Parameters.Read.Length = verifyInformation->Length; ntStatus = RamDiskReadWrite(DeviceObject, Irp); } return ntStatus; default: Нераспознанная функция. Ошибка break; } Закончить операцию ввода-вывода. ntStatus = Irp->IoStatus.Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); return ntStatus;} NTSTATUSRamDiskReadWrite(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) Эта процедура вызывается для чтения и записи данных. Аргументы: DeviceObject – указатель объект драйвера Irp – указатель на запрос ввода-вывода Возвращаемое значение: STATUS_INVALID_PARAMETER, если параметр неверен, иначе STATUS_SUCCESS. { PRAMDISK_EXTENSION diskExtension; PIO_STACK_LOCATION irpSp; PUCHAR CurrentAddress; … Инициализация и проверка на правильность параметра … Получить указатель на данные пользователя в системном контексте CurrentAddress = MmGetSystemAddressForMdl(Irp->MdlAddress); Irp->IoStatus.Information = irpSp->Parameters.Read.Length; switch (irpSp->MajorFunction) { case IRP_MJ_READ: … Чтение RtlMoveMemory(CurrentAddress, diskExtension->DiskImage + irpSp->Parameters.Read.ByteOffset.LowPart, irpSp->Parameters.Read.Length); break; case IRP_MJ_DEVICE_CONTROL: … Проверка. Всегда все в порядке break; case IRP_MJ_WRITE: … Запись RtlMoveMemory(diskExtension->DiskImage + irpSp->Parameters.Read.ByteOffset.LowPart, CurrentAddress, irpSp->Parameters.Read.Length); break; default: … Что-то не поддерживаемое Irp->IoStatus.Information = 0; break; } Irp->IoStatus.Status = STATUS_SUCCESS; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS;} VOIDRamDiskUnloadDriver(IN PDRIVER_OBJECT DriverObject) Эта процедура вызывается системой для выгрузки драйвера.Требуется освободить все занятые ресурсы Аргументы: DriverObject – указатель на объект драйвера { … Освобождает всю выделенную для драйвера память. Удаление объекта устройства. Символическая связь рвется автоматически IoDeleteDevice(deviceObject); } Некоторые важные сокращения APC (Asynchronous Procedure Call) – асинхронный вызов процедурыARPL − инструкция выравнивания RPLCPL (Graphical User Interface) – графический интерфейс пользователяCRn (Hardware Abstraction Layer) – уровень аппаратных абстракцийDDK (Driver Development Kit) – набор для разработки драйверовDMA (Direct Memory Access) – прямой доступ к памятиDPC (Deferred Procedure Call) – отсроченный вызов процедурыDPL (Descriptor Privilege Level) – уровень привилегий дескриптораDRn – регистр отладки nEPL (Effective Privilege Level) – эффективный уровень привилегийGDI – графический интерфейс устройстваGDT (Global Descriptor Table) – глобальная таблица дескрипторовgdtr – регистр таблицы глобальных дескрипторовGUI – графический пользовательский интерфейсHAL – уровень аппаратных абстракцийHLT – команда остановки процессораIDT (Interrupt Descriptor Table) –таблица дескрипторов прерыванийidtr – регистр таблицы дескрипторов прерыванийIFS (Installable File System) – встраиваемая файловая системаIOPL – уровень привилегий ввода-вывода (в регистре флагов)IRQ (Interrupt Request) – запрос прерыванияLDT (Local Descriptor Table) – локальная таблица дескрипторовldtr – регистр таблицы локальных дескрипторовLGDT – команда загрузки таблицы глобальных дескрипторовLIDT – команда загрузки таблицы дескрипторов прерыванийLLDT – команда загрузки таблицы локальных дескрипторовLMSW – команда загрузки слова состояния процессораLPC (Local Procedure Call) – kjrfkmysq dspjd ghjwtlehsMutex (Mutual Exclusion) – мьютекс, объект, обеспечивающий взаимоисключающий доступ к ресурсу, Fast Mutex – это мьютекс, не допускающий рекурсивного захвата ресурсовPAE (Page Size Extension) – расширение размера страницыPSE (Physical Address Extension) – расширение физического адресаRPC (Remote Procedure Call) – стандарт сетевого программирования, позволяющий создавать приложения, состоящие из произвольного числа процедур, часть из которых выполняется локально, а часть – на удаленных компьютерах через сетьRPL – запрашиваемый уровень привилегийTLB (Translation Lookaside Buffer) – буфер ассоциативной трансляцииTRn – регистр пошаговой отладки nTSS (Task State Segment) – сегмент состояния задачиСокет – конечная точка коммуникационного соединения



<== предыдущая лекция | следующая лекция ==>
Summary | WL 2 FIREWALL mini

Дата добавления: 2015-09-07; просмотров: 380. Нарушение авторских прав; Мы поможем в написании вашей работы!



Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

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

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

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

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

Закон Гука при растяжении и сжатии   Напряжения и деформации при растяжении и сжатии связаны между собой зависимостью, которая называется законом Гука, по имени установившего этот закон английского физика Роберта Гука в 1678 году...

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

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

Типовые ситуационные задачи. Задача 1. Больной К., 38 лет, шахтер по профессии, во время планового медицинского осмотра предъявил жалобы на появление одышки при значительной физической   Задача 1. Больной К., 38 лет, шахтер по профессии, во время планового медицинского осмотра предъявил жалобы на появление одышки при значительной физической нагрузке. Из медицинской книжки установлено, что он страдает врожденным пороком сердца....

Studopedia.info - Студопедия - 2014-2024 год . (0.011 сек.) русская версия | украинская версия