- •Командные файлы
- •Теоретические сведения
- •1. Выполнение командных файлов
- •2. Командные файлы с заменяемыми параметрами
- •3. Комментарии в командном файле
- •4. Сообщения при выполнении командного файла
- •5. Приостановка выполнения командного файла
- •6. Переходы в командном файле
- •7. Проверка условий в командном файле
- •8. Циклическое выполнение команд в командном файле
- •9. Сдвиг параметров при обработке командного файла
- •10. Установка значения переменной окружения
- •11. Операции перенаправления
- •12. Некоторые команды выполняемые Windows
- •Вопросы к защите лабораторной работы
- •Лабораторная работа № 2 Определение ресурсов компьютера
- •Теоретические сведения
- •Возвращаемое значение
- •Определение типа процессора и ос
- •If (isTscSupport) // Определение поддержки счётчика tsc
- •ReturnValuesПри удачном выполнении возвращает ненулевое значение. RemarksПроцессорная маска – это битовый вектор, в котором каждый бит представляет процессоры, на которых разрешён запуск процесса.
- •Определение мыши
- •Определение типа клавиатуры
- •ParametersnTypeFlagТип запрашиваемой информации
- •Информация о физической памяти
- •Информация о видеокарте
- •Информация о накопителях
- •Замечание
- •Варианты заданий
- •Вопросы к защите лабораторной работы
- •Лабораторная работа № 3 Главная загрузочная запись mbr
- •Теоретические сведения
- •Алгоритм именования дисков
- •Функции api для чтения информации с диска
- •Требования к программе:
- •Варианты заданий
- •Вопросы к защите
- •Лабораторная работа №4 Применение функций Windows api для поиска и работы с файлами и каталогами
- •Теоретические сведения
- •Варианты заданий к лабораторной работе №4
- •Лабораторная работа №5
- •Варианты заданий
- •Вопросы к защите
- •Лабораторная работа №6
- •Теоретические сведения
- •Задания к лабораторной работе
- •Вопросы для защиты лабораторной работы
Определение типа процессора и ос
Общую информацию об архитектуре и количестве процессоров в системе можно получить, используя функцию 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; // Для временного хранения регистров
