user2849738
user2849738

Reputation:

Acquring Processor ID in Linux

On Microsoft Windows you can get Processor ID (not Process ID) via WMI which is based in this case (only when acquiring Processor ID) on CPUID instruction
Is there a similar method to acquire this ID on Linux ?

Upvotes: 3

Views: 7014

Answers (2)

Daniel Widdis
Daniel Widdis

Reputation: 9131

For context of the OP's question, ProcessorID value returned by WMI is documented thus:

Processor information that describes the processor features. For an x86 class CPU, the field format depends on the processor support of the CPUID instruction. If the instruction is supported, the property contains 2 (two) DWORD formatted values. The first is an offset of 08h-0Bh, which is the EAX value that a CPUID instruction returns with input EAX set to 1. The second is an offset of 0Ch-0Fh, which is the EDX value that the instruction returns. Only the first two bytes of the property are significant and contain the contents of the DX register at CPU reset—all others are set to 0 (zero), and the contents are in DWORD format.

As an example, on my system:

C:\>wmic path Win32_Processor get ProcessorId
ProcessorId
BFEBFBFF000206A7

Note that the ProcessorID is simply a binary-encoded format of information usually available in other formats, specifically the signature (Family/Model/Stepping/Processor type) and feature flags. If you only need the information, you may not actually need this ID -- just get the already-decoded information from /proc/cpuinfo.

If you really want these 8 bytes, there are a few ways to get the ProcessorID in Linux.

With root/sudo, the ID is contained in the output of dmidecode:

<snip>
Handle 0x0004, DMI type 4, 35 bytes
Processor Information
    Socket Designation: CPU Socket #0
    Type: Central Processor
    Family: Other
    Manufacturer: GenuineIntel
    ID: A7 06 02 00 FF FB EB BF
<snip>

Note the order of bytes is reversed: Windows returns the results in Big-Endian order, while Linux returns them in Little-Endian order.

If you don't have root permissions, it is almost possible to reconstruct the ProcessorID from /proc/cpuinfo by binary-encoding the values it returns. For the "signature" (the first four bytes in Windows/last four bytes in Linux) you can binary encode the Identification extracted from /proc/cpuinfo to conform to the Intel Documentation Figure 5-2 (other manufacturers use it for compatibility).

  • Stepping is in bits 3-0
  • Model is in bits 19-16 and 7-4
  • Family is in bits 27-20 and 11-8
  • Processor type is in bits 13-12 (/proc/cpuinfo doesn't tell you this, assume 0)

Similarly, you can populate the remaining four bytes by iterating over the feature flags (flags key in /proc/cpuinfo) and setting bits as appropriate per Table 5-5 of the Intel doc linked above.

Finally, you can install the cpuid package (e.g., on Ubuntu, sudo apt-get install cpuid). Then by running the cpuid -r (raw) command you can parse its output. You would combine the values from the EAX and EDX registers for an initial EAX value of 1:

$ cpuid -r
CPU 0:
   0x00000000 0x00: eax=0x0000000d ebx=0x756e6547 ecx=0x6c65746e edx=0x49656e69
   0x00000001 0x00: eax=0x000206a7 ebx=0x00020800 ecx=0x9fba2203 edx=0x1f8bfbff
<snip>

Upvotes: 3

arkascha
arkascha

Reputation: 42925

I do not know what WMI is and MS-Windows "CPUID instruction", since I do not know or use MS-Windows (few users here do). So I cannot say for sure if this is offering the same information, but have a try with cat /proc/cpuinfo. If you require a specific value you can grep that out easily.

If you need do to this from within a program then you can use the file utils to read such information. Always keep in mind one of the most basic principles of 'unix' style operating systems: everything is a file.

Upvotes: 4

Related Questions