stringtranslate.com

ID de CPU

En la arquitectura x86 , la instrucción CPUID (identificada por un CPUID código de operación ) es una instrucción complementaria del procesador (su nombre deriva de CPU Identification) que permite al software descubrir detalles del procesador. Fue introducido por Intel en 1993 con el lanzamiento de los procesadores 486 mejorados con Pentium y SL . [1]

Un programa puede utilizar para determinar el tipo de procesador y si se implementan CPUIDfunciones como MMX / SSE .

Historia

Antes de la disponibilidad general de la CPUIDinstrucción, los programadores escribían código de máquina esotérico que explotaba diferencias menores en el comportamiento de la CPU para determinar la marca y el modelo del procesador. [2] [3] Con la introducción del procesador 80386, EDX al reiniciar indicaba la revisión, pero esto solo era legible después del reinicio y no había una forma estándar para que las aplicaciones leyeran el valor.

Fuera de la familia x86, la mayoría de los desarrolladores todavía deben utilizar procesos esotéricos (que implican sincronización de instrucciones o activadores de fallas de CPU) para determinar las variaciones en el diseño de la CPU que están presentes.

En la familia Motorola 680x0, que nunca tuvo CPUIDinstrucciones de ningún tipo, ciertas instrucciones específicas requerían privilegios elevados. Estos podrían usarse para diferenciar a varios miembros de la familia de CPU. En el Motorola 68010 se privilegió la instrucción MOVE de SR . Este notable cambio en las instrucciones (y en la máquina de estados) permitió que el 68010 cumpliera con los requisitos de virtualización de Popek y Goldberg . Debido a que el 68000 ofrecía un MOVE sin privilegios desde SR, las 2 CPU diferentes podían diferenciarse mediante la activación de una condición de error de CPU.

Si bien la CPUIDinstrucción es específica de la arquitectura x86, otras arquitecturas (como ARM) a menudo proporcionan registros en el chip que se pueden leer de maneras prescritas para obtener el mismo tipo de información proporcionada por la CPUIDinstrucción x86.

Llamando a CPUID

El CPUIDcódigo de operación es 0F A2.

En lenguaje ensamblador , la CPUIDinstrucción no toma parámetros ya que CPUIDimplícitamente utiliza el registro EAX para determinar la categoría principal de información devuelta. En la terminología más reciente de Intel, esto se denomina hoja CPUID. CPUIDdebe llamarse EAX = 0primero, ya que esto almacenará en el registro EAX el parámetro de llamada EAX más alto (hoja) que implementa la CPU.

Para obtener información de función extendida CPUIDse debe llamar con el bit más significativo de EAX configurado. Para determinar el parámetro de llamada de función extendida más alto, llame CPUIDcon EAX = 80000000h.

Las hojas de CPUID superiores a 3 pero inferiores a 80000000 son accesibles solo cuando los registros específicos del modelo tienen IA32_MISC_ENABLE.BOOT_NT4 [bit 22] = 0 (que es así de forma predeterminada). Como sugiere el nombre, Windows NT 4.0 hasta SP6 no arrancaba correctamente a menos que se estableciera este bit, [4] pero las versiones posteriores de Windows no lo necesitan, por lo que se puede suponer que las hojas básicas mayores a 4 son visibles en los sistemas Windows actuales. A partir de septiembre de 2023 , las licencias básicas válidas llegan hasta las 20h, pero la información devuelta por algunas licencias no se divulga en la documentación disponible públicamente, es decir, están "reservadas".

Algunas de las hojas agregadas más recientemente también tienen subhojas, que se seleccionan mediante el registro ECX antes de llamar CPUID.

EAX =0: parámetro de función más alto e ID del fabricante

Esto devuelve la cadena de identificación del fabricante de la CPU: una cadena ASCII de doce caracteres almacenada en EBX, EDX, ECX (en ese orden). El parámetro de llamada básico más alto (el valor más grande que se puede establecer en EAX antes de llamar CPUID) se devuelve en EAX.

Aquí hay una lista de procesadores y la función más alta implementada.

Las siguientes son cadenas de identificación de fabricantes de procesadores conocidos:

Las siguientes son cadenas de identificación utilizadas por los núcleos de CPU software de código abierto :

Las siguientes son cadenas de ID conocidas de máquinas virtuales:

Por ejemplo, en un procesador GenuineIntel, los valores devueltos en EBX son 0x756e6547, EDX son 0x49656e69 y ECX son 0x6c65746e. El siguiente código de ejemplo muestra la cadena de ID del proveedor, así como el parámetro de llamada más alto que implementa la CPU.

.intel_syntax sin prefijo .texto.m0: .string "CPUID: %x\n"  .m1: .string "Número de función básica más grande implementado: %i\n"  .m2: .string "ID de proveedor: %s\n"   .globl principal principal:empujar r12 movimiento eax , 1  sub rsp , 16   CPU le rdi , .m0 [ rasgar ]  mov esi , eax  llamar a printfmovimiento eax , 0   CPUle rdi , .m1 [ rasgar ]  mov esi , eax  mov r12d , edx  movimiento ebp , ecx  llamar a printf mov 3 [ rsp ], ebx  lea rsi , 3 [ rsp ]   le rdi , .m2 [ rasgar ]   movimiento 7 [ rsp ], r12d   mov 11 [ rsp ], rebp  llamar a printfañadir rsp , 16  pop r12 retirado .sección .note.GNU - pila , " " , @progbits 

En algunos procesadores, es posible modificar la cadena de ID del fabricante informada por CPUID (EAX = 0) escribiendo una nueva cadena de ID en MSR ( registros específicos del modelo ) particulares usando la WRMSRinstrucción. Esto se ha utilizado en procesadores que no son Intel para habilitar funciones y optimizaciones que se han deshabilitado en el software para CPU que no devuelven la GenuineIntelcadena de ID. [14] Los procesadores que se sabe que poseen tales MSR incluyen:

EAX=1: información del procesador y bits de funciones

Esto devuelve la información de paso , modelo y familia de la CPU en el registro EAX (también llamado firma de una CPU), indicadores de funciones en los registros EDX y ECX, e información de funciones adicionales en el registro EBX. [21]

En octubre de 2023, se conocen los siguientes ID de familia de procesadores x86: [23]

  1. ^ El procesador i386 no admite la CPUIDinstrucción; sin embargo, devuelve el ID de familia 3hen el valor de reinicio de EDX.
  2. ^ Se ha informado que la identificación familiar 8hse evitó deliberadamente para la familia de procesadores Pentium 4 debido a la incompatibilidad con Windows NT 4.0. [33]

La información del procesador y los indicadores de características son específicos del fabricante, pero generalmente otros fabricantes utilizan los valores de Intel por razones de compatibilidad.

  1. ^ En algunos procesadores más antiguos, la ejecución CPUIDcon un índice de hoja (EAX) mayor que 0 puede dejar EBX y ECX sin modificar, manteniendo sus valores anteriores. Por este motivo, se recomienda poner a cero EBX y ECX antes de ejecutar CPUIDcon un índice de hoja de 1.

    Los procesadores que exhiben este comportamiento incluyen Cyrix MII [37] e IDT WinChip 2. [38]

  2. ^ En procesadores de IDT, Transmeta y Rise (ID de proveedor CentaurHaulsy GenuineTMx86) RiseRiseRise, la CMPXCHG8Binstrucción siempre es compatible; sin embargo, es posible que el bit de característica de la instrucción no esté configurado. Esta es una solución para un error en Windows NT. [39]
  3. ^ Solo en los primeros procesadores AMD K5 ( AuthenticAMDFamilia 5 Modelo 0), EDX bit 9 solía indicar compatibilidad con PGE. Esto se movió al bit 13 desde K5 Modelo 1 en adelante. [40]
  4. ^ Intel AP-485, revisiones 006 [41] a 008, enumera CPUID. (EAX = 1): EDX [bit 10] con el nombre "MTRR" (aunque se describe como "Reservado"/"No cuente con su valor "): este nombre se eliminó en revisiones posteriores de AP-485 y el bit figura como reservado sin nombre desde entonces.
  5. ^ Solo en los procesadores Pentium Pro ( GenuineIntelFamilia 6 Modelo 1), el bit 11 de EDX no es válido: el bit que configuró, pero las instrucciones SYSENTERy SYSEXITno son compatibles con el Pentium Pro. [42]
  6. ^ FCMOV y FCOMIlas instrucciones solo están disponibles si la FPU x87 integrada también está presente (indicada por EDX bit 0).
  7. ^ ECX bit 16 aparece como "Reservado" en la documentación pública de Intel y AMD y no está configurado en ningún procesador conocido. Sin embargo, se informa que algunas versiones del kernel de Windows Vista verifican este bit [43] ; si está configurado, Vista lo reconocerá como una característica de "canales de procesador".
  8. ^ En las CPU Intel que admiten PSN (número de serie del procesador), el PSN se puede desactivar configurando el bit 21 de MSR 119h( BBL_CR_CTL) en 1. Al hacerlo, CPUID.(EAX=1):EDX[bit 18] devolverá 0.
  9. ^ En procesadores que no son Itanium x86, la compatibilidad con el bit de no ejecución se indica en CPUID.(EAX=8000_0001):EDX[bit 20] en su lugar.
  10. ^ El bit 28 de EDX, si está configurado, indica que los bits 23:16 de CPUID.(EAX=1):EBX son válidos. Si este bit no está establecido, entonces el paquete de CPU contiene solo 1 procesador lógico.

    En la documentación anterior, este bit a menudo aparece como un indicador de " tecnología Hyper-Threading " [47] ; sin embargo, si bien este indicador es un requisito previo para la compatibilidad con Hyper-Threading, no indica por sí solo compatibilidad con Hyper-Threading y tiene Se ha configurado en muchas CPU que no cuentan con ningún tipo de tecnología de subprocesos múltiples. [48]

