x86
4.1.3 x86 සහ ඉන්ටෙල් අත්පොතෙන් එය ඔබම සොයා ගන්න
arch/x86/include/asm/cpufeature.h
සම්පූර්ණ ලැයිස්තුව අඩංගු වේ.
අර්ථ දැක්වීමේ අගයන් වර්ග වේ:
X*32 + Y
උදා:
#define X86_FEATURE_FPU ( 0*32+ 0) /* Onboard FPU */
CPUID වෙතින් උපුටා ගත් විශේෂාංග ධජ, මෙහි ගබඩා කර ඇත:
__u32 x86_capability[NCAPINTS + NBUGINTS];
ක්ෂේත්රය
- වල
struct cpuinfo_x86 boot_cpu_data
- දී අර්ථ දක්වා ඇත
x86/kernel/setup.c
එය __init
ශ්රිත හරහා ආරම්භ වේ.
එක් එක් x86_capability
අරාව මූලද්රව්යය පැමිණෙන්නේ කොහෙන්ද :
| 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 |
සටහන්:
නිගමන:
බොහෝ ප්රවේශයන් CPUID ප්රතිදාන ලේඛනයෙන් කෙලින්ම පැමිණෙන අතර ඒවා සකසා ඇත්තේ common.c
:
c->x86_capability[0] = edx;
CPUID සඳහා ඉන්ටෙල් අත්පොතෙහි ඒවා පහසුවෙන් සොයාගත හැකිය.
අනෙක් ඒවා ප්රභවය පුරා විසිරී ඇති අතර ඒවා ටිකෙන් ටික සකසා ඇත set_cpu_cap
.
ඒවා සොයා ගැනීමට, git grep X86_FEATURE_XXX
ඇතුළත භාවිතා කරන්න arch/x86
.
අවට කේතයෙන් අනුරූප වන CPUID බිට් ඔබට සාමාන්යයෙන් අඩු කළ හැකිය.
වෙනත් විනෝදජනක කරුණු
කොඩි ඇත්ත වශයෙන්ම arch/x86/kernel/cpu/proc.c
කේතය සමඟ මුද්රණය කර ඇත :
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]);
කොහෙද:
cpu_has
විශේෂාංගය සඳහා ප්රධාන පරීක්ෂාව කරයි.
x86_cap_flags[i]
එක් එක් කොඩි වලට අනුරූප වන නූල් අඩංගු වේ.
මෙය proc
පද්ධති සැකසුම සඳහා නැවත කැඳවීමක් ලෙස සම්මත වේ. පිවිසුම් ස්ථානය තිබෙන්නේ fs/proc/cpuinfo.c
.
x86_cap_flags
නූල් ජනනය කරනු ලබන්නේ arch/x86/kernel/cpu/mkcapflags.h
කෙලින්ම arch/x86/include/asm/cpufeature.h
"විග්රහ කිරීමෙන්" sed
...
ප්රතිදානය arch/x86/kernel/cpu/capflags.c
ගොඩනැගීමේ නාමාවලිය වෙත යන අතර එහි ප්රති ar ලයක් ලෙස අරාව පෙනේ:
const char * const x86_cap_flags[NCAPINTS*32] = {
[X86_FEATURE_FPU] = "fpu",
[X86_FEATURE_VME] = "vme",
උදාහරණයක් ලෙස X86_FEATURE_FPU
නූලට අනුරූප වේ "fpu"
.
cpu_has
කේතය සමඟ අවස්ථා දෙකකට බෙදේ:
#define cpu_has(c, bit) \
(__builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit) ? 1 : \
test_cpu_cap(c, bit))
අර තියෙන්නේ:
__builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit)
: කර්නලය ක්රියාත්මක වීමට ධජය අවශ්ය වේ.
මෙය තීරණය වන්නේ ඇතුළත ඇති දත්ත required-features.h
අනුව ය:
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!
ඒවා සම්පාදක වේලාවේ (කර්නල් අවශ්යතා) දන්නා බැවින්, ආරම්භයේදීම දැනටමත් පරීක්ෂා කර ඇති හෙයින්, සංයුක්ත වේලාවේදී bit
දැනගත හොත් චෙක්පත සම්පාදනය කරන වේලාවේදී විසඳා ගත හැකිය .
මේ අනුව __builtin_constant_p(bit)
පරික්ෂා bit
කරන කාල නියතයදැයි පරීක්ෂා කරයි.
test_cpu_cap
: මෙය ගෝලීය CPUID
දත්ත භාවිතා කරයිstruct cpuinfo_x86 boot_cpu_data
$ egrep -wo ^flags|vmx|ept|vpid|npt|tpr_shadow|flexpriority|vnmi|lm|aes' /proc/cpuinfo --color | sort -u
. තවද CLI / GUI විශිෂ්ට අයි-නෙක්ස් ද ඇත.