Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
метод1 спо.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
227 Кб
Скачать
☆

Определение типа процессора и ос

Общую информацию об архитектуре и количестве процессоров в системе можно получить, используя функцию GetSystemInfo, передав в качестве аргумента указатель на структуру SYSTEM_INFO:

typedef struct _SYSTEM_INFO { union { DWORD dwOemId; struct { WORD wProcessorArchitecture; WORD wReserved; }; }; DWORD dwPageSize; LPVOID lpMinimumApplicationAddress; LPVOID lpMaximumApplicationAddress; DWORD_PTR dwActiveProcessorMask; DWORD dwNumberOfProcessors; DWORD dwProcessorType; DWORD dwAllocationGranularity; WORD wProcessorLevel; WORD wProcessorRevision;

} SYSTEM_INFO;

dwOemId

Устаревший элемент, оставлен для совместимости с WndowsNT 3.5 и ранее. Новые приложения должны использовать wProcessorArchitecture.

wProcessorArchitecture Архитектура системы:

PROCESSOR_ARCHITECTURE_UNKNOWN PROCESSOR_ARCHITECTURE_INTEL Windows NT 3.51: PROCESSOR_ARCHITECTURE_MIPS Windows NT 4.0 and earlier: PROCESSOR_ARCHITECTURE_ALPHA Windows NT 4.0 and earlier: PROCESSOR_ARCHITECTURE_PPC 64-bit Windows: PROCESSOR_ARCHITECTURE_IA64 64-bit Windows: PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 64-bit Windows: PROCESSOR_ARCHITECTURE_AMD64

dwPageSize размер страниц памяти, используемый функцией GlobalAlloc

lpMinimumApplicationAddress и lpMaximumApplicationAddress

Указатели на минимальный и максимальный адреса памяти, доступные программе

dwActiveProcessorMask

Маска, представляющая активный процессор. Бит 0 соответствует 0; бит 31 соответствует процессору 31.

dwNumberOfProcessorsКоличество процессоров в системе.

dwProcessorType

Устаревший элемент, оставленный для совместимости с WindowsNT 3.5 и ранее

dwAllocationGranularity

Гранулярность с которой выделяется виртуальная память. К примеру, если VirtualAlloc запросила для выделения 1 байт, то будет выделено как минимум dwAllocationGranularity байт.

wProcessorLevelсистемный архитектурно-зависимый уровень процессора. используется только для отображения на экране.

ЕслиwProcessorArchitectureсоответствует PROCESSOR_ARCHITECTURE_INTEL, wProcessorLevelсодержит CPU Vendor.

ЕслиwProcessorArchitectureсоответствует PROCESSOR_ARCHITECTURE_IA64, wProcessorLevelустановленв 1.

ЕслиwProcessorArchitectureсоответствует PROCESSOR_ARCHITECTURE_MIPS, wProcessorLevelвформе 00xx, гдеxx – это 8-битныйномерисполнения. Может принимать следующие значения

Константа

Значение

0004

MIPS R4000

ЕслиwProcessorArchitectureсоответствуетPROCESSOR_ARCHITECTURE_ALPHA, wProcessorLevelвформеxxxx, гдеxxxx - 16-битныйномерверсиипроцессора. Принимает следующие значения

Константа

Значение

21064

Alpha 21064

21066

Alpha 21066

21164

Alpha 21164

ЕслиwProcessorArchitectureсоответствуетPROCESSOR_ARCHITECTURE_PPC, wProcessorLevelвформеxxxx, гдеxxxx – это 16-битный номер версии процессора. Может принимать следующие значения

Константа

Значение

1

PPC 601

3

PPC 603

4

PPC 604

6

PPC 603+

9

PPC 604+

20

PPC 620

wProcessorRevision

Processor

Meaning

Intel 80386 or 80486

Значение типа xxyz.

Если xx соответствует 0xFF, y - 0xA номер модели, и z определяет степпинг, иначе xx + 'A' определяет степпинг

Intel Pentium, Cyrix, or NextGen 586