Los campos reservados deben enmascararse antes de utilizarlos con fines de identificación del procesador.

EAX=2: información de caché y descriptor TLB

Esto devuelve una lista de descriptores que indican capacidades de caché y TLB en los registros EAX, EBX, ECX y EDX.

En los procesadores que admiten esta hoja, llamar CPUIDcon EAX=2 hará que el byte inferior de EAX se establezca en 01hy los 15 bytes restantes de EAX/EBX/ECX/EDX se llenen con 15 descriptores, un byte cada uno. Estos descriptores proporcionan información sobre las cachés, los TLB y la captación previa del procesador. Por lo general, se trata de un caché o TLB por descriptor, pero algunos valores de descriptor también proporcionan otra información; en particular, 00hse usa para un descriptor vacío, FFhindica que la hoja no contiene información de caché válida y que se debe usar la hoja 4h en su lugar. e FEhindica que la hoja no contiene información TLB válida y que en su lugar se debe utilizar la hoja 18h. Los descriptores pueden aparecer en cualquier orden.

Para cada uno de los cuatro registros (EAX,EBX,ECX,EDX), si se establece el bit 31, no se debe considerar que el registro contiene descriptores válidos (por ejemplo, en Itanium en modo IA-32, CPUID(EAX=2) devuelve 80000000hen EDX: esto debe interpretarse en el sentido de que EDX no contiene información válida, no que contiene un caché L2 de 512 K).

La siguiente tabla proporciona, para valores de descriptor conocidos, una descripción condensada de la caché o TLB indicada por ese valor de descriptor (u otra información, cuando corresponda). Los sufijos utilizados en la tabla son:

  1. ^ abcdefghi Los descriptores 10h, 15h, 1Ah, 88h, 89h, 8Ah, 90h, están documentados solo para el modo de operación IA-32 96hde Itanium . [52]9Bh
  2. ^ Los valores del descriptor abcd , y no figuran en la documentación de Intel y no se utilizan en ninguna CPU conocida, pero se ha informado que son reconocidos por el kernel de Windows NT v5.1 ( Windows XP ) y superior. También es reconocido por v5.0 ( Windows 2000 ). [59]26h27h28h81h81h
  3. ^ Los descriptores abcdefg se enumeran en la revisión 36 de Intel AP-485, [53] pero se han eliminado de la documentación posterior de Intel a pesar de que algunos de ellos se han utilizado en CPU Intel (por ejemplo, en procesadores Celeron basados ​​en "Willamette-128" [ 54] ).39h-3Eh73h39h
  4. ^ El descriptor 49hindica un caché de nivel 3 en GenuineIntellas CPU de la familia 0Fh Modelo 6 (Xeon basado en Pentium 4) y un caché de nivel 2 en otras CPU.
  5. ^ La documentación CPUID de Intel no especifica la asociatividad de ITLB indicada por el descriptor 4Fh. Los procesadores que utilizan este descriptor (Intel Atom "Bonnell" [55] ) figuran en otros lugares con una ITLB de 32 entradas totalmente asociativa. [56]
  6. ^ ab En las CPU Cyrix y Geode (ID de proveedor CyrixInsteady Geode by NSC), los descriptores 70htienen 80hun significado diferente: [57]
    • El descriptor 70hindica un TLB asociativo de conjunto de 4 vías de datos e instrucciones compartidas de 32 entradas con un tamaño de página de 4K.
    • El descriptor 80hindica una caché L1 de datos e instrucciones compartidas de 16 KB con asociatividad de conjuntos de 4 vías y un tamaño de línea de caché de 16 bytes.
  7. ^ El descriptor 76haparece como un caché L2 de 1 MByte en la revisión 37 de Intel AP-485, [58] pero como una instrucción TLB en la revisión 38 y toda la documentación posterior de Intel.
  8. ^ Los descriptores 77habc 7Ehestán 8Dhdocumentados solo para el modo de operación IA-32 de Itanium 2 . [60]
  9. ^ En el modo de operación IA-32 de Itanium 2, el tamaño de la caché L3 siempre se informa como 3 megabytes, independientemente del tamaño real de la caché. [61]
  10. ^ Para el descriptor B1h, la capacidad de TLB es de 8 elementos cuando se usan páginas de 2 MBytes, pero se reduce a 4 elementos cuando se usan páginas de 4 MBytes.

EAX=3: Número de serie del procesador

Esto devuelve el número de serie del procesador. El número de serie del procesador se introdujo en Intel Pentium III , pero debido a cuestiones de privacidad, esta característica ya no se implementa en modelos posteriores (el bit de característica de PSN siempre está borrado). Los procesadores Efficeon y Crusoe de Transmeta también ofrecen esta característica. Sin embargo, las CPU AMD no implementan esta característica en ningún modelo de CPU.

Para las CPU Intel Pentium III, el número de serie se devuelve en los registros EDX:ECX. Para las CPU Transmeta Efficeon, se devuelve en los registros EBX:EAX. Y para las CPU Transmeta Crusoe, se devuelve únicamente en el registro EBX.

Tenga en cuenta que la función del número de serie del procesador debe estar habilitada en la configuración del BIOS para poder funcionar.

EAX=4 y EAX=Bh: subproceso/núcleo Intel y topología de caché

Estas dos hojas se utilizan para la topología del procesador (subproceso, núcleo, paquete) y la enumeración de la jerarquía de caché en los procesadores Intel multinúcleo (e hiperproceso). [64] A partir de 2013, AMD no utiliza estas hojas, pero tiene formas alternativas de realizar la enumeración central. [sesenta y cinco]

A diferencia de la mayoría de las otras hojas de CPUID, la hoja Bh devolverá diferentes valores en EDX dependiendo del procesador lógico que ejecute la instrucción CPUID; el valor devuelto en EDX es en realidad la identificación x2APIC del procesador lógico. Sin embargo, el espacio de identificación x2APIC no se asigna continuamente a procesadores lógicos; Puede haber lagunas en el mapeo, lo que significa que algunos identificadores x2APIC intermedios no necesariamente corresponden a ningún procesador lógico. En los otros registros se proporciona información adicional para asignar los identificadores de x2APIC a los núcleos. Aunque la hoja Bh tiene subhojas (seleccionadas por ECX como se describe más adelante), el valor devuelto en EDX solo se ve afectado por el procesador lógico en el que se ejecuta la instrucción, pero no por la subrehoja.

La topología de procesador(es) expuesta por la hoja Bh es jerárquica, pero con la extraña advertencia de que el orden de los niveles (lógicos) en esta jerarquía no corresponde necesariamente al orden en la jerarquía física ( SMT /núcleo/paquete) . Sin embargo, cada nivel lógico se puede consultar como una subhoja ECX (de la hoja Bh) para determinar su correspondencia con un "tipo de nivel", que puede ser SMT, núcleo o "no válido". El espacio de identificación de nivel comienza en 0 y es continuo, lo que significa que si una identificación de nivel no es válida, todas las identificaciones de niveles superiores también lo serán. El tipo de nivel se devuelve en los bits 15:08 de ECX, mientras que el número de procesadores lógicos en el nivel consultado se devuelve en EBX. Finalmente, la conexión entre estos niveles y los identificadores x2APIC se devuelve en EAX[4:0] como el número de bits que el identificador x2APIC debe desplazarse para obtener un identificador único en el siguiente nivel.

