<पी> बूटलोडर/कर्नेल विकसित करते समय, सॉफ़्टवेयर और हार्डवेयर के बीच प्रदर्शन और अनुकूलता को अनुकूलित करने के लिए अंतर्निहित आर्किटेक्चर को समझना महत्वपूर्ण है। <पी> सिस्टम जानकारी को क्वेरी करने और पुनर्प्राप्त करने के लिए इंजीनियरों के लिए उपलब्ध एक महत्वपूर्ण लेकिन कभी-कभी अनदेखा किया गया टूल CPUID निर्देश है। सीपीयूआईडी निर्देश क्या है?
<पी> सीपीयूआईडी निर्देश एक निम्न स्तर का निर्देश है, जो प्रत्येक आधुनिक x86 और x86-64 प्रोसेसर के केंद्र में है, जो सॉफ्टवेयर को प्रोसेसर और उसके समर्थित सुविधाओं के बारे में जानकारी के लिए सीपीयू से पूछताछ करने की अनुमति देता है। <पी> इस निर्देश को लागू करके, आप प्रोसेसर के मॉडल, परिवार, आंतरिक कैश आकार और SIMD या हार्डवेयर वर्चुअलाइजेशन जैसी समर्थित सुविधाओं जैसी जानकारी एकत्र कर सकते हैं। यह आपको प्रदर्शन को अनुकूलित करने और समर्थित सुविधाओं को गतिशील रूप से सक्षम या अक्षम करने में मदद कर सकता है। <पी> बूटलोडर या कर्नेल डेवलपर्स के लिए, यह समझना कि प्रोसेसर किन सुविधाओं का समर्थन करता है - जैसे हार्डवेयर वर्चुअलाइजेशन, कैश आकार, या SIMD निर्देश - यह सुनिश्चित कर सकता है कि सिस्टम कुशलतापूर्वक चलता है और आपके द्वारा लिखा गया कोड विभिन्न सीपीयू में संगत है। सीपीयूआईडी निर्देश का उपयोग करके, आप अपने कर्नेल के व्यवहार को उस विशिष्ट प्रोसेसर के आधार पर गतिशील रूप से समायोजित कर सकते हैं जिस पर वह चल रहा है। <पी> इस लेख में आप सीखेंगे कि कैसे जांचें कि आपके सिस्टम के लिए सीपीयूआईडी निर्देश उपलब्ध है या नहीं, यह कैसे काम करता है और इसका उपयोग करने से आप क्या जानकारी प्राप्त कर सकते हैं। आवश्यकताएँ
- <पी> असेंबली भाषा का कुछ ज्ञान (इस उदाहरण के लिए मैं FASM का उपयोग करता हूं)
- <पी> ऑपरेटिंग सिस्टम/कर्नेल का कुछ ज्ञान
- <पी> विभिन्न प्लेटफार्मों पर अपने बूटलोडर/कर्नेल का परीक्षण करने के लिए निम्न-स्तरीय डिबगिंग टूल (उदाहरण के लिए, जीडीबी) या क्यूईएमयू जैसे हार्डवेयर एमुलेटर तक पहुंच।पी>
चरण 1:CPUID उपलब्धता की जाँच करें
<पी> सीपीयूआईडी निर्देश को निष्पादित करने से पहले, यह निर्धारित करना महत्वपूर्ण है कि प्रोसेसर इसका समर्थन करता है या नहीं, क्योंकि सभी सीपीयू में इस कार्यक्षमता की गारंटी नहीं है। निम्नलिखित कोड EFLAGS रजिस्टर में आईडी बिट (बिट 21) को संशोधित और परीक्षण करके सीपीयूआईडी निर्देश की उपलब्धता की जांच करता है। <पी> यहां wiki.osdev.org से एक तस्वीर है जो EFLAGS रजिस्टर के प्रत्येक बिट को दिखाती है: <पी>
<पी> यदि प्रोसेसर इस बिट को टॉगल करने की अनुमति देता है, तो CPUID समर्थित है; अन्यथा, ऐसा नहीं है. यहां बताया गया है कि पता लगाने की प्रक्रिया कैसे काम करती है: <पी> (ज्यादातर लोग सोचते हैं कि रियल मोड में 32 रजिस्टर पहुंच योग्य नहीं हैं। यह सच नहीं है। सभी 32 बिट रजिस्टर प्रयोग करने योग्य हैं) cpuid_check:
pusha ; save state
pushfd ; Save EFLAGS
pushfd ; Store EFLAGS
xor dword [esp],0x00200000 ; Invert the ID bit in stored EFLAGS
popfd ; Load stored EFLAGS (with ID bit inverted)
pushfd ; Store EFLAGS again (ID bit may or may not be inverted)
pop eax ; eax = modified EFLAGS (ID bit may or may not be inverted)
xor eax,[esp] ; eax = whichever bits were changed
popfd ; Restore original EFLAGS
and eax,0x00200000 ; eax = zero if ID bit can't be changed, else non-zero
cmp eax,0x00
je .cpuid_instruction_not_is_available
.cpuid_instruction_is_available:
;handle CPUID exists
.cpuid_instruction_not_is_available:
;handle CPUID isn't supported
.cpuid_check_end:
popa ; restore state
ret
<पी> pusha :यह सुनिश्चित करने के लिए कि मूल स्थिति को अंत में बहाल किया जा सकता है, सभी सामान्य प्रयोजन रजिस्टरों को सहेजता है। <पी> pushfd :वर्तमान EFLAGS रजिस्टर सहेजता है। <पी> pushfd :EFLAGS की एक प्रति संग्रहीत करता है। <पी> xor dword [esp], 0x00200000 :कोड XOR ऑपरेटर का उपयोग करके EFLAGS की आईडी बिट (21) को फ़्लिप करता है। <पी> popfd :उल्टे आईडी बिट के साथ संशोधित EFLAGS को पुनर्स्थापित करता है। <पी> pushfd :संशोधित EFLAGS को वापस स्टैक पर धकेलता है। <पी> pop eax :संशोधित EFLAGS (आईडी बिट उल्टा हो भी सकता है और नहीं भी) को EAX रजिस्टर में डालता है। <पी> xor eax, [esp] :XOR ऑपरेशन के बाद, EAX में वे बिट्स शामिल होंगे जो बदले गए थे। <पी> popfd :मूल EFLAGS को पुनर्स्थापित करता है। <पी> and eax, 0x00200000 :and ऑपरेशन अन्य सभी बिट्स को मास्क करके 21वें बिट (आईडी बिट) को अलग करता है। इस ऑपरेशन के बाद EAX रजिस्टर में या तो 0x00200000 होगा (यदि 21 बिट बदला गया था जिसका मतलब है कि CPUID समर्थित है) या 0×00 (21 बिट नहीं बदला है, CPUID समर्थित नहीं है)। <पी> cmp eax, 0x00 :सीएमपी निर्देश पिछले ऑपरेशन के परिणाम की जांच करता है। यदि EAX 0×00 के बराबर है, तो इसका मतलब है कि आईडी बिट को संशोधित नहीं किया जा सकता है और प्रोसेसर CPUID निर्देश का समर्थन नहीं करता है। यदि यह शून्य नहीं है, तो इसका मतलब है कि आईडी बिट फ़्लिप किया गया था और आपका प्रोसेसर CPUID निर्देश का समर्थन करता है। सीपीयू सुविधाएं प्राप्त करें
<पी> CPUID निर्देश EAX रजिस्टर में अलग-अलग मानों के साथ अलग-अलग जानकारी लौटाएगा। mov eax, 0x1
cpuid
<पी> EAX को 1 पर सेट करने पर, CPUID EDX में एक बिटफ़ील्ड लौटाएगा, जिसमें निम्नलिखित मान होंगे। अलग-अलग ब्रांड इन्हें अलग-अलग अर्थ दे सकते हैं (स्रोत https://wiki.osdev.org/CPUID) enum {
CPUID_FEAT_ECX_SSE3 = 1 << 0,
CPUID_FEAT_ECX_PCLMUL = 1 << 1,
CPUID_FEAT_ECX_DTES64 = 1 << 2,
CPUID_FEAT_ECX_MONITOR = 1 << 3,
CPUID_FEAT_ECX_DS_CPL = 1 << 4,
CPUID_FEAT_ECX_VMX = 1 << 5,
CPUID_FEAT_ECX_SMX = 1 << 6,
CPUID_FEAT_ECX_EST = 1 << 7,
CPUID_FEAT_ECX_TM2 = 1 << 8,
CPUID_FEAT_ECX_SSSE3 = 1 << 9,
CPUID_FEAT_ECX_CID = 1 << 10,
CPUID_FEAT_ECX_SDBG = 1 << 11,
CPUID_FEAT_ECX_FMA = 1 << 12,
CPUID_FEAT_ECX_CX16 = 1 << 13,
CPUID_FEAT_ECX_XTPR = 1 << 14,
CPUID_FEAT_ECX_PDCM = 1 << 15,
CPUID_FEAT_ECX_PCID = 1 << 17,
CPUID_FEAT_ECX_DCA = 1 << 18,
CPUID_FEAT_ECX_SSE4_1 = 1 << 19,
CPUID_FEAT_ECX_SSE4_2 = 1 << 20,
CPUID_FEAT_ECX_X2APIC = 1 << 21,
CPUID_FEAT_ECX_MOVBE = 1 << 22,
CPUID_FEAT_ECX_POPCNT = 1 << 23,
CPUID_FEAT_ECX_TSC = 1 << 24,
CPUID_FEAT_ECX_AES = 1 << 25,
CPUID_FEAT_ECX_XSAVE = 1 << 26,
CPUID_FEAT_ECX_OSXSAVE = 1 << 27,
CPUID_FEAT_ECX_AVX = 1 << 28,
CPUID_FEAT_ECX_F16C = 1 << 29,
CPUID_FEAT_ECX_RDRAND = 1 << 30,
CPUID_FEAT_ECX_HYPERVISOR = 1 << 31,
CPUID_FEAT_EDX_FPU = 1 << 0,
CPUID_FEAT_EDX_VME = 1 << 1,
CPUID_FEAT_EDX_DE = 1 << 2,
CPUID_FEAT_EDX_PSE = 1 << 3,
CPUID_FEAT_EDX_TSC = 1 << 4,
CPUID_FEAT_EDX_MSR = 1 << 5,
CPUID_FEAT_EDX_PAE = 1 << 6,
CPUID_FEAT_EDX_MCE = 1 << 7,
CPUID_FEAT_EDX_CX8 = 1 << 8,
CPUID_FEAT_EDX_APIC = 1 << 9,
CPUID_FEAT_EDX_SEP = 1 << 11,
CPUID_FEAT_EDX_MTRR = 1 << 12,
CPUID_FEAT_EDX_PGE = 1 << 13,
CPUID_FEAT_EDX_MCA = 1 << 14,
CPUID_FEAT_EDX_CMOV = 1 << 15,
CPUID_FEAT_EDX_PAT = 1 << 16,
CPUID_FEAT_EDX_PSE36 = 1 << 17,
CPUID_FEAT_EDX_PSN = 1 << 18,
CPUID_FEAT_EDX_CLFLUSH = 1 << 19,
CPUID_FEAT_EDX_DS = 1 << 21,
CPUID_FEAT_EDX_ACPI = 1 << 22,
CPUID_FEAT_EDX_MMX = 1 << 23,
CPUID_FEAT_EDX_FXSR = 1 << 24,
CPUID_FEAT_EDX_SSE = 1 << 25,
CPUID_FEAT_EDX_SSE2 = 1 << 26,
CPUID_FEAT_EDX_SS = 1 << 27,
CPUID_FEAT_EDX_HTT = 1 << 28,
CPUID_FEAT_EDX_TM = 1 << 29,
CPUID_FEAT_EDX_IA64 = 1 << 30,
CPUID_FEAT_EDX_PBE = 1 << 31
};
<पी> उपरोक्त सीपीयू सुविधाओं का संक्षिप्त विवरण: - <पी>
PCLMUL, AES :तेज़ एन्क्रिप्शन और डिक्रिप्शन के लिए क्रिप्टोग्राफ़िक निर्देश सेट।
- <पी>
VMX, SMX :वर्चुअल मशीन चलाने के लिए वर्चुअलाइजेशन समर्थन।
- <पी>
SSE3, SSSE3, SSE4.1, SSE4.2, AVX :तेज़ मल्टीमीडिया, गणित और वेक्टर प्रोसेसिंग के लिए SIMD निर्देश सेट।
- <पी>
FMA :फ़्यूज्ड मल्टीप्ली-ऐड, फ़्लोटिंग-पॉइंट गणनाओं में प्रदर्शन में सुधार करता है।
- <पी>
RDRAND :यादृच्छिक संख्या जनरेटर.
- <पी>
X2APIC :मल्टीप्रोसेसर सिस्टम में उन्नत इंटरप्ट हैंडलिंग।
- <पी>
PCID :संदर्भ स्विच के दौरान मेमोरी प्रबंधन को अनुकूलित करता है।
- <पी>
FPU :तेज़ गणित संचालन के लिए हार्डवेयर फ़्लोटिंग-पॉइंट इकाई।
- <पी>
PAE :फिजिकल एड्रेस एक्सटेंशन, 4 जीबी से अधिक मेमोरी को एड्रेस करने की अनुमति देता है।
- <पी>
HTT :एक सीपीयू कोर को कई थ्रेड्स को संभालने की अनुमति देता है।
- <पी>
PAT, PGE :कैशिंग और पेज मैपिंग को नियंत्रित करने के लिए मेमोरी प्रबंधन सुविधाएँ।
- <पी>
MMX, SSE, SSE2 :मल्टीमीडिया प्रोसेसिंग के लिए पुराने SIMD अनुदेश सेट।
सीपीयू विक्रेता स्ट्रिंग प्राप्त करें
<पी> यदि आप CPU विक्रेता स्ट्रिंग प्राप्त करना चाहते हैं, तो CPUID निर्देश लागू करने से पहले EAX को 0×0 पर सेट किया जाना चाहिए। mov eax, 0x0
cpuid
<पी> विक्रेता स्ट्रिंग एक विशिष्ट पहचानकर्ता है जिसका उपयोग AMD और Intel जैसे CPU विक्रेता करते हैं। उदाहरण हैं:जेनुइनइंटेल (इंटेल प्रोसेसर के लिए) या ऑथेंटिकएएमडी (एएमडी प्रोसेसर के लिए)। यह मूल रूप से सीपीयू के निर्माता को निर्दिष्ट करता है। <पी> विक्रेता स्ट्रिंग कर्नेल को सीपीयू निर्माता की पहचान करने की अनुमति देती है जो बहुत उपयोगी है क्योंकि विभिन्न निर्माता कुछ सुविधाओं को अलग-अलग तरीके से लागू करते हैं। इसके अलावा, सॉफ्टवेयर या ड्राइवर अनुकूलता सुनिश्चित करने के लिए सीपीयू निर्माता के आधार पर अलग-अलग तरीके से इंटरैक्ट कर सकते हैं। <पी> इस तरह उपयोग करने पर, विक्रेता आईडी स्ट्रिंग EBX, EDX, ECX रजिस्टरों में वापस आ जाएगी। आप उन्हें एक बफ़र में लिख सकते हैं और पूरी 12 अक्षर वाली स्ट्रिंग प्राप्त कर सकते हैं। <पी> उदाहरण कोड: चरण 1:बफ़र
<पी> एक बफ़र बनाएं जो 12 बाइट्स रख सके: buffer: db 12 dup(0), 0xA, 0xD, 0
चरण 2:बफ़र प्रिंट करें
<पी> हम एक स्ट्रिंग प्रिंटिंग फ़ंक्शन बनाकर शुरुआत करते हैं। <पी> यह असेंबली कोड एक स्ट्रिंग कैरेक्टर को कैरेक्टर द्वारा पढ़ता है और इसे BIOS इंटरप्ट 0x10 का उपयोग करके स्क्रीन पर प्रिंट करता है। print फ़ंक्शन स्ट्रिंग के माध्यम से लूप करता है और lodsb का उपयोग करता है al में प्रत्येक अक्षर को लोड करने का निर्देश रजिस्टर करें. <पी> फिर print_char फ़ंक्शन इसे स्क्रीन पर प्रिंट करने के लिए इंटरप्ट 0×10 का उपयोग करता है। जब कोड स्ट्रिंग के अंत (नल टर्मिनेटर) तक पहुंचता है, तो लूप समाप्त हो जाता है। print_string:
call print
ret
print:
.loop:
lodsb ;read character to al and then increment
cmp al ,0 ;check if we reached the end
je .done ;we reached null terminator, finish
call print_char ;print character
jmp .loop ;jump back into the loop
.done:
ret
print_char:
mov ah, 0eh
int 0x10
ret
चरण 3:बफ़र भरें और इसे प्रिंट करें
<पी> यहां, pusha का उपयोग करके वर्तमान स्थिति को सहेजने के बाद निर्देश और कॉलिंग cpuid EAX रजिस्टर में 0×0 पास होने पर, हम ebx की सामग्री संग्रहीत कर सकते हैं , edx , ecx बफ़र को. फिर हम print_string पर कॉल करते हैं इसे प्रिंट करने के लिए. get_cpu_vendor:
pusha
mov eax, 0x0
cpuid
mov [buffer], ebx
mov [buffer + 4], edx
mov [buffer + 8], ecx
mov si, buffer
call print_string
popa
ret
<पी> मेरे YouTube चैनल का एक वीडियो जहां मैं उपरोक्त कोड को लागू करता हूं और विस्तार से समझाता हूं <पी> पी> <पी> ईएक्स रजिस्टर में पारित मूल्य के अनुसार सीपीयूआईडी निर्देश आपको कौन सी जानकारी दे सकता है, इसके बारे में अधिक जानकारी यहां पाई जा सकती है:https://gitlab.com/x86-cpuid.org/x86-cpuid-db उपसंहार
<पी> सीपीयूआईडी निर्देश को समझकर और उसका उपयोग करके, आप अपने बूटलोडर/कर्नेल को प्रोसेसर की एक विस्तृत श्रृंखला के लिए अधिक अनुकूलनीय बना सकते हैं। निर्देश की उपलब्धता का पता लगाने और सीपीयू सुविधाओं, कैश आकार और समर्थित तकनीकों जैसी महत्वपूर्ण सिस्टम जानकारी प्राप्त करने का तरीका जानने से प्रदर्शन और संगतता में काफी वृद्धि हो सकती है। <पी> इस लेख को पढ़ने के बाद, आपके पास सीपीयूआईडी निर्देश की खोज शुरू करने के लिए उपकरण और ज्ञान होना चाहिए और आप इसे अपने प्रोजेक्ट में कैसे उपयोग कर सकते हैं! <पी> हैप्पी कोडिंग! <पी> मुफ़्त में कोड करना सीखें. फ्रीकोडकैंप के ओपन सोर्स पाठ्यक्रम ने 40,000 से अधिक लोगों को डेवलपर्स के रूप में नौकरी पाने में मदद की है। आरंभ करें