x86
4.1.3 x86 ve Intel kılavuzunda kendiniz bulun
arch/x86/include/asm/cpufeature.h
tam listeyi içerir.
Tanım değerleri aşağıdaki gibidir:
X*32 + Y
Örneğin:
#define X86_FEATURE_FPU ( 0*32+ 0) /* Onboard FPU */
CPUID'den çıkarılan özellik bayrakları, içinde saklanır:
__u32 x86_capability[NCAPINTS + NBUGINTS];
alan
- nın-nin
struct cpuinfo_x86 boot_cpu_data
- tanımlı
x86/kernel/setup.c
hangi __init
fonksiyonlardan başlatılır .
Her x86_capability
dizi elemanının nereden geldiği:
| 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 |
Notlar:
Sonuç:
girişlerin çoğu doğrudan CPUID çıkış kayıtlarından gelir ve şöyle bir common.c
şey tarafından ayarlanır :
c->x86_capability[0] = edx;
Bunları toplu olarak CPUID için Intel el kitabında bulmak kolaydır.
Diğerleri kaynak boyunca dağınıktır ve azar azar ayarlanır set_cpu_cap
.
Onları bulmak için git grep X86_FEATURE_XXX
içini kullanın arch/x86
.
Genellikle çevreleyen koddan hangi CPUID biti karşılık geldiğini anlayabilirsiniz.
Diğer eğlenceli gerçekler
Bayraklar aslında şu arch/x86/kernel/cpu/proc.c
kodla basılıyor :
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]);
Nerede:
cpu_has
özellik için ana kontrol yapar.
x86_cap_flags[i]
Her bayraklara karşılık gelen dizeleri içerir.
Bu, proc
sistem kurulumuna geri arama olarak iletilir . Giriş noktası şu anda fs/proc/cpuinfo.c
.
x86_cap_flags
dizeleri arch/x86/kernel/cpu/mkcapflags.h
doğrudan arch/x86/include/asm/cpufeature.h
"ayrıştırma" ile üretilir sed
...
Çıktı arch/x86/kernel/cpu/capflags.c
, build dizinine gider ve elde edilen dizi şöyle görünür:
const char * const x86_cap_flags[NCAPINTS*32] = {
[X86_FEATURE_FPU] = "fpu",
[X86_FEATURE_VME] = "vme",
Örneğin X86_FEATURE_FPU
, dizgeye "fpu"
ve benzerlerine karşılık gelir .
cpu_has
kod ile iki duruma bölünür:
#define cpu_has(c, bit) \
(__builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit) ? 1 : \
test_cpu_cap(c, bit))
Onlar:
__builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit)
: Çekirdeğin çalışması için bayrak gereklidir.
Bu, içindeki required-features.h
yorumlarla belirlenir:
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!
Derleme zamanında bilinenler (çekirdek gereksinimleri), başlangıçta zaten kontrol edildiklerinden, derleme zamanında biliniyorsa, çek derleme zamanında çözülebilir bit
.
Böylece, derleme zaman sabiti __builtin_constant_p(bit)
olup olmadığını kontrol eder bit
.
test_cpu_cap
: Bu CPUID
, struct cpuinfo_x86 boot_cpu_data
global veri kullanır
$ egrep -wo ^flags|vmx|ept|vpid|npt|tpr_shadow|flexpriority|vnmi|lm|aes' /proc/cpuinfo --color | sort -u
. Ayrıca CLI / GUI mükemmel i-nex var .