HPC.ru lite - Все форумы
Форум: Программирование для КПК
Тема: Определение процессора - CPUID
[Ответить]
mkol [16.01.2005 23:46] Определение процессора - CPUID:
У ARM процессоров (начиная с определенной версии) есть специальный регистр CP15, в котором храниться подробная информация о нем: изготовитель, модель, ревизия и т.д. (как CPUID у i486 и выше). Где можно найти подробное описание битов этого регистра для всех моделей XScale, чтобы не пробовать методом тыка - где мне взять столько моделей КПК?
Пока для меня вырисовывается такая картина - CP15: 0x6905aaab, где 6905 - идентификатор Intel XScale, aaa - как раз то что я и хочу узнать, b - ревизия. Другие регистры отвечают за управление процессором - хорошо бы узнать подробно все и о них.
P.S. Понятно, что искать надо на www.intel.com, но хочется конкретной ссылки, чтобы не закачивать в поисках нужного тонны информации через GPRS.
mkol [20.01.2005 18:16] :
Пришлось скачать 12 Мб с www.intel.com, где нашел подробную информацию о битах нулевого регистра (т.е. CPUID) сопроцессора CP15.
alexey_s [30.01.2005 01:04] :
ты не могбы пример проги сюда запостить как эти регистры читать?
PS начал недавно изучать PocketC в доках ненего не нарыл
mkol [31.01.2005 20:48] :
1) Создаешь файл cpuid.asm и компилируешь его в cpuid.obj (armasm.exe):
___ AREA |.text|, CODE
___ EXPORT GetCPUID
GetCPUID
___ mrc p15, 0, r3, c0, c0, 0
___ mov r0, r3
___ mov pc, lr
___ END
( ___ означает пробелы)
2) Подключаешь в eVC файл cpuid.obj и вставляешь в C++ :
extern "C"
{
BOOL SetKMode(BOOL fMode);
int GetCPUID();
}
3) Теперь можешь использовать функцию в своей программе:
int n = 0;
SetKMode(true); // переход в режим ядра (на практике иногда ты уже в нем)
n = GetCPUID();
SetKMode(false); // выход из режима ядра
if ((n & 0xffffe3f0) == 0x69054110)
// CPU = XScale PXA270 series
Справка: некоторые производители КПК забыли перевести CPU из превилегированного режима в режим пользователя при передаче управления пользователю - досадная оплошность, которая приводит к совершенной незащищенности ОС (CPU и ОС все имеют для поддержки защиты, но производители ее игнорируют - рай для хакеров). Ошибка в какой-нибудь программе может привести к зависанию или даже к жесткой перезагрузке КПК (сообщение о нарушении защиты или голубой экран смерти вы не увидите).
4) Описание битов:
0-3: степпинг
4-9: 010001 = PXA27x
10-12: ревизия
13-15: 010 = XScale
16-23: 00000101 = ARM5TE
24-31: 0x69 = Intel
mkol [01.02.2005 22:58] :
Недавно с помощью PGCC проделал все тоже самое прямо на КПК: создал два файла cpuid.asm и cpuid.cpp, откомпилировал каждый файл в obj, потом связал все вместе в exe файл и запустил:
___ .text
___ .global cpuid
cpuid:
___ mrc p15,0,r3,c0,c0,0
___ mov r0,r3
___ mov pc,lr
#include
extern "C" int cpuid();
int WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPTSTR CmdLine, int CmdShow)
{
TCHAR str |18|; // квадратные скобки
wsprintf(str, _T("%X"), cpuid());
MessageBox(NULL, str, _T("CPUID"), MB_OK);
return 0;
}
[Ответить]