Como ejemplo, un procesador Westmere de doble núcleo capaz de hyperthreading (por lo tanto, con dos núcleos y cuatro subprocesos en total) podría tener los identificadores x2APIC 0, 1, 4 y 5 para sus cuatro procesadores lógicos. Hoja Bh (=EAX), subhoja 0 (=ECX) de CPUID podría, por ejemplo, devolver 100h en ECX, lo que significa que el nivel 0 describe la capa SMT (hyperthreading) y devolver 2 en EBX porque hay dos procesadores lógicos (unidades SMT) por núcleo físico. El valor devuelto en EAX para esta subhoja 0 debe ser 1 en este caso, porque desplazar los identificadores x2APIC antes mencionados hacia la derecha un bit proporciona un número central único (en el siguiente nivel de la jerarquía de identificadores de nivel) y borra el identificador de SMT. poco dentro de cada núcleo. Una forma más sencilla de interpretar esta información es que el último bit (número de bit 0) de la identificación x2APIC identifica la unidad SMT/hyperthreading dentro de cada núcleo en nuestro ejemplo. Avanzar a la subleaf 1 (haciendo otra llamada a CPUID con EAX=Bh y ECX=1) podría, por ejemplo, devolver 201h en ECX, lo que significa que este es un nivel de tipo de núcleo, y 4 en EBX porque hay 4 procesadores lógicos en el paquete; EAX devuelto podría ser cualquier valor mayor que 3, porque sucede que el bit número 2 se usa para identificar el núcleo en la identificación x2APIC. Tenga en cuenta que el bit número 1 de la identificación x2APIC no se utiliza en este ejemplo. Sin embargo, EAX devuelto en este nivel bien podría ser 4 (y sucede que es así en un Clarkdale Core i3 5x0) porque eso también proporciona una identificación única en el nivel del paquete (=0 obviamente) al cambiar la identificación de x2APIC en 4 bits. Finalmente, quizás se pregunte qué nos puede decir la hoja EAX=4 que no hayamos descubierto ya. En EAX[31:26] devuelve los bits de máscara APIC reservados para un paquete; eso sería 111b en nuestro ejemplo porque los bits 0 a 2 se usan para identificar procesadores lógicos dentro de este paquete, pero el bit 1 también está reservado aunque no se usa como parte del esquema de identificación del procesador lógico. En otras palabras, los ID de APIC del 0 al 7 están reservados para el paquete, aunque la mitad de estos valores no se asignan a un procesador lógico.

La jerarquía de caché del procesador se explora observando las subhojas de la hoja 4. Los identificadores de APIC también se utilizan en esta jerarquía para transmitir información sobre cómo las unidades y núcleos SMT comparten los diferentes niveles de caché. Para continuar con nuestro ejemplo, la caché L2, que es compartida por unidades SMT del mismo núcleo pero no entre núcleos físicos en Westmere, se indica estableciendo EAX[26:14] en 1, mientras que la información de que la caché L3 se comparte por todo el paquete se indica estableciendo esos bits en (al menos) 111b. Los detalles de la caché, incluido el tipo, el tamaño y la asociatividad de la caché, se comunican a través de los otros registros en la hoja 4.

Tenga en cuenta que las versiones anteriores de la nota de aplicación Intel 485 contienen información engañosa, particularmente con respecto a la identificación y el recuento de núcleos en un procesador multinúcleo; [66] incluso se han incorporado errores por malinterpretar esta información en el código de muestra de Microsoft para usar CPUID, incluso para la edición 2013 de Visual Studio, [67] y también en la página sandpile.org para CPUID, [68] pero Intel El ejemplo de código para identificar la topología del procesador [64] tiene la interpretación correcta y el Manual del desarrollador de software Intel actual tiene un lenguaje más claro. El código de producción multiplataforma (código abierto) [69] de Wildfire Games también implementa la interpretación correcta de la documentación de Intel.

En una presentación de Intel de 2010 se ofrecen ejemplos de detección de topología que involucran procesadores Intel más antiguos (anteriores a 2010) que carecen de x2APIC (por lo tanto, no implementan la hoja EAX=Bh). [70] Tenga en cuenta que el uso de ese método de detección anterior en procesadores Intel 2010 y más nuevos puede sobreestimar la cantidad de núcleos y procesadores lógicos porque el método de detección anterior supone que no hay espacios en el espacio de identificación APIC, y algunos procesadores más nuevos violan esta suposición. (comenzando con la serie Core i3 5x0), pero estos procesadores más nuevos también vienen con un x2APIC, por lo que su topología se puede determinar correctamente utilizando el método de hoja EAX=Bh.

EAX=6: Gestión térmica y energética

Esto devuelve bits de característica en el registro EAX e información adicional en los registros EBX, ECX y EDX.

  1. ^ Solo en los procesadores de la familia Intel Pentium 4, el bit 2 de EAX se usa para indicar OPP (Protección del punto de operación) [71] en lugar de ARAT.
  2. ^ Para habilitar el modo de acceso rápido (sin serialización) para el IA32_HWP_REQUESTMSR en las CPU que lo admiten, es necesario configurar el bit 0 del FAST_UNCORE_MSRS_CTL( 657h) MSR.
  1. ^ El bit "Capacidad ACNT2" aparece en Intel AP-485 rev 038 [73] y 039, pero no aparece en ninguna revisión de Intel SDM. Se sabe que la característica existe sólo en unas pocas CPU Intel, por ejemplo, Xeon "Harpertown" paso a paso E0. [74]

EAX=7, ECX=0: Funciones extendidas

Esto devuelve indicadores de funciones extendidas en EBX, ECX y EDX. Devuelve el valor ECX máximo para EAX=7 en EAX.

EAX=7, ECX=1: Funciones extendidas

Esto devuelve indicadores de funciones extendidas en los cuatro registros.

EAX=7, ECX=2: Funciones extendidas

Esto devuelve indicadores de funciones extendidas en EDX.

EAX, EBX y ECX están reservados.

EAX=0Dh: características y componentes de estado de XSAVE

Esta hoja se utiliza para enumerar características y componentes de estado de XSAVE.

La extensión del conjunto de instrucciones XSAVE está diseñada para guardar/restaurar el estado extendido de la CPU (generalmente con el fin de cambiar de contexto ) de una manera que se puede extender para cubrir nuevas extensiones del conjunto de instrucciones sin que el código de cambio de contexto del sistema operativo necesite comprender los detalles del nuevas extensiones. Esto se hace definiendo una serie de componentes de estado , cada uno con un tamaño y desplazamiento dentro de un área de guardado determinada, y cada uno correspondiente a un subconjunto del estado necesario para una extensión de CPU u otra. La EAX=0Dhhoja CPUID se utiliza para proporcionar información sobre qué componentes de estado admite la CPU y cuáles son sus tamaños/compensaciones, de modo que el sistema operativo pueda reservar la cantidad adecuada de espacio y configurar los bits de habilitación asociados.

Los componentes de estado se pueden subdividir en dos grupos: estado de usuario (elementos de estado que son visibles para la aplicación, por ejemplo, registros vectoriales AVX-512 ) y estado de supervisor (elementos de estado que afectan a la aplicación pero que no son directamente del usuario). visible, por ejemplo, configuración de interrupción en modo usuario). Los elementos de estado de usuario se habilitan configurando sus bits asociados en el XCR0registro de control, mientras que los elementos de estado de supervisor se habilitan configurando sus bits asociados en IA32_XSS( 0DA0h) MSR; los elementos de estado indicados se convierten en los componentes de estado que se pueden guardar. y restaurado con la XSAVEfamilia XRSTORde instrucciones.

El mecanismo XSAVE puede manejar hasta 63 componentes de estado de esta manera. Los componentes de estado 0 y 1 ( x87 y SSE , respectivamente) tienen compensaciones y tamaños fijos; para los componentes de estado 2 a 62, sus tamaños, compensaciones y algunas banderas adicionales se pueden consultar ejecutando CPUIDcon EAX=0Dhy ECXestableciendo el índice del estado. -componente. Esto devolverá los siguientes elementos en EAX, EBX y ECX (con EDX reservado):

Intentar consultar un componente de estado no compatible de esta manera da como resultado que EAX, EBX, ECX y EDX se establezcan en 0.

Las subhojas 0 y 1 de CPUIDla hoja 0Dhse utilizan para proporcionar información sobre las características:

