【问题标题】:Get CPU Vendor ID on Raspberry Pi 4B, like x86 CPUID?在 Raspberry Pi 4B 上获取 CPU 供应商 ID,例如 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 可能是最好的主意。

标签: linux assembly arm64 raspberry-pi4 cpuid


【解决方案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 位。

【讨论】:

    猜你喜欢
    • 2016-11-14
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    相关资源
    最近更新 更多