x86
Temukan sendiri di 4.1.3 x86 dan manual Intel
arch/x86/include/asm/cpufeature.h
berisi daftar lengkap.
Nilai yang ditentukan adalah tipe:
X*32 + Y
Misalnya:
#define X86_FEATURE_FPU ( 0*32+ 0) /* Onboard FPU */
Bendera fitur, yang diekstrak dari CPUID, disimpan di dalam:
__u32 x86_capability[NCAPINTS + NBUGINTS];
bidang
- dari
struct cpuinfo_x86 boot_cpu_data
- didefinisikan pada
x86/kernel/setup.c
yang diinisialisasi melalui __init
fungsi.
Dari mana setiap x86_capability
elemen array berasal:
| index | eax | ecx | output | file |
|-------|----------|-----|--------|-------------|
| 0 | 1 | 0 | edx | common.c |
| 1 | 80000001 | | edx | common.c |
| 2 | 80860001 | | edx | transmeta.c |
| 3 | | | | |
| 4 | 1 | 0 | ecx | common.c |
| 5 | C0000001 | | edx | centaur.c |
| 6 | 80000001 | | ecx | common.c |
| 7 | | | | scattered.c |
| 8 | | | | |
| 9 | 7 | 0 | ebx | common.c |
| 10 | D | 1 | eax | common.c |
| 11 | F | 0 | edx | common.c |
| 12 | F | 1 | edx | common.c |
Catatan:
Kesimpulan:
sebagian besar entri datang langsung dari register keluaran CPUID dan diatur common.c
oleh sesuatu seperti:
c->x86_capability[0] = edx;
Itu mudah ditemukan dalam batch pada manual Intel untuk CPUID.
yang lain tersebar di seluruh sumber, dan diatur sedikit demi sedikit dengan set_cpu_cap
.
Untuk menemukannya, gunakan git grep X86_FEATURE_XXX
di dalam arch/x86
.
Anda biasanya dapat menyimpulkan bit CPUID mana yang sesuai dengan kode di sekitarnya.
Fakta menyenangkan lainnya
Bendera sebenarnya dicetak arch/x86/kernel/cpu/proc.c
dengan kode:
seq_puts(m, "flags\t\t:");
for (i = 0; i < 32*NCAPINTS; i++)
if (cpu_has(c, i) && x86_cap_flags[i] != NULL)
seq_printf(m, " %s", x86_cap_flags[i]);
Dimana:
cpu_has
apakah pemeriksaan utama untuk fitur.
x86_cap_flags[i]
berisi string yang sesuai dengan setiap bendera.
Ini dilewatkan sebagai panggilan balik ke proc
pengaturan sistem. Titik masuknya di fs/proc/cpuinfo.c
.
x86_cap_flags
string dihasilkan oleh arch/x86/kernel/cpu/mkcapflags.h
langsung dari arch/x86/include/asm/cpufeature.h
dengan "parsing" dengan sed
...
Output menuju ke arch/x86/kernel/cpu/capflags.c
direktori build, dan array yang dihasilkan terlihat seperti:
const char * const x86_cap_flags[NCAPINTS*32] = {
[X86_FEATURE_FPU] = "fpu",
[X86_FEATURE_VME] = "vme",
jadi misalnya X86_FEATURE_FPU
sesuai dengan string "fpu"
dan sebagainya.
cpu_has
dipecah menjadi dua kasus dengan kode:
#define cpu_has(c, bit) \
(__builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit) ? 1 : \
test_cpu_cap(c, bit))
Mereka:
__builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit)
: bendera diperlukan untuk menjalankan kernel.
Ini ditentukan oleh data di dalam required-features.h
, yang berkomentar:
Define minimum CPUID feature set for kernel These bits are checked
really early to actually display a visible error message before the
kernel dies. Make sure to assign features to the proper mask!
Karena itu diketahui pada waktu kompilasi (persyaratan kernel), telah diperiksa pada saat startup, pemeriksaan dapat diselesaikan pada waktu kompilasi jika bit
diketahui pada waktu kompilasi.
Jadi __builtin_constant_p(bit)
yang memeriksa apakah bit
adalah waktu kompilasi konstan.
test_cpu_cap
: ini menggunakan CPUID
data dari struct cpuinfo_x86 boot_cpu_data
global
$ egrep -wo ^flags|vmx|ept|vpid|npt|tpr_shadow|flexpriority|vnmi|lm|aes' /proc/cpuinfo --color | sort -u
. Dan ada juga CLI / GUI yang sangat baik i-nex .