------------------------------------------------------------
author: hjjdebug
date: 2024年 08月 08日 星期四 10:15:59 CST
description: cpu 信息的获取(c代码)
------------------------------------------------------------
命令行下可以使用
$ lscpu
$ cat /proc/cpuinfo
----------------------------------------
1. 如果用c 获取cpu 个数呢?推荐get_nprocs()
----------------------------------------
当然你可以调用命令行工具获取.
更简单的办法还是调用系统库函数,我从ffmpeg代码中发现的.如下:
#include <unistd.h>
#include <stdio.h>
int main()
{
int nb_cpus = sysconf(_SC_NPROCESSORS_ONLN);
printf("nb_cpus:%d\n",nb_cpus);
return 0;
}
为了兼容性还是调用 GNU C Library 函数更好 get_nprocs()
需要包含<sys/sysinfo.h>
#include <unistd.h>
#include <sys/sysinfo.h>
#include <stdio.h>
int main()
{
int nb_cpus = sysconf(_SC_NPROCESSORS_ONLN); //返回用户可用的cpu个数
int nb_cpus2 = get_nprocs(); //返回用户可用的cpu个数
printf("nb_cpus:%d\n",nb_cpus);
printf("nb_cpus2:%d\n",nb_cpus2);
return 0;
}
-------------------------------------------------
2. 获取cpuid,做为机器的唯一性标识,只能用内联汇编
-------------------------------------------------
可用如下代码
#include <stdio.h>
#include <unistd.h>
#include <sys/syscall.h>
struct cpuid_regs {
unsigned int eax;
unsigned int ebx;
unsigned int ecx;
unsigned int edx;
};
/* 系统调用方法不可取, 查无SYS_cpuid 系统调用
void get_cpuid(unsigned int leaf, struct cpuid_regs *regs) {
syscall(SYS_cpuid, leaf, regs);
}
*/
// 我们只好用 “内联汇编指令 调用CPUID指令获取”, 代码如下
void get_cpuid(unsigned int leaf, unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx) {
asm volatile("cpuid"
: "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx)
: "a" (leaf));
}
int main() {
struct cpuid_regs regs;
get_cpuid(0x01, ®s.eax,®s.ebx,®s.ecx,®s.edx); //输入功能号0x1
printf("EAX = 0x%x, EBX = 0x%x, ECX = 0x%x, EDX = 0x%x\n",
regs.eax, regs.ebx, regs.ecx, regs.edx);
return 0;
}
//我的运行结果
$ ./cpuid
EAX = 0xa0671, EBX = 0xb100800, ECX = 0x7ffafbff, EDX = 0xbfebfbff
/* cpuid 中各寄存器意义,反正挺复杂的,
* 如果用作物理标识,应该是够用的, 恐怕很难找到2台机器cpuid是一样的.
EAX Version Information: Type, Family, Model, and Stepping ID (see Figure 3-6).
EBX Bits
BITS 07 - 00: Brand Index.
Bits 15 - 08: CLFLUSH line size (Value ∗ 8 = cache line size in bytes; used also by CLFLUSHOPT).
Bits 23 - 16: Maximum number of addressable IDs for logical processors in this physical package*.
Bits 31 - 24: Initial APIC ID**.
ECX Feature Information (see Figure 3-7 and Table 3-10).
EDX Feature Information (see Figure 3-8 and Table 3-11).
*/