0

如何在没有bios的情况下获取指定架构(x86、x64、pic控制器)中的芯片名称和可寻址内存?您是否有特定的寄存器来存储可用内存大小?

4

2 回答 2

0

不确定这有多相关,但它可能有助于为您指明正确的方向。

将 PicBasic 与 PicAxe 单片机(不是 PIC 单片机)一起使用,编程语言中有一个关键字/语句,称为“READSILICON”

此 READSILICON 操作将读取硅的未指定区域并返回一个值,该值又用于/用于识别 MCU。

那么也许在您的开发 IDE 中有类似的功能?

注意:由于这是当时的一项新功能,因此只有较新的 mcu 支持它,显然较旧的 mcu 不支持。

于 2013-03-14T09:44:12.893 回答
0

在 x86 中,可以使用CPUID指令检索芯片名称;CPUID 上的Wikipedia 文章提供了有关如何查询处理器品牌名称字符串的示例代码。

有关 CPUID 的主要参考资料,请参阅Intel 的 App Note,品牌字符串标识在撰写本文时是第 7.2 节。

在 GCC 内联汇编中,您可以执行以下操作:

unsigned int cpuid = 0x80000000;

__asm__ __volatile__("cpuid\n\t" : "+a" (cpuid));
if (cpuid >= 0x80000004) { // brand name query supported
    union { char brandstr[48]; unsigned int i[12] } i;
    __asm__ ("cpuid\n\t"
        : "=a"(i.i[0]), "=b" (i.i[1]), "=c"(i.i[2]), "=d"(i.i[3])
        : "a"(0x80000002));
    __asm__ ("cpuid\n\t"
        : "=a"(i.i[4]), "=b" (i.i[5]), "=c"(i.i[6]), "=d"(i.i[7])
        : "a"(0x80000003));
    __asm__ ("cpuid\n\t"
        : "=a"(i.i[8]), "=b" (i.i[9]), "=c"(i.i[10]), "=d"(i.i[11])
        : "a"(0x80000004));
    printf ("This CPU brand name is: %48s\n", i.brandstr);
} else {
    printf ("This x86 CPU doesn't support brand name queries\n");
}

在 x86 机器上确定没有BIOS 的内存布局/大小几乎是不可能的,因为直接在硬件上执行此操作的方法非常特定于 CPU/芯片组组合,以及供应商的开发指南(BKCD - BIOS 和内核开发人员指南)通常只在公共(不需要 NDA)版本中提供关于此的部分参考。记录的方法是查询 ACPI BIOS 以获取此信息。

于 2013-03-14T12:08:17.533 回答