Я работаю над модулем ядра Linux, в котором мне нужно прочитать CPUID процессора, чтобы узнать, присутствует ли функция. В документации к набору микросхем указано:CPUID и MSR читает Linux-x86
«Доступ к этому MSR поддерживается, когда либо CPUID (EAX = 14H, ECX = 0): ECX [бит 0], либо CPUID. (EAX = 14H, ECX = 0): ECX [бит2 ]»
Однако я использую следующий код для чтения CPUID:
int func()
{
int a, b;
for (a = 0; a < 5; a++)
{
__asm__("cpuid"
:"=a"(b) // EAX into b (output)
:"0"(a) // a into EAX (input)
:"%ebx","%ecx","%edx"); // clobbered registers
printk("The code %i gives %llx\n", a, b);
}
return 0;
}
адаптировано из: https://en.wikipedia.org/wiki/CPUID#EAX.3D1:_Processor_Info_and_Feature_Bits
, но я понятия не имею, как это работает, или какие значения я читаю. Может кто-нибудь объяснить мне, как работает этот код, а также как я могу читать данные вышеприведенных регистров CPUID, а также EAX = 80000008h.
Благодаря
Используйте функцию CPUID обертку, если вы не понимаете, рядный ASM себя. Есть несколько вариантов. –
@ Питер Кордес. Спасибо за это ... – vitamike
Возможный дубликат [Intel Processor: «Если CPUID.06H: EAX. \ [7 \] = 1« Значение? »(Https://stackoverflow.com/questions/45883852/intel-processor- if-cpuid-06heax-7-1), что также является вопросом Linux-ядра, и ответ показывает функции оболочки CPUID Linux –