커널은 런타임 시 캐시 라인 크기를 어떻게 결정합니까?

커널은 런타임 시 캐시 라인 크기를 어떻게 결정합니까?

/proc/cpuinfo캐시 라인 크기를 제공하는 것으로 나타났습니다 .

# cat /proc/cpuinfo | egrep "(cache|clflush)"
cache size  : 6144 KB
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat
pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon
pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq
ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt aes xsave avx hypervisor lahf_lm ida arat
epb pln pts dtherm xsaveopt
clflush size    : 64
cache_alignment : 64

나는 커널이 CPU 명령(또는 x86/x32/x64의 경우 CPUID 기능)이나 오프라인으로 컴파일된 값 테이블을 사용한다고 추측합니다. 나는 일부 타이밍 공격을 막기 위해 소프트웨어에서 정확한 값을 얻는 데 관심이 있습니다.

또한 커널에는 컴파일 타임에 사용되는 정적 값이 있다는 것도 알고 있습니다. 예를 들어,커널은 ARM에 대해 캐시 라인 길이 64를 사용합니다.빌드 중에는 런타임에도 동적 값으로 전환됩니다.

커널은 캐시 라인 크기를 정확히 어떻게 결정합니까?

커널이 이를 검색하기 위한 API를 노출합니까?

항상 정확합니까?

답변1

EAX=2인 CPUID 명령어는 EAX, EBX, ECX 및 EDX 레지스터의 캐시 및 TLB 정보를 반환합니다.

예를 들어,http://x86.renejeschke.de/html/file_module_x86_id_45.html반환 값을 문서화하는 INPUT EAX=2를 사용합니다.

VM 내부에서 CPUID 명령을 재정의하는 것이 가능하지만 해당 경우에는 신경 쓰지 않을 수도 있습니다.

관련 정보