BIOSなしで指定されたアーキテクチャ(x86、x64、picコントローラー)でチップ名とアドレス指定可能なメモリを取得するにはどうすればよいですか? 利用可能なメモリサイズを格納する特定のレジスタを取得しましたか?
2 に答える
0
CPUID
x86 では、命令を使用してチップ名を取得できます。CPUIDに関するウィキペディアの記事には、プロセッサのブランド名の文字列を照会する方法のサンプル コードが示されています。
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 and kernel developer guide) に非常に固有であるためです。通常、公開版 (NDA は不要) では、これに関する部分的な参照のみを提供します。文書化された方法は、ACPI BIOS にこの情報を照会することです。
于 2013-03-14T12:08:17.533 に答える