Всем, привет. Нужно измерить время запроса к физической памяти. Задача - обратиться к физической памяти. Следующие способы чтения работают только на passive level: --ZwOpenSection(Device\PhysicalMemory) и ZwMapViewOfSection --MmMapIoSpace --ZwCreateFile(Device\PhysicalMemory) - не завёлся, см ниже. Код (Text): WCHAR wc_physmem_mame[] = L"\\Device\\PhysicalMemory"; InitializeObjectAttributes ( &attributes, &us_physmem_mame, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL ); ... NTSTATUS nt_status = ZwCreateFile(&h_file, FILE_READ_EA, &attributes, &IoStatus, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, FILE_NON_DIRECTORY_FILE|FILE_WRITE_THROUGH,NULL, 0 ); /* -> nt_status = STATUS_OBJECT_TYPE_MISMATCH */ Поделитесь опытом, какие могут быть альтернативные способы чтения физической памяти? Хорошо бы найти способ, работающий на повышенном приоритете.
И не должен был, так нельзя делать в принципе. Ну тут вариантов как бы не шибко-то много. Например, есть MmAllocatePagesForMdl() с последующим проецированием на а.п. ядра через MmGetSystemAddressForMdlSafe() и обращениями через полученный виртуальный адрес. Дело в том, что это чуть ли не самый распространённый метод доступа к физической памяти, так что результат будет вполне актуальным. Но это смотря для чего тебе нужен результат, такой способ может и не подойти.
x64 спасибо за ответ. Необходимо измерить время запроса к физической памяти. Прочитанные данные не рассматриваются. Время хорошо бы получать наиболее точно, по возможности на IRQL>0
Тебе нужно номинальное время или фактическое? Если фактическое, то предложенный выше способ для этих целей подойдёт. Если номинальное, то каким-то образом надо прочитать значения таймингов планок памяти (хотя, думаю, это не то, что тебе нужно всё же). Как именно это сделать - не знаю, пусть лучше железячники подскажут, возможно, как-то через WMI можно (например, что-то вроде Win32_PhysicalMemory). На Windows 7 указанные выше функции позволяют работать с физической памятью на повышенных IRQL.
Нужно узнать время затрачиваемое системой на обращение к памяти. По твоей формулировке подходит фактическое. Функция MmAllocatePagesForMdl должна мне помочь, но есть ли способ обращения к физ. памяти без выделения доп. памяти (Mdl)? Существует ли для физической памяти аналог оператора разыменования как для виртуальной? Чем меньше будет лишнего в операции, тем точнее будет полученное время. Вот при bluescreen, как происходит дамп физической памяти?
Ты повторяешь эту фразу уже 3-ий раз, но она ничего не значит, на самом деле. О каком обращении идёт речь? В какой момент? Система большая и мест, где она обращается к физической памяти, немало. Нет. Почти все драйвера и сама система обращаются к физической памяти через виртуальную (MDL), так зачем тебе что-то ещё? Через проекцию на виртуальное а.п. ядра. Функции я уже приводил выше, и сама система делает так же.
x64 благодарю за ответы Обращение к памяти и измерение затрачиваемого времени осуществляю сам. Постараюсь фразу пояснить кодом: Код (Text): for (...){ t_start[i] = get_time(); request_to_physical_memory(next_phys_addr); t_finish[i] = get_time(); ... }... Функция get_time() у меня есть, необходимо найти функцию request_to_physical_memory(). Для того, чтобы не измерить "среднюю температуру по больнице", функция request_to_physical_memory() должна выполнять по-меньше лишнего(1) и работать на повышенных приоритетах(2). Такой подход хочу использовать для идентификации режима работы компьютерной системы, а для этого, как я понимаю, нужно выполнение двух условий см. выше.