При чтении регистра, винда "зависает". Если для регистров не назначать дополнительный виртуальный адрес, а воспользоватся 0xfffe0000, то всё нормально. просмотрел в таблице страниц, аттрибуты почти одинковые - различаются только в поле Aviable for programmers used. Не думаю что это критично. Код (Text): ULONG GetAPICBaseAndInfo(PUCHAR *base) { ULONG msrLow, msrHi; __asm mov ecx, IA32_APIC_BASE_MSR __asm rdmsr __asm mov msrLow, eax __asm mov msrHi, edx *base = (PUCHAR)(msrLow & 0xFFFFF000); return (msrLow & 0x0800); } ULONG APICReadReg(ULONG offset) { return *(PULONG)(apicBase + offset); } ULONG InitAPICModule() { PHYSICAL_ADDRESS physBase; __asm int 3 if (!GetAPICBaseAndInfo(&apicBase)){ DbgPrint("[Error] InitAPICModule(): APIC global enable bit is 0.\n"); return 0; } DbgPrint("[Info] InitAPICModule(): Physical APIC base = %08X.\n", apicBase); physBase.QuadPart = (ULONGLONG)apicBase; apicBase = MmMapIoSpace(physBase, 0x1000, MmNonCached); // apicBase = (PUCHAR)0xfffe0000; DbgPrint("[Info] InitAPICModule(): Virtual APIC base = %08X.\n", apicBase); if (!(APICReadReg(APIC_REG_SVR) & 0x0100)){ DbgPrint("[Error] InitAPICModule(): APIC software enable bit is 0.\n"); return 0; } return 1; }
n0name Если программа зависает на инструкции __asm rdmsr, то может быть следующее поскольку это модельно-специфические регистры, то индекс IA32_APIC_BASE_MSR на разных моделях может быть разным. К примеру у меня такая же ситуация была с чтением LastBrunchFromIP на 3 пне и на 4 пне, на пне 4 код исправно работающий на 3 выдавал исключение - недопустимая комманда.
n0name APIC_REG_SVR - а при его чтении не запрещаются ли прерывания вообще? И как его чтение вообще отражается на APIC.