Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mengakses Maklumat CPU menggunakan GCC dalam Linux: Assembly vs. `cpuid.h`?
Cara Mengakses Maklumat CPU dalam Linux Menggunakan GCC
Dalam bidang seni bina x86, pembangun sering bergantung pada _cpuinfo() dalam Windows API untuk mendapatkan semula maklumat berharga tentang CPU mereka. Walau bagaimanapun, pengguna Linux mempunyai set alatan mereka sendiri, salah satunya ialah arahan cpuid.
Satu kaedah untuk menggunakan cpuid dalam Linux menggunakan GCC melibatkan pemasangan sebaris, teknik yang mencampurkan arahan pemasangan dengan C / kod C. Assemblers membolehkan pembangun mengawal operasi CPU secara langsung dan anda mungkin telah cuba menulis rutin pemasangan anda sendiri untuk cpuid:
<code class="c++">// Accessing CPUID using assembly #include <iostream> int main() { int a, b; for (a = 0; a < 5; a++) { __asm ( "mov %1, %%eax; " // a into eax "cpuid;" "mov %%eax, %0;" // eax into b :"=r"(b) // output :"r"(a) // input :"%eax","%ebx","%ecx","%edx" // clobbered register ); std::cout << "The CPUID level " << a << " gives EAX= " << b << '\n'; } return 0; }</code>
Walaupun kaedah ini memberikan anda akses peringkat rendah kepada cpuid, ia memerlukan pengekodan pemasangan, yang boleh memakan masa dan terdedah kepada kesilapan. Nasib baik, terdapat cara yang lebih mudah yang menghapuskan keperluan untuk pemasangan.
GCC menawarkan fail pengepala berkuasa yang dipanggil cpuid.h yang menyediakan sokongan menyeluruh untuk operasi cpuid. Pengepala ini mengisytiharkan fungsi teguh yang membolehkan anda mendapatkan semula maklumat CPU tanpa kerumitan pemasangan sebaris. Begini cara anda boleh memanfaatkan cpuid.h untuk mendapatkan semula data CPU:
<code class="c++">// Accessing CPUID using cpuid.h #include <iostream> #include <cpuid.h> int main() { unsigned int eax, ebx, ecx, edx; // Get the maximum supported CPUID level unsigned int max_level = __get_cpuid_max(0x0, NULL); // Retrieve CPUID data for level 0 __get_cpuid(0, &eax, &ebx, &ecx, &edx); std::cout << "CPUID level 0:" << std::endl; std::cout << " EAX: " << eax << std::endl; std::cout << " EBX: " << ebx << std::endl; std::cout << " ECX: " << ecx << std::endl; std::cout << " EDX: " << edx << std::endl; // Repeat for other levels as needed // ... return 0; }</code>
Dengan pengepala cpuid.h, anda boleh dengan mudah mendapatkan maklumat CPU tanpa kerumitan pengekodan pemasangan. Ia menyediakan antara muka yang mudah dan boleh dipercayai untuk mengakses data khusus CPU dalam aplikasi Linux anda.
Atas ialah kandungan terperinci Bagaimana untuk Mengakses Maklumat CPU menggunakan GCC dalam Linux: Assembly vs. `cpuid.h`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!