There is a neat command, lscpu, which is very handy to display CPU information on GNU/Linux
OS:
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 32
On-line CPU(s) list: 0-31
Thread(s) per core: 2
Core(s) per socket: 8
Socket(s): 2
......
But unfortunately, the BSD
OSs lack this command, maybe one reason is lscpu
relies heavily on /proc
file system which BSD
don’t provide, :-). TakeOpenBSD
as an example, if I want to know CPU
information, dmesg
should be one choice:
# dmesg | grep -i cpu
cpu0 at mainbus0: apid 0 (boot processor)
cpu0: Intel(R) Core(TM)2 Duo CPU P8700 @ 2.53GHz, 2527.35 MHz
cpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,SSE3,DTES64,MWAIT,DS-CPL,VMX,SMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,SSE4.1,XSAVE,NXE,LONG,LAHF,PERF,SENSOR
cpu0: 3MB 64b/line 8-way L2 cache
cpu0: apic clock running at 266MHz
cpu0: mwait min=64, max=64, C-substates=0.2.2.2.2.1.3, IBE
......
But the output makes me feeling messy, not very clear. As for dmidecode, it used to be another option, but now can’t work out-of-box because it will access /dev/mem
which for security reason, OpenBSD
doesn’t allow by default (You can refer this discussion):
# ./dmidecode
# dmidecode 3.1
Scanning /dev/mem for entry point.
/dev/mem: Operation not permitted
Based on above situation, I want a specified command for showing CPU
information for my BSD
box. So in the past 2
weeks, I developed a lscpu
program for OpenBSD/FreeBSD
, or more accurately, OpenBSD/FreeBSD
on x86
architecture since I only have some Intel
processors at hand. The application getsCPU
metrics from 2
sources:
(1) sysctl
functions.
The BSD
OSs provide sysctl
interface which I can use to get general CPU
particulars, such as how many CPUs the system contains, the byte-order of CPU, etc.
(2) CPUID
instruction. For x86
architecture, CPUID instruction can obtain very detail information of CPU
. This coding work is a little tedious and error-prone, not only because I need to reference both Intel
and AMD
specifications since these 2
vendors have minor distinctions, but also I need to parse the bits of register values.
The code is here, and if you run OpenBSD/FreeBSD
on x86
processors, please try it. It will be better you can give some feedback or report the issues, and I appreciate it very much. In the future if I have other CPUs resource, such as ARM
or SPARC64
, maybe I will enrich this small program.