Значение типа xxyy, где xx - модель и yy - степпинг.

MIPS

Значение типа 00xx, где xx 8-битный номер ревизии.

ALPHA

Значение типа xxyy, где xxyy младшее слово ревизии процессора.

PPC

Значение типа xxyy, где xxyy младшее слово ревизии процессора. Изображается в виде: xx.yy

Одним из вариантов определения типа процессора и его частоты является использование инструкций CPUID и RDTSC. CPUID определяет:

  • производителя процессора;

  • поддержку процессором соответствующих технологий;

  • информацию о типе и размере кэш-памяти 1-го, 2-го и 3-го уровня процессора, а также информацию о TLB-буферах процессора;

  • название процессора (не во всех) и в некоторых случаях его частоту;

  • дату, времени выпуска и партии (Только для процессоров Transmeta).

Для использования этой инструкции проверяется, поддерживается ли она тестируемым процессором. Это тестируется возможностью программного изменения 21-го бита регистра EFLAGS, которое свидетельствует о поддержки процессором инструкции CPUID. Делается это следующим образом:

pushfd ; Сохранить EFLAGS в стек

pop eax ; Поместить EFLAGS в EAX

mov ebx, eax ; Сохранить в EBX для последующего тестирования

xor eax, 00200000h ; Переключить бит 21

push eax ; Скопировать измененное значение в стек

popfd ; Сохранить измененное EAX в EFLAGS

pushfd ; EFLAGS на вершину стека

pop eax ; Сохранить EFLAGS в EAX

cmp eax, ebx ; Проверить 21-й бит на изменение

jz NO_CPUID ; Если нет изменения, то CPUID не поддерживается

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

CPUID при eax = 0

Таблица 1. Значения регистров после выполнения eax = 0

eax

Максимально допустимое значение, которое может быть помещено в eax для получения информации о процессоре с помощью CPUID (для стандартного уровня – 0, 1, 2, 3, 4, 5). Все остальные значения параметра стандартного уровня CPUID должны быть не больше этого значения.

ebx

Первые четыре символа строки производителя в обратном порядке

edx

Следующие четыре символа строки производителя в обратном порядке

ecx

Последние четыре символа строки производителя в обратном порядке

Варианты строк производителя:

  • Intel – ”GenuineIntel”

  • AMD – ”AuthenticAMD” (в некоторых предварительных образцах “AMD ISBETTER”)

  • Cyrix – ”CyrixInstead”

  • UMC – ”UMC UMC UMC ”

  • NexGen – “NexGenDriven”

  • Centaur – “CentaurHauls”

  • Rise Technology – “RiseRiseRise”

  • SiS – “SiS SiS SiS ”

  • Transmeta – “GenuineTMx86”

  • National Semiconductor – “Geode by NSC”

Эта строчка определяет производителя процессора (некоторые ранние Pentium не возвращали строчку производителя). Обратите внимание, что все производители должны использовать 12 символов, что все они с успехом и делают. Некоторые производители вместо своей строчки использовали строчку компании Intel, что приводит к некоторым сложностям, к счастью это относится к редким процессорам IDT (Centaur).

CPUID при eax = 1

Таблица 2. Значения регистров после выполнения eax = 1

eax

32-x битовый массив, содержащий основную информацию о типе процессора

Биты 27-20

Расширенное семейство (00b – IntelP4, AMDK8; 01b – IntelItaniumII (IA-64))

Биты 19-16

Расширенная модель

Биты 13-12

Тип процессора (00b – основной процессор, 01b – Overdrive,

11b – дополнительный процессор в многопроцессорных системах)

Биты 11-8

Семейство (таблица 2.1)

Биты 7-4

Модель (таблица 2.2)

Биты 3-0

Степпинг (поколение ядра процессора)

Биты 31-0

95-64 биты 96-битного уникального номера процессора (Intel Pentium III). В общем случае эти биты формируют сигнатуру процессора (совмещают информацию о модели, семействе, степпинге, расш. мод., типе, расш. сем. )

ebx

Биты 7-0

