在 Raspberry Pi 4B 上获取 CPU 供应商 ID,例如 x86 CPUID?

Posted

技术标签:

【中文标题】在 Raspberry Pi 4B 上获取 CPU 供应商 ID,例如 x86 CPUID?【英文标题】:Get CPU Vendor ID on Raspberry Pi 4B, like x86 CPUID? 【发布时间】:2022-01-22 13:05:14 【问题描述】:
#as -o cpuid.o cpuid.s 

cpuid.s: Assembler messages:
cpuid.s:8: Error: unknown mnemonic `movl' -- `movl $0,%eax'
cpuid.s:9: Error: unknown mnemonic `cpuid' -- `cpuid'
cpuid.s:10: Error: unknown mnemonic `movl' -- `movl $output,%edi'
cpuid.s:11: Error: unknown mnemonic `movl' -- `movl %ebx,28(%edi)'
cpuid.s:12: Error: unknown mnemonic `movl' -- `movl %edx,32(%edi)'
cpuid.s:13: Error: unknown mnemonic `movl' -- `movl %ecx,36(%edi)'
cpuid.s:14: Error: unknown mnemonic `movl' -- `movl $4,%eax'
cpuid.s:15: Error: unknown mnemonic `movl' -- `movl $1,%ebx'
cpuid.s:16: Error: unknown mnemonic `movl' -- `movl $output,%ecx'
cpuid.s:17: Error: unknown mnemonic `movl' -- `movl $42,%edx'
cpuid.s:18: Error: unknown mnemonic `int' -- `int $0x80'
cpuid.s:19: Error: unknown mnemonic `movl' -- `movl $1,%eax'
cpuid.s:20: Error: unknown mnemonic `movl' -- `movl $0,%ebx'
cpuid.s:21: Error: unknown mnemonic `int' -- `int $0x80'
#cat cpuid.s 
#cpuid.s Sample program to extract the processor Vendor ID
.section .data
output:
    .ascii "The processor Vendor ID is 'xxxxxxxxxxxx'\n"
.section .text
.global _start
_start:
    movl $0, %eax
    cpuid
    movl $output, %edi
    movl %ebx, 28(%edi)
    movl %edx, 32(%edi)
    movl %ecx, 36(%edi)
    movl $4, %eax
    movl $1, %ebx
    movl $output, %ecx
    movl $42, %edx
    int $0x80
    movl $1, %eax
    movl $0, %ebx
    int $0x80

如何将此 Intel 程序集重写为 Pi 程序集代码,以获取 CPU 供应商 ID,并将其 write() 到标准输出。

uname -a 输出: Linux ubuntu 5.4.0-1047-raspi #52-Ubuntu SMP PREEMPT Wed Nov 24 08:16:38 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux

【问题讨论】:

你不能轻易重写它,但请注意 linux 提供的/proc/cpuinfo 可能有你需要的东西。 ARM 处理器的汇编语言与 x86 处理器不同,并且没有像 x86 处理器那样的 12 字符供应商字符串。此外,不可能从用户进程(即在 EL0)获取供应商信息。您需要内核帮助才能执行此操作。检查/proc/cpuinfo 可能是最好的主意。 【参考方案1】:

一种方法是解析/proc/cpuinfo;该格式旨在易于使用fscanf 解析。每个处理器都有一个CPU implementer 行,其中包含一个 8 位十六进制实现代码。在MIDR_EL1系统控制寄存器描述下的Armv8 Architecture Reference Manual中可以找到对应实现者的表格。

请注意,“实施者”是设计内核的组织,可能与物理芯片上的名称公司不同。比如树莓派 4B 有一个 Broadcom SoC,但它内部使用的核心是 Arm 设计的 Cortex A72,所以实现代码是 Arm 的 0x41,而不是 Broadcom 的 0x42。

获取此代码的另一种方法是使用mrs x0, MIDR_EL1 之类的汇编指令读取MIDR_EL1 寄存器。该寄存器实际上只能在异常级别 1(根据其名称中的 EL1)读取,而不是从运行在异常级别 0 的用户空间程序中读取。但是,执行此指令会导致 Linux 内核处理的陷阱和模拟指令,所以mrs x0, MIDR_EL1 实际上是从用户空间“工作”的。 (这可能因不同的内核配置而异。)实现者代码是返回值的第 24-31 位。

【讨论】:

以上是关于在 Raspberry Pi 4B 上获取 CPU 供应商 ID,例如 x86 CPUID?的主要内容,如果未能解决你的问题,请参考以下文章

树莓派(Raspberry Pi)4B无界面安装 Raspberry Pi 系统篇

树莓派(Raspberry Pi)4B无界面安装Kali系统篇

树莓派(Raspberry Pi)4B无界面安装Kali系统篇

Raspberry Pi 4B 循迹模块

Raspberry Pi 4B 颜色检测

Raspberry Pi 4B C和Python开发环境安装