En julio de 2023, los componentes estatales de XSAVE que se han definido arquitectónicamente son:

  1. ^ El bit 0 de XCR0está cableado a 1, de modo que las instrucciones XSAVE siempre admitirán guardar/restaurar el estado x87.
  2. ^ Para los registros XCR0y IA32_XSS, el bit 63 está reservado específicamente para la expansión del vector de bits; esto excluye la existencia de un componente de estado 63.

EAX=12h: capacidades SGX

Esta hoja proporciona información sobre las capacidades admitidas de la función Intel Software Guard Extensions (SGX). La hoja proporciona múltiples subhojas, seleccionadas con ECX.

La subhoja 0 proporciona información sobre las funciones de hoja SGX admitidas en EAX y los tamaños máximos de enclave SGX admitidos en EDX; ECX está reservado. EBX proporciona un mapa de bits de bits que se pueden configurar en el campo MISCSELECT en SECS (Estructura de control de enclave SGX). Este campo se utiliza para controlar la información escrita en la región MISC de SSA (Área de estado de guardado SGX) cuando un AEX (SGX Se produce una salida asincrónica del enclave).

La subhoja 1 proporciona un mapa de bits de qué bits se pueden configurar en el campo ATRIBUTOS de 128 bits de SECS en EDX:ECX:EBX:EAX (esto se aplica a la copia SECS utilizada como entrada para la ENCLS[ECREATE]función de hoja). Los 64 bits superiores (proporcionados en EDX:ECX) son un mapa de bits de los cuales se pueden configurar los bits en XFRM (máscara de solicitud de función X); esta máscara es una máscara de bits de los cuales se guardarán los componentes de estado de la CPU (consulte la hoja 0Dh). a la SSA en caso de un AEX; Tiene el mismo diseño que el XCR0registro de control. Los demás bits se proporcionan en EAX y EBX, de la siguiente manera:

  1. ^ Para la copia del SECS que existe dentro de un enclave, el bit 0 (INIT) de SECS.ATTRIBUTES se utiliza para indicar que el enclave se ha inicializado con ENCLS[EINIT]. Este bit debe ser 0 en la copia SECS que se proporciona como entrada a ENCLS[CREATE].

Las subhojas 2 y superiores se utilizan para proporcionar información sobre qué regiones de memoria física están disponibles para su uso como secciones EPC (Enclave Page Cache) en SGX.

EAX=14h, ECX=0: Seguimiento del procesador

Esta subhoja proporciona información sobre las funciones de Intel Processor Trace (también conocido como seguimiento de instrucciones en tiempo real).

El valor devuelto en EAX es el índice de la subhoja más alta admitida para CPUID con EAX=14h. EBX y ECX proporcionan indicadores de funciones, EDX está reservado.

EAX=19h: Funciones del casillero de claves AES

Esta hoja proporciona información sobre las funciones de AES Key Locker en EAX, EBX y ECX. EDX está reservado.

EAX=24h, ECX=0: Funciones AVX10

Esto devuelve una subhoja máxima admitida en EAX y información de funciones AVX10 en EBX. [82] (ECX y EDX están reservados).

EAX=80000000h: Obtener la función extendida más alta implementada

El parámetro de llamada más alto se devuelve en EAX.

EBX/ECX/EDX devuelve la cadena de ID del fabricante (igual que EAX=0) en las CPU AMD pero no en las CPU Intel.

EAX=80000001h: información extendida del procesador y bits de funciones

Esto devuelve indicadores de funciones extendidas en EDX y ECX.

Muchos de los bits EDX(bits 0 a 9, 12 a 17, 23 y 24) son duplicados de EDXla EAX=1hoja; estos bits están resaltados en amarillo claro. (Estos bits duplicados están presentes en las CPU AMD pero no en las CPU Intel).

Los indicadores de características de AMD son los siguientes: [86] [87]

  1. ^ El uso de EDX bit 10 para indicar compatibilidad con SYSCALL/ SYSRETsolo es válido en CPU AuthenticAMD de la familia 5 modelo 7 ( AMD K6 , 250 nm "Little Foot"); para todos los demás procesadores, se debe usar EDX bit 11 en su lugar.

    Estas instrucciones se introdujeron por primera vez en el Modelo 7 [88] ; el bit CPUID para indicar su compatibilidad se movió [89] al bit 11 de EDX desde el Modelo 8 ( AMD K6-2 ) en adelante.

  2. ^ En las CPU Intel, el bit CPUID para SYSCALL/ SYSRETsolo se establece si la CPUIDinstrucción se ejecuta en modo de 64 bits. [90]
  3. ^ ab En algunos procesadores: Cyrix MediaGXm , [92] varios Geodes (NatSemi Geode GXm, GXLV, GX1; AMD Geode GX1 [93] ) y Transmeta Crusoe [94] - Los bits 16 y 24 de EDX tienen un significado diferente:
  4. ^ El bit EDX 19 se utiliza para la identificación de la marca de la CPU en procesadores AuthenticAMD de la familia 6 únicamente; el bit, combinado con la firma del procesador y la velocidad del FSB , se utiliza para identificar procesadores como compatibles con multiprocesador o con la marca Sempron . [95]
  5. ^ ECX bit 25 aparece como StreamPerfMon solo en la revisión 3.20 de AMD APM [97] ; aparece como reservado en revisiones posteriores. La broca está configurada únicamente en las CPU Excavator y Steamroller.

EAX=80000002h,80000003h,80000004h: Cadena de marca del procesador

Estos devuelven la cadena de marca del procesador en EAX, EBX, ECX y EDX. CPUIDdebe emitirse con cada parámetro en secuencia para obtener la cadena completa de marca del procesador ASCII de 48 bytes. [98] Es necesario verificar si la característica está presente en la CPU emitiendo CPUIDprimero EAX = 80000000hy verificando si el valor devuelto no es menor que 80000004h.

En la documentación de Intel/AMD se especifica que la cadena tiene terminación nula , sin embargo, este no es siempre el caso (por ejemplo, se sabe que DM&P Vortex86DX3 y AMD Ryzen 7 6800HS devuelven cadenas de marca no terminadas en nulo en hojas 80000002h- 80000004h[99] [100 ] ), y el software no debería depender de él.

#incluye <stdio.h> #incluye <cadena.h> #incluye <cpuid.h>   int principal () { regs int sin firmar [ 12 ]; char str [ tamaño de ( regs ) + 1 ];       __cpuid ( 0x80000000 , registros [ 0 ], registros [ 1 ], registros [ 2 ], registros [ 3 ]);     si ( regs [ 0 ] < 0x80000004 ) devuelve 1 ;      __cpuid ( 0x80000002 , registros [ 0 ], registros [ 1 ], registros [ 2 ], registros [ 3 ]); __cpuid ( 0x80000003 , registros [ 4 ], registros [ 5 ], registros [ 6 ], registros [ 7 ]); __cpuid ( 0x80000004 , registros [ 8 ], registros [ 9 ], registros [ 10 ], registros [ 11 ]);               memcpy ( cadena , regs , tamaño de ( regs )); str [ tamaño de ( regs )] = '\0' ; printf ( "%s \n " , cadena );        devolver 0 ; } 

EAX=80000005h: caché L1 e identificadores TLB

Esta función contiene la caché L1 del procesador y las características TLB.

EAX=80000006h: Funciones de caché L2 extendidas

Devuelve detalles de la caché L2 en ECX, incluido el tamaño de línea en bytes (Bits 07 - 00), el tipo de asociatividad (codificada por un campo de 4 bits; Bits 15 - 12) y el tamaño de la caché en KB (Bits 31 - 16). .

#incluir <stdio.h> #incluir <cpuid.h>  int principal () { int sin signo eax , ebx , ecx , edx ; unsigned int lsize , assoc , caché ;             __cpuid ( 0x80000006 , eax , ebx , ecx , edx ); lsize = ecx & 0xff ; asociación = ( ecx >> 12 ) & 0x07 ; caché = ( ecx >> 16 ) & 0xffff ;                         printf ( "Tamaño de línea: %d B, tipo de asociación: %d, tamaño de caché: %d KB. \n " , lsize , asociación , caché );    devolver 0 ; } 

EAX=80000007h: Información de administración de energía del procesador y capacidades RAS

Esta función proporciona información sobre administración de energía, informes de energía y capacidades RAS ( confiabilidad, disponibilidad y capacidad de servicio ) de la CPU.