Brand ID – Указывает на тип процессора, если 0, то не поддерживается (для Intel поддерживается, начиная с Pentium III модели 8, а для AMD, начиная с Opteron)

Биты 15-8

Кол-во 8 байтовых порций CLFLUSH (Intel) (только у процессоров с поддержкой CLFLUSH)

Биты 23-16

Число логических процессоров (только у процессоров с поддержкой Hyper-Threading)

Биты 31-24

Физический ID локального программно-доступного контроллера прерываний

ecx

Информация о возможностях процессора (на данный момент только для Intel таблица 2.4)

edx

Информация о возможностях процессора (таблица 2.3)

Таблица 2.1. Таблица семейств процессоров

Семейство

Тип процессора

4

все 80486, AMD 5x86, Cyrix 5x86

5

Intel P5, P54C, P55C, P24T (Pentium) NexGen Nx586 Cyrix M1 AMD K5, K6 Centaur C6, C2, C3 Rise mP6 SiS 55x Transmeta Crusoe TM3x00 и TM5x00

6

Intel Pentium Pro, PII, PIII, Pentium M (Centrino) AMD K7 (Athlon) Cyrix M2 VIA C3

7

Intel Itanium (IA-64)

F

Означает, что надо проверить расширенное семейство

Таблица 2.2. Таблица моделей процессоров

Тип

Модель

Процессор

все

F

Означает, что надо проверить расширенную модель

Intel 80486

0

i80486DX-25/33

1

i80486DX-50

2

i80486SX

3

i80486DX2

4

i80486SL

5

i80486SX2

7

i80486DX2WB

8

i80486DX4

9

i80486DX4WB

UMC 80486

1

U5D

2

U5S

AMD 80486

3

80486DX2

7

80486DX2WB

8

80486DX4

9

80486DX4WB

E

5x86

F

5x86WB

Cyrix 5x86

9

5x86

Cyrix MediaGX

4

GX, GXm

Intel P5-ядро

(Pentium)

0

P5 A-step

1

P5 (0.80 µm) 60, 66 MHz

2

P54C

3

P24T Overdrive

4

P55C

7

P54C

8

P55C (0.25µm)

NexGen Nx586

0

Nx586 orNx586FPU (поздние версии)

Cyrix M1

2

6x86

Cyrix M2

0

6x86MX

AMD K5

0

SSA5 (PR75, PR90, PR100)

1

5k86 (PR120, PR133)

2

5k86 (PR166)

3

5k86 (PR200)

AMD K6

6

K6 (0.30 µm)

7

K6 (0.25 µm)

8

K6-2

9

K6-III

D

K6-2+ и K6-III+ (0.18 µm)

Centaur

4

C6

8

C2

9

C3

VIA C3

5

Cyrix M2 ядро

6

WinChip C5A ядро

7

WinChip ядро C5B (если степпинг = 0..7)

7

WinChip ядро C5C (если степпинг = 8..F)

8

WinChip ядро C5N (если степпинг = 0..7)

9

WinChip ядро C5XL

Rise

0

mP6 (0.25 µm)

2

mP6 (0.18 µm)

SiS

0

55x

Transmeta

4

Crusoe TM3x00 и TM5x00

Intel P6

(Pentium Pro, Pentium II, Pentium III)

и Pentium M

0

Pentium Pro A-step

1

Pentium Pro

3

Pentium II (0.28 µm) (Klamath)

5

Pentium II (0.25 µm) (Deschutes)

6

Celeron (Medocino) 128 Kb L2

7

Pentium III (0.25 µm) (Katmai)

8

Pentium III (0.18 µm) 256 Kb L2 (Coppermine)

9

Pentium M (Centrino) (0.13 µm) 1 MB L2

A

Pentium III (0.18 µm) 1 или 2 MB L2 (Cascades)

B

Pentium III (0.13 µm) 256 или 512 KB L2 (Tualatin)

AMD K7

1

Athlon (0.25 µm)

2

Athlon (0.18 µm)

3

Duron (ядро Spitfire)

4

