如何在指定的体系结构(x86,pic控制器)中获取芯片名称和可寻址内存?

时间:2013-03-14 09:29:34

标签: c memory assembly architecture processor

如何在没有bios的指定架构(x86,x64,pic控制器)中获取芯片名称和可寻址内存?你有特定的寄存器存储可用的内存大小吗?

2 个答案:

答案 0 :(得分:0)

不确定这是多么相关,但它可能有助于指出正确的方向。

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

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

所以也许在您的开发IDE中有类似的功能?

注意: 由于这是一个新的功能,只有较新的mcu支持它,显然旧的没有。

答案 1 :(得分:0)

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

有关CPUID的主要参考,请参阅Intel's 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以获取此信息。