EAX=80000008h: Tamaños de direcciones virtuales y físicas

  1. ^ La función LMSLE (Habilitación de límite de segmento de modo largo) no tiene su propio indicador CPUID y se detecta verificando la familia y el modelo de CPU. Se introdujo en las CPU AuthenticAMDde la familia 0Fh Modelo 14h [104] (90 nm Athlon64/Opteron) y está presente en todas las CPU AMD posteriores, excepto aquellas con el indicador 'no_efer_lmsle' configurado.
  2. ^ Un valor de 0 indica que el "Tamaño de la dirección física del invitado" es el mismo que el "Número de bits de dirección física", especificado en EAX [7:0].

EAX=8000000Ah: Funciones seguras de la máquina virtual

Esta hoja devuelve información sobre las características de AMD SVM ( Secure Virtual Machine ) en EAX, EBX y EDX.

  1. ^ Las primeras revisiones de la documentación "Pacifica" de AMD enumeraban el bit 8 de EAX como un bit siempre cero reservado para uso del hipervisor. [106]

    La documentación posterior de AMD, como la #25481 "Especificación de CPUID" rev 2.18 [107] y posteriores, solo enumera el bit como reservado.

    En la revisión 2.30 [108] y posteriores, aparece un bit diferente como reservado para uso del hipervisor: CPUID.(EAX=1):ECX[bit 31].

  2. ^ EDX bit 9 aparece brevemente en algunas revisiones anteriores del documento n.º 25481 "Especificación de CPUID" de AMD y está configurado solo en algunas CPU AMD Bobcat . [109]

    La revisión 2.28 de #25481 enumera el bit como "Ssse3Sse5Dis" [110] ; en la revisión 2.34, aparece como eliminado de la especificación en la revisión 2.32 con el nombre "SseIsa10Compat". [111]

EAX=8000001Fh: Capacidades de memoria cifrada

EAX=80000021h: Identificación de característica extendida 2

EAX=8FFFFFFFFh: Huevo de Pascua de AMD

Varios modelos de CPU AMD, para CPUID con EAX=8FFFFFFFh, devolverán una cadena de huevos de Pascua en EAX, EBX, ECX y EDX. [115] [116] Las cadenas de huevos de Pascua conocidas incluyen:

EAX=C0000000h: Obtener la función extendida Centaur más alta

Devuelve el índice de la hoja de Centauro más alta en EAX. Si el valor devuelto en EAX es menor que C0000001h, entonces no se admiten las hojas extendidas de Centaur.

Presente en CPU de VIA y Zhaoxin .

En las CPU IDT WinChip ( CentaurHaulsfamilia 5), ​​las hojas extendidas C0000001h-C0000005hno codifican ninguna funcionalidad específica de Centaur, sino que son alias de hojas 80000001h-80000005h. [118]

EAX=C0000001h: Información de la característica Centauro

Esta hoja devuelve información de la función Centaur (principalmente VIA PadLock ) en EDX. [119] [120] (EAX, EBX y ECX están reservados).

  1. ^ abcd En las CPU VIA Nehemiah y Antaur ( CentaurHaulssolo Familia 6 Modelo 9), [121] bits 0,1,4,5 se usan de manera diferente:

Uso de CPUID desde lenguajes de alto nivel

Montaje en línea

También es fácil acceder a esta información desde otros idiomas. Por ejemplo, el código C para gcc a continuación imprime los primeros cinco valores, devueltos por el cpuid:

#incluir <stdio.h> #incluir <cpuid.h>  int main () { int sin signo i , eax , ebx , ecx , edx ;         for ( i = 0 ; i < 5 ; i ++ ) { __cpuid ( i , eax , ebx , ecx , edx ); printf ( "InfoType %x \n EAX: %x \n EBX: %x \n ECX: %x \n EDX: %x \n " , i , eax , ebx , ecx , edx ); }                      devolver 0 ; } 

En el ensamblado en línea con sabor de los compiladores MSVC y Borland/Embarcadero C (bcc32), la información de destrucción está implícita en las instrucciones:

#incluir <stdio.h> int principal () { int sin signo a , b , c , d , i = 0 ;           __asm ​​{ /* Haz la llamada. */ mov EAX , i ; CPUID ; /* Guardar resultados. */ mov a , EAX ; mov b , EBX ; mov c , ECX ; mov d , EDX ; }                     printf ( "InfoType %x \n EAX: %x \n EBX: %x \n ECX: %x \n EDX: %x \n " , i , a , b , c , d ); devolver 0 ; }        

Si alguna de las versiones se escribió en lenguaje ensamblador simple, el programador debe guardar manualmente los resultados de EAX, EBX, ECX y EDX en otro lugar si desea seguir usando los valores.

Funciones contenedoras

GCC también proporciona un encabezado llamado <cpuid.h>en sistemas que tienen CPUID. Es __cpuiduna macro que se expande al ensamblaje en línea. El uso típico sería:

#incluir <stdio.h> #incluir <cpuid.h>  int principal () { int sin signo eax , ebx , ecx , edx ;        __cpuid ( 0 /* cadena de proveedor */ , eax , ebx , ecx , edx ); printf ( "EAX: %x \n EBX: %x \n ECX: %x \n EDX: %x \n " , eax , ebx , ecx , edx );           devolver 0 ; } 

Pero si uno solicitara una función extendida que no está presente en esta CPU, no se daría cuenta y podría obtener resultados aleatorios e inesperados. También se proporciona una versión más segura en formato <cpuid.h>. Comprueba si hay funciones ampliadas y realiza algunas comprobaciones de seguridad más. Los valores de salida no se pasan utilizando parámetros macro similares a referencias, sino punteros más convencionales.

#incluir <stdio.h> #incluir <cpuid.h>  int principal () { int sin signo eax , ebx , ecx , edx ;        /* 0x81234567 no existe, pero se supone que existe */ if ( ! __get_cpuid ( 0x81234567 , & eax , & ebx , & ecx , & edx )) { printf ( "Advertencia: ¡La solicitud de CPUID 0x81234567 no es válida! \n " ); devolver 1 ; }             printf ( "EAX: %x \n EBX: %x \n ECX: %x \n EDX: %x \n " , eax , ebx , ecx , edx );     devolver 0 ; } 

Observe los símbolos &a, &b, &c, &dy la declaración condicional. Si la __get_cpuidllamada recibe una solicitud correcta, devolverá un valor distinto de cero; si falla, cero. [122]

El compilador de Microsoft Visual C tiene una función incorporada __cpuid(), por lo que la instrucción cpuid se puede incrustar sin utilizar el ensamblaje en línea, lo cual es útil ya que la versión x86-64 de MSVC no permite el ensamblaje en línea en absoluto. El mismo programa para MSVC sería:

#incluye <stdio.h> #ifdef __MSVC__ #incluye <intrin.h> #endif   int principal () { regs int sin firmar [ 4 ]; int yo ;       for ( i = 0 ; i < 4 ; i ++ ) { __cpuid ( regs , i ); printf ( "El código %d da %d, %d, %d, %d" , regs [ 0 ], regs [ 1 ], regs [ 2 ], regs [ 3 ]); }                 devolver 0 ; } 

Muchos lenguajes de programación interpretados o compilados son capaces de utilizar CPUID a través de una biblioteca FFI . Una de esas implementaciones muestra el uso del módulo Ruby FFI para ejecutar lenguaje ensamblador que incluye el código de operación CPUID.

.NET 5 y versiones posteriores proporcionan el System.Runtime.Intrinsics.X86.X86base.CpuIdmétodo. Por ejemplo, el siguiente código C# imprime la marca del procesador si admite la instrucción CPUID:

usando System.Runtime.InteropServices ; usando System.Runtime.Intrinsics.X86 ; usando System.Text ;   espacio de nombres X86CPUID { clase CPUBrandString { público estático vacío Principal ( cadena [] args ) { if ( ! X86Base . IsSupported ) { Consola . WriteLine ( "Su CPU no admite instrucciones CPUID." ); } else { Span < int > raw = stackalloc int [ 12 ]; ( sin formato [ 0 ], sin formato [ 1 ], sin formato [ 2 ], sin formato [ 3 ]) = X86Base . CpuId ( sin marcar (( int ) 0 x80000002 ), 0 ); ( sin formato [ 4 ], sin formato [ 5 ], sin formato [ 6 ], sin formato [ 7 ]) = X86Base . CpuId ( sin marcar (( int ) 0 x80000003 ), 0 ); ( sin formato [ 8 ], sin formato [ 9 ], sin formato [ 10 ], sin formato [ 11 ]) = X86Base . CpuId ( sin marcar (( int ) 0 x80000004 ), 0 );                                             Span < byte > bytes = MemoryMarshal . AsBytes ( sin formato ); marca de cadena = Codificación . UTF8 . GetString ( bytes ). Recortar (); Consola . WriteLine ( marca ); } } } }           

Información específica de la CPU fuera de x86

Algunas de las arquitecturas de CPU que no son x86 también proporcionan ciertas formas de información estructurada sobre las capacidades del procesador, comúnmente como un conjunto de registros especiales:

Las familias de chips tipo DSP y transputadores no han adoptado la instrucción de manera notable, a pesar de tener (en términos relativos) tantas variaciones en el diseño. Podrían existir formas alternativas de identificación del silicio; por ejemplo, los DSP de Texas Instruments contienen un conjunto de registros basado en memoria para cada unidad funcional que comienza con identificadores que determinan el tipo y modelo de la unidad, su revisión de diseño ASIC y las características seleccionadas en la fase de diseño, y continúa con el control y los datos específicos de la unidad. registros. El acceso a estas áreas se realiza simplemente utilizando las instrucciones de carga y almacenamiento existentes; por lo tanto, para tales dispositivos, no hay necesidad de ampliar el conjunto de registros para fines de identificación del dispositivo. [ cita necesaria ]

Ver también

Referencias

  1. ^ "Manual del desarrollador de software de arquitecturas Intel 64 e IA-32" (PDF) . Intel.com . Consultado el 11 de abril de 2013 .
  2. ^ "Detección de procesadores Intel: conocimiento de la generación de la CPU del sistema". Rcollins.org . Consultado el 11 de abril de 2013 .
  3. ^ "LXR linux-old/arch/i386/kernel/head.S". Lxr.linux.no. Archivado desde el original el 13 de julio de 2012 . Consultado el 11 de abril de 2013 .
  4. ^ "CPUID, EAX = 4 - Resultados extraños (resuelto)". Software.intel.com . Consultado el 10 de julio de 2014 .
  5. ^ @InstLatX64 (28 de febrero de 2019). "Primer encuentro con" GenuineIotel "(o después de I, en lugar de n)" (Tweet) - vía Twitter .
  6. ^ instlatx64, volcado de CPUID para RDC IAD 100. Consultado el 22 de diciembre de 2022.
  7. ^ abcd smxi, número 197 de Inxi: implementación y datos de soporte de CPU de Elbrus. Consultado el 23 de octubre de 2023. Archivado el 23 de octubre de 2023.
  8. ^ sorgelig (3 de agosto de 2017). "Instrucción ao486 CPUID (en la confirmación 43a2004)". GitHub . Archivado desde el original el 4 de diciembre de 2023 . Consultado el 4 de diciembre de 2023 .
  9. ^ ab sorgelig (30 de agosto de 2020). "Actualizar CPU. · MiSTer-devel/ao486_MiSTer@82f5014". GitHub . Archivado desde el original el 4 de diciembre de 2023 . Consultado el 4 de diciembre de 2023 .
  10. ^ sorgelig (30 de agosto de 2020). "Instrucción CPUID ao486". GitHub . Archivado desde el original el 23 de octubre de 2023 . Consultado el 4 de diciembre de 2023 .
  11. ^ "v586: núcleo blando compatible con 586 para FPGA". GitHub . 6 de diciembre de 2021.
  12. ^ "Encuesta sobre hardware y software de Steam". tienda.steampowered.com . Consultado el 26 de julio de 2022 .
  13. ^ "Diversión con temporizadores y CPU - por Jim Cownie - Diversión con la CPU". 3 de marzo de 2021.
  14. ^ iXBT Labs, VIA Nano CPUID Tricks, 26 de agosto de 2010. Archivado el 29 de agosto de 2010.
  15. ^ IDT, hoja de datos de WinChip 2A, v1.0, enero de 1999, página A-3.
  16. ^ VIA, Hoja de datos C3 Nehemiah, rev 1.13, 29 de septiembre de 2004, página A-3.
  17. ^ Agner Fog, CpuIDFake, v1.00, 22 de enero de 2010, consulte "Instructions.txt". Archivado el 9 de julio de 2010.
  18. ^ Transmeta, Guía del programador de Crusoe BIOS, 23 de enero de 2004, página 65.
  19. ^ AMD, libro de datos de Geode LX, pub.id. 33234H, febrero de 2009, página 107. Archivado el 3 de diciembre de 2023.
  20. ^ DM&P, Vortex86EX2_A9133_Master_Data_Sheet_V11_BF, 8 de mayo de 2019, página 72.
  21. ^ "Referencia del conjunto de instrucciones del Capítulo 3, AL" (PDF) . Manual del desarrollador de software de arquitecturas Intel 64 e IA-32 . Corporación Intel. 2018-12-20 . Consultado el 20 de diciembre de 2018 .
  22. ^ Intel, Manual del desarrollador de la familia de procesadores Pentium, 1997, n.º de pedido. 241428-005, las secciones 3.4.1.2 (página 91), 17.5.1 (página 489) y el apéndice A (página 522) proporcionan más detalles sobre cómo funcionan el campo "tipo de procesador" y la designación de "procesador dual".
  23. ^ InstLatx64, x86, x64 Latencia de instrucciones, latencia de memoria y volcados de CPUID, 30 de septiembre de 2023.
  24. ^ AMD, familia de microprocesadores Am486DX mejorada, pub.no. 20736 rev B, marzo de 1997, sección 9.2.2, página 55. Archivado el 18 de octubre de 2023.
  25. ^ Manual del usuario de los microcontroladores AMD, ÉlanSC400 y ÉlanSC410, pub.no. 21030, 1997, apartado 3.6.2, página 73. Archivado el 18 de octubre de 2023.
  26. ^ Cyrix, Guía de escritura de BIOS 5x86, rev 1.12, n.º de pedido. 92426-00, 1995, página 7
  27. ^ ab Cyrix, Guía de detección de CPU, rev 1.01, 2 de octubre de 1997, página 6.
  28. ^ ab Debbie Wiles, Identificación de CPU, archivado el 4 de junio de 2006
  29. ^ Código fuente de MiSTer ao486, rtl/ao486/defines.v, línea 70. Archivado el 23 de octubre de 2023.
  30. ^ CPU-World, CPUID para Vortex86DX2 933 MHz. Archivado el 17 de octubre de 2023.
  31. ^ CPU-World, CPUID para Vortex86EX2. Archivado el 18 de octubre de 2023.
  32. ^ InstLatx64, volcado de CPUID de Centaur CNS. Archivado el 30 de mayo de 2023.
  33. ^ Jeff Atwood, Nasty Software Hacks y CPUID de Intel. Codificación de terror , 16 de agosto de 2005.
  34. ^ Intel, Manual de referencia de la arquitectura del conjunto de instrucciones del coprocesador Intel Xeon Phi, septiembre de 2012, n.º de pedido. 327364-001, apéndice B.8, página 673. Archivado el 4 de agosto de 2021.
  35. ^ CPU-World, CPUID para Intel Itanium 2 1,50 GHz. Archivado el 17 de octubre de 2023.
  36. ^ http://bochs.sourceforge.net/techspec/24161821.pdf [ URL básica PDF ]
  37. ^ Fuentes del kernel de Linux 6.3, /arch/x86/include/asm/cpuid.h, línea 69
  38. ^ Lista de correo de gcc-patches, parche CPUID para IDT Winchip, 21 de mayo de 2019
  39. ^ Geoff Chappell, Compatibilidad con CMPXCHG8B en el kernel de Windows de 32 bits, 23 de enero de 2008. Archivado el 30 de enero de 2023.
  40. ^ AMD, Nota de aplicación de reconocimiento de procesador AMD, publicación n.º 20734, rev D, enero de 1997, página 13
  41. ^ Intel, nota de aplicación AP-485: identificación del procesador Intel e instrucción CPUID, n.º de pedido. 241618-006, marzo de 1997, tabla 5 en la página 10, ver bit 10.
  42. ^ Michal Necasek, SYSENTER, ¿Dónde estás?, Museo OS/2 , 20 de julio de 2017
  43. ^ Geoff Chappell, ECX de CPUID Leaf 1, 26 de enero de 2020. Archivado el 9 de mayo de 2020.
  44. ^ Huggahalli, Ram; Iyer, Ravi; Tetrick, Scott (2005). "Acceso directo a caché para E/S de red de gran ancho de banda". Noticias de arquitectura informática de ACM SIGARCH . 33 (2): 50–59. CiteSeerX 10.1.1.85.3862 . doi :10.1145/1080695.1069976. CiteSeerX : 10.1.1.91.957 . 
  45. ^ Drepper, Ulrich (2007), Lo que todo programador debe saber sobre la memoria , CiteSeerX : 10.1.1.91.957
  46. ^ ab Intel, Manual del desarrollador de software de arquitectura Itanium, rev 2.3, volumen 4: Conjunto de instrucciones IA-32, mayo de 2010, número de documento: 323208, tabla 2-5, página 4:81, consulte los bits 20 y 30. Archivado el 15 de febrero , 2012.
  47. ^ Intel, AP-485, Identificación del procesador y indicador de instrucción CPUID, rev 30, enero de 2006, página 26
  48. ^ Michal Necasek, HTT significa Hyper-Threading, ¿verdad?, Museo OS/2 , 11 de diciembre de 2017
  49. ^ "Mecanismos para determinar si el software se está ejecutando en una máquina virtual VMware". Base de conocimientos de VMware . VMware . 2015-05-01. Las CPU Intel y AMD han reservado el bit 31 de ECX de la hoja CPUID 0x1 como bit presente del hipervisor. Este bit permite a los hipervisores indicar su presencia al sistema operativo invitado. Los hipervisores configuran este bit y las CPU físicas (todas las CPU existentes y futuras) configuran este bit en cero. Los sistemas operativos invitados pueden probar el bit 31 para detectar si se están ejecutando dentro de una máquina virtual.
  50. ^ Kataria, Alok; Hecht, Dan (1 de octubre de 2008). "Propuesta de interfaz CPUID del hipervisor". Archivo LKML en lore.kernel.org. Archivado desde el original el 15 de marzo de 2019. Bit 31 de ECX de la hoja CPUID 0x1. Este bit ha sido reservado por Intel y AMD para uso de hipervisores e indica la presencia de un hipervisor. Las CPU virtuales (hipervisores) establecen este bit en 1 y las CPU físicas (todas las CPU existentes y futuras) establecen este bit en cero. El software invitado puede sondear este bit para detectar si se están ejecutando dentro de una máquina virtual.
  51. ^ "Manual del programador de arquitectura AMD64 con tecnología AMD64, volumen 2: programación del sistema" (PDF) (3.41 ed.). Microdispositivos avanzados, Inc. pág. 498. 24593. Archivado desde el original (PDF) el 30 de septiembre de 2023 . Consultado el 9 de septiembre de 2023 . 15.2.2 Modo Invitado A este nuevo modo de procesador se ingresa mediante la instrucción VMRUN. Cuando está en modo invitado, el comportamiento de algunas instrucciones x86 cambia para facilitar la virtualización. Los números de función CPUID 4000_0000h-4000_00FFh se han reservado para uso del software. Los hipervisores pueden utilizar estos números de función para proporcionar una interfaz para pasar información del hipervisor al invitado. Esto es similar a extraer información sobre una CPU física mediante CPUID. Los hipervisores utilizan el bit CPUID Fn 400000[FF:00] para indicar una plataforma virtual. El bit de característica CPUID Fn0000_0001_ECX[31] se ha reservado para que lo utilicen los hipervisores para indicar la presencia de un hipervisor. Los hipervisores establecen este bit en 1 y las CPU físicas lo establecen en cero. El software invitado puede probar este bit para detectar si se están ejecutando dentro de una máquina virtual.
  52. ^ Intel, Manual de referencia del procesador Itanium para el desarrollo de software, rev 2.0, n.º de pedido. 245320-003, diciembre de 2001, página 110. Archivado desde el original el 18 de febrero de 2004.
  53. ^ Intel, identificación del procesador y nota de aplicación de instrucciones CPUID 485, n.º de pedido. 241618-036, agosto de 2009, página 26. Archivado el 6 de octubre de 2023.
  54. ^ InstLatX64, volcado de CPUID de Willamette-128. Archivado el 7 de diciembre de 2019.
  55. ^ InstatX64, volcado de CPUID Intel Atom 230. Archivado el 7 de diciembre de 2019.
  56. ^ WikiChip, Bonnell. Archivado el 16 de julio de 2017.
  57. ^ Cyrix, Guía de detección de CPU Cyrix, rev 1.01, 2 de octubre de 1997, página 13.
  58. ^ Intel, identificación del procesador y nota de aplicación de instrucciones CPUID 485, n.º de pedido. 241618-037, enero de 2011, página 32. Archivado el 17 de octubre de 2023.
  59. ^ Geoff Chappell, CPUID Leaf 2, 26 de enero de 2020. Archivado el 4 de septiembre de 2023.
  60. ^ Intel, Manual de referencia del procesador Itanium 2, n.º de pedido. 251110-003, mayo de 2004, página 192. Archivado desde el original el 7 de diciembre de 2006.
  61. ^ Intel, actualización de la especificación del procesador Itanium 2, número de pedido. 251141-028, noviembre de 2004, errata 6 en la página 26. Archivado desde el original el 25 de noviembre de 2004.
  62. ^ Actualización de la especificación de la familia de productos del procesador Intel, Atom C3000, n.º de pedido. 336345-020, página 16, marzo de 2023. Archivado el 7 de octubre de 2023.
  63. ^ Hoja de datos del procesador Intel, Xeon serie 7500, n.º de pedido. 323341-001, marzo de 2010, página 150. Archivado el 8 de octubre de 2023.
  64. ^ ab Shih Kuo (27 de enero de 2012). "Enumeración de topologías del procesador de arquitectura Intel 64".
  65. ^ "Enumeración de procesadores y núcleos mediante CPUID | AMD". Desarrollador.amd.com. Archivado desde el original el 14 de julio de 2014 . Consultado el 10 de julio de 2014 .
  66. ^ "¿Los procesadores Sandybridge informan un número de núcleo incorrecto?". Software.intel.com. 29 de diciembre de 2012 . Consultado el 10 de julio de 2014 .
  67. ^ "cpuid, __cpuidex". msdn.microsoft.com. 2014-06-20 . Consultado el 10 de julio de 2014 .
  68. ^ "Arquitectura x86: CPUID". sandpile.org . Consultado el 10 de julio de 2014 .
  69. ^ "topology.cpp en ps/trunk/source/lib/sysdep/arch/x86_x64 - Wildfire Games". Trac.wildfiregames.com. 27 de diciembre de 2011. Archivado desde el original el 9 de marzo de 2021 . Consultado el 10 de julio de 2014 .
  70. ^ Tecnología Hyper-Threading y detección de procesadores multinúcleo
  71. ^ Intel, Identificación del procesador Intel e instrucción CPUID (AP-485, rev 30), n.º de pedido. 241618-030, enero de 2006, página 19.
  72. ^ Manual del desarrollador de software de arquitectura Intel, Intel 64 e IA-32, n.º de pedido. 352462-079, tomo 3B, sección 15.4.4.4, folio 3503
  73. ^ Intel, identificación del procesador e instrucción CPUID, n.º de pedido. 241618-038, abril de 2012, p.38
  74. ^ Intel, Notificación de cambio de producto 108701, 1 de agosto de 2008. Archivado el 11 de mayo de 2023
  75. ^ Intel, Desuso de la instrucción PCOMMIT, 12 de septiembre de 2016. Archivado el 23 de abril de 2023.
  76. ^ Intel, Especificación de arquitectura AVX512-FP16 (PDF), número de documento 347407-001, junio de 2021. Archivado el 26 de octubre de 2022
  77. ^ abcd "Mitigaciones del canal lateral de ejecución especulativa" (PDF) . Revisión 2.0. Intel . Mayo de 2018 [enero de 2018]. Número de documento: 336996-002 . Consultado el 26 de mayo de 2018 .
  78. ^ "Serie de parches IBRS [LWN.net]".
  79. ^ abc Intel, Especificación de devolución flexible y entrega de eventos (FRED), rev 6.1, diciembre de 2023, n.º de pedido. 346446-007, página 14. Archivado el 22 de diciembre de 2023.
  80. ^ Intel, Manual del desarrollador de software, n.º de pedido. 325462-080, junio de 2023: información sobre pilas de sombra prematuramente ocupadas proporcionada en el Volumen 1, sección 17.2.3 en la página 410; Volumen 2A, tabla 3.8 (CPUID EAX=7,ECX=2) en la página 820; Tomo 3C, tabla 25-14 a la página 3958 y apartado 26.4.3 a la página 3984.
  81. ^ LKML, Re: (PATCH v3 00/21) Habilitar la virtualización CET, 16 de junio de 2023: proporciona una discusión adicional sobre cómo el problema de la pila CET-SSS prematuramente ocupada interactúa con la virtualización.
  82. ^ ab Intel, Advanced Vector Extensions 10, rev 1.0, julio de 2023, n.º de pedido. 355989-001. Archivado el 24 de julio de 2023.
  83. ^ ab Intel, Extensiones de rendimiento avanzado: especificación de arquitectura, rev 2.0, agosto de 2023, n.º de pedido. 355828-002, página 37. Archivado el 10 de septiembre de 2023.
  84. ^ abc Intel, Inyección de historial de sucursal e inyección de objetivo de sucursal intramodo / CVE-2022-0001, CVE-2022-0002 / INTEL-SA-00598, 4 de agosto de 2022. Archivado el 5 de mayo de 2023.
  85. ^ Intel, Desbordamiento insuficiente del búfer de pila de retorno / CVE-2022-29901, CVE-2022-28693 / INTEL-SA-00702, 12 de julio de 2022. Archivado el 13 de julio de 2022.
  86. ^ Especificación CPUID, publicación n.º 25481, rev 2.34 (PDF) , AMD , septiembre de 2010, archivado desde el original (PDF) el 18 de agosto de 2022
  87. ^ Código fuente del kernel de Linux
  88. ^ AMD, hoja de datos del procesador AMD-K6, n.º de pedido. 20695H/0, marzo de 1998, artículo 24.2, página 283
  89. ^ AMD, Guía de revisión del procesador AMD-K6, n.º de pedido. 21846H/0, junio de 1999, apartado 3.2.1, página 17
  90. ^ Manual del desarrollador de software de arquitecturas Intel, Intel 64 e IA-32, n.º de pedido. 325462-079, marzo de 2023, tabla 3-8 en la página 3-238
  91. ^ Especificación de perfiles ligeros (PDF) , AMD , agosto de 2010, archivado desde el original (PDF) el 27 de noviembre de 2012 , consultado el 3 de abril de 2013
  92. ^ Cyrix, Guía de detección de CPU Cyrix, rev 1.01, 2 de octubre de 1997, página 12
  93. ^ AMD, Libro de datos del procesador Geode GX1, rev 5.0, diciembre de 2003, páginas 202 y 226. Archivado el 20 de abril de 2020.
  94. ^ Transmeta, Reconocimiento de procesador, 2002-05-07, página 5
  95. ^ AMD, nota de aplicación de reconocimiento de procesador, pub.no. 20734, rev. 3.13, diciembre de 2005. La Sección 2.2.2 (p.20) y la Sección 3 (páginas 33 a 40) proporcionan detalles sobre cómo se debe utilizar CPUID.(EAX=8000_0001):EDX[bit 19] para identificar procesadores. Archivado desde el original el 26 de junio de 2006.
  96. ^ AMD, Familia 10h BKDG, documento no. 31116, rev 3.62, 11 de enero de 2013, pág. 388: enumera el bit NodeId. Archivado el 16 de enero de 2019.
  97. ^ AMD, Manual del programador de arquitectura AMD64, volumen 3, pub. No. 24594, rev 3.20, mayo de 2013, página 579: enumera el bit StreamPerfMon
  98. ^ "Identificación del procesador Intel e instrucción CPUID" (PDF) . Descargar.intel.com. 2012-03-06 . Consultado el 11 de abril de 2013 .
  99. ^ InstLatx64, volcado de CPUID de Vortex86DX3, 27 de septiembre de 2021. Archivado el 21 de octubre de 2021.
  100. ^ InstLatx64, volcado de CPUID de AMD Ryzen 7 6800HS, 21 de febrero de 2022. Archivado el 24 de marzo de 2023.
  101. ^ AMD, BKDG para procesadores AMD Family 10h, pub.no. 31116, rev 3.62, 11 de enero de 2013, página 392. Archivado el 16 de enero de 2019.
  102. ^ AMD, PPR para procesadores AMD Family 19h modelo 61h rev B1, pub.no. 56713, rev 3.05, 8 de marzo de 2023, página 99. Archivado el 25 de abril de 2023.
  103. ^ AMD, BKDG para procesadores AMD Family 16h modelos 00-0Fh, pub.no. 48571, rev 3.03, 19 de febrero de 2015, página 482. Archivado el 16 de enero de 2019.
  104. ^ Guía para desarrolladores de AMD, BIOS y kernel para procesadores AMD Athlon 64 y AMD Opteron, publicación n.º 26094, rev 3.30, febrero de 2006, páginas 29-30 (enumera las diferencias de revisión de Athlon 64, incluido LMSLE) (archivado el 16 de enero de 2019), y Guía de revisión para procesadores AMD Athlon 64 y AMD Opteron, publicación n.º 25759, rev 3.79, julio de 2009, páginas 7 y 8 (enumera los ID de revisión de Athlon 64) (archivada el 18 de enero de 2019).
  105. ^ AMD, PPR para procesadores AMD Family 19h Modelo 01h, Revisión B1, Volumen 1 de 2, documento no. 55898, rev 0.50, 27 de mayo de 2021, página 98: enumera el bit de muestreo de rama. Archivado el 24 de julio de 2022
  106. ^ AMD, tecnología de virtualización AMD64 con nombre en código "Pacifica", publicación no. 33047, rev 3.01, mayo de 2005, apéndice B, página 81. Archivado el 13 de junio de 2011.
  107. ^ AMD, especificación CPUID, publicación n.º 25481, revisión 2.18, enero de 2006, página 18.
  108. ^ AMD, especificación CPUID, publicación n.º 25481, revisión 2.34, septiembre de 2010, páginas 5 y 11.
  109. ^ Instlatx64, volcado de CPUID de AMD E-350: tiene CPUID.(EAX=8000000A):EDX[9] configurado.
  110. ^ AMD, especificación CPUID, publicación n.º 25481, revisión 2.28, abril de 2008, página 21.
  111. ^ AMD, especificación CPUID, publicación n.º 25481, revisión 2.34, septiembre de 2010, página 5: enumera "SseIsa10Compat" como eliminado en noviembre de 2009.
  112. ^ ab AMD, PPR para procesadores AMD Family 19h Modelo 61h, Revisión B1, documento no. 56713, rev 3.05, 8 de marzo de 2023, página 102. Archivado el 25 de abril de 2023.
  113. ^ AMD, Módulo de servicio de VM seguro para invitados SEV-SNP, pub.no #58019, rev 1.00, julio de 2023, página 13. Archivado el 5 de agosto de 2023.
  114. ^ AMD, PPR para procesadores AMD Family 19h Modelo 61h, Revisión B1, documento no. 56713, rev 3.05, 8 de marzo de 2023, página 116. Archivado el 25 de abril de 2023.
  115. ^ Ferrie, Peter. "Ataques a emuladores de máquinas virtuales" (PDF) . symantec.com . Investigación avanzada de amenazas de Symantec. Archivado desde el original (PDF) el 7 de febrero de 2007 . Consultado el 15 de marzo de 2017 .
  116. ^ Sandpile, CPUID de arquitectura x86. Consultado el 22 de diciembre de 2022.
  117. ^ instlatx64, volcado de CPUID de AMD A4-5000, enumera la cadena "HELLO KITTY" para la hoja CPUID 8FFFFFFFh. Consultado el 22 de diciembre de 2022.
  118. ^ IDT, Hoja de datos del procesador WinChip 2B, v0.9, abril de 1999, capítulo 3.3.3, página 31.
  119. ^ VIA, Guía de programación de PadLock rev. 1.66, 4 de agosto de 2005, página 5. Archivado desde el original el 26 de mayo de 2010.
  120. ^ Fuentes del kernel de OpenEuler 1.0 LTS, /arch/x86/include/asm/cpufeatures.h líneas 147-178. Archivado el 30 de julio de 2023.
  121. ^ VIA, Hoja de datos del procesador C3 Nehemiah, rev 1.13, 29 de septiembre de 2004, página 21
  122. ^ "GCC-espejo / GCC". GitHub . 13 de marzo de 2022.
  123. ^ "Centro de información ARM". Infocenter.arm.com . Consultado el 11 de abril de 2013 .
  124. ^ "Códigos de versión del procesador y constantes SRM". Archivado desde el original el 8 de septiembre de 2014 . Consultado el 8 de septiembre de 2014 .
  125. ^ ab "Guía técnica de clase empresarial de IBM System z10" (PDF) .
  126. ^ "Arquitectura MIPS32 para programadores, Volumen III: La arquitectura de recursos privilegiados MIPS32" (PDF) . Tecnologías MIPS, Inc. 2001-03-12.
  127. ^ "Arquitectura del entorno operativo PowerPC, libro III" (PDF) .

Otras lecturas

enlaces externos