在 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系统篇