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


#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()重写为stdout。

uname -a输出:Linux ubuntu 5.4.0-1047-raspi#52 ubuntu SMP PREEMPT 11月24日星期三08:16:38 UTC 2021 aarch64 aarch64 GNU/Linux

一种方法是解析/proc/cpuinfo;该格式被设计为易于用CCD_ 4进行解析。每个处理器都有一个CPU implementer行,其中包含一个8位十六进制实现程序代码。在Armv8体系结构参考手册中MIDR_EL1系统控制寄存器的描述下,可以找到相应实现者的表格。

注意;实施者";是设计核心的组织,它可能与物理芯片上的公司名称不同。例如,Raspberry Pi 4B有一个Broadcom SoC,但其中使用的核心是Arm设计的Cortex A72,因此实现程序代码是0x41,即Arm,而不是0x42,即Broadcom。

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

最新更新