Athlon (ядро Thunderbird)

6

Athlon (ядро Palomino)

7

Duron (ядро Morgan)

8

Athlon (ядро Thoroughbred)

A

Athlon (ядро Barton)

AMD K8

4

Athlon 64 (0.13 µm)

5

Opteron DP (0.13 µm)

Intel P4-ядро

0

Pentium 4 (0.18 µm) (ядро Willamete)

1

Pentium 4 (0.18 µm) (ядро Willamete)

2

Pentium 4 (0.13 µm) (ядро Northwood)

3

Pentium 4 (0.09 µm) (ядро Prescott)

Таблица 2.3. Поля регистра edx после выполнения команды CPUID (при eax=1)

Бит

Имя

Если Бит = 1

0

FPU

Присутствует Математический сопроцессор

1

VME

Поддержка расширенных возможностей обработки прерываний в режиме виртуального i8086

2

DE

Поддержка отладки

3

PSE

Поддержка страниц размером 4 MB

4

TSC

Счетчик меток реального времени

5

MSR

Поддержка команд rdmsr и wrmsr

6

PAE

Поддержка физического адреса более 32 бит

7

MCE

Поддержка исключений 18 – об аппаратных ошибках

8

CX8

Поддержка инструкции cmpxchg8b

9

APIC

Микропроцессор содержит программно доступный контроллер прерываний

10

-

Зарезервировано

11

SEP

Поддержка инструкций быстрых системных вызовов sysenter и sysexit

12

MTRR

Поддержка регистра mtrr_cap (относится к MSR-регистрам)

13

PGE

Поддержка глобальных страниц

14

MCA

Поддержка архитектуры машинного контроля

15

CMOV

Поддержка инструкций условной пересылки cmov, fcmovcc, fcomi

16

PAT

Процессор поддерживает таблицу атрибутов страницы

17

PSE-36

Процессор поддерживает 4 MB страницы, которые способны адресовать физическую память до 64 GB

18

PSN

Уникальный серийный номер процессора

19

CLFLSH

Поддержка инструкции CLFLUSH

20

-

Зарезервировано

21

DS

Поддержка записи отладочной информации

22

ACPI

Управление охлаждением процессора с помощью пустых циклов в зависимости от температуры

23

MMX

Поддержка MMX

24

FXSR

Поддержка инструкций FXSAVE и FXRSTOR

25

SSE

Поддержка SSE

26

SSE2

Поддержка SSE2

27

SS

Управление конфликтующими типами памяти

28

HTT

Поддержка Hyper-Threading

29

TM

Поддержка автоматического мониторинга температуры

30

-

Зарезервировано

31

SBF

Сигнал Останова при FERR

Таблица 2.4. Поля регистра ecx после выполнения команды CPUID (при eax=1)

Бит

Имя

Если Бит = 1

0

PNI

Поддержка новых инструкций процессора Prescott (SSE3)

3

MONITOR

MONITOR/MWAIT

4

DS-CPL

Поддержка расширенной записи отладочной информации

7

TM2

Поддержка технологии ThermalMonitor 2

8

EST

Улучшенная технология SpeedStep

10

CNXT-ID

Показывает можно ли переключить способ работы кэш-памяти на адаптивный или распределенный

По результатам побитового сравнения этих полей делается заключение о поддержке соответствующих технологий. Делать заключения о наличии или отсутствии технологий, исходя из принадлежности процессора семейству, модели и т.п. строго говоря, нельзя. Однако из-за того, что некоторые процессоры по-своему трактуют некоторые биты этих полей, приходиться учитывать влияние семейства, модели и т.п. Особый интерес представляют бит 4 регистра EDX после выполнения команды CPUID с EAX=1. Этот бит определяет поддержку процессором внутреннего счётчика тактов. Если данный счётчик поддерживается, то с определённой погрешностью можно определить частоту процессора, используя команду RDTSC. RDTSC выполняет чтение 64-битного счётчика тактов и результат возвращает в паре регистров EDX:EAX.

unsignedlongredx,reax; // Для временного хранения регистров