
[英]Do current x86 architectures support non-temporal loads (from “normal” memory)?
[英]How to get the chip name and the addressable memory in the specified architectures (x86, pic controller)?
如何在没有BIOS的情况下获取指定架构(x86,x64,pic控制器)中的芯片名称和可寻址内存? 您是否有特定的寄存器来存储可用的内存大小?
不知道这是多么的讨人喜欢,但这可能会帮助您指出正确的方向。
将PicBasic与PicAxe单片机(而非PIC单片机)一起使用时,在编程语言中有一个关键字/语句称为“ READSILICON”
并且此READSILICON操作将读取硅片的未指定区域,并返回一个值,该值又用于/已用于识别MCU。
因此,也许在您的开发IDE中有类似的功能?
注意:由于这是一个新功能,因此只有较新的mcu支持它,而较旧的mcu显然不支持。
在x86中,可以使用CPUID
指令检索芯片名称。 Wikipedia上有关CPUID的文章提供了有关如何查询处理器品牌名称字符串的示例代码。
有关CPUID的主要参考,请参阅英特尔的应用笔记 ,在撰写本文时,品牌字符串标识为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以获得此信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.