RDRAND و RDSEED وظائف وحدة المعالجة المركزية المتاحة الآن

مرحبا بالجميع!

أنا نفسي لا أفعل التشفير ، لكن بحثي الصغير قد يكون مفيدًا جدًا. قررت التعامل مع وظائف المعالج المدمج في RDRAND و RDSEED. وقال دلفي مترجم معرف غير معلنة. هم BMI ، BMI2 ، AVX ، AVX2 ، وحتى AVX-512 موجودة منذ فترة طويلة ، واستقر دلفيان على SSE4.2. لا يهم نحن نجمع الشفرة بأنفسنا.

أولاً ، قمت بالتحقق من دعم المعالج لهذه الوظائف. بالطبع ، CPUID. يمكنك استخدام CPUID بدءًا من معالجات Pentium الأولى. آمل ألا يفكر أحد في تشغيل CPUID على جهاز 486 ، لأنه لم يكن هناك حتى الآن. بالمناسبة ، RDRAND و RDSEED قبل معالجات IvyBridge أيضًا غير موجودة.

function CPU_support_RDRAND: Boolean; asm mov rax, $01 cpuid test ecx, 40000000h // 30-  setne al end; function CPU_support_RDSEED: Boolean; asm mov rcx, 0 mov rax, $07 // №7 cpuid test ebx, 40000h // 18-  setne al end; 

اتضح أن جهاز Core i7 G6950X Extreme يدعم هذه الميزات. إذن ، قررت أن أجمِّع الرمز الثانوي يدويًا. لذوي الخبرة ، سأقدم كودات REX و REX.W. قد ترغب في كتابة النتيجة في سجل مختلف:

 const REX_RDRAND32: Byte = $F0; //(11b:REG, 110b:OPCODE, 000b:EAX) REX_RDSEED32: Byte = $F8; //(11b:REG, 111b:OPCODE, 000b:EAX) REX_W_RDRAND64: Byte = $48; //(11b:REG, 110b:OPCODE, 000b:RAX) REX_W_RDSEED64: Byte = $48; //(11b:REG, 111b:OPCODE, 000b:RAX) 

يمكن أن تعمل الوظائف في وضع 32 بت وفي وضع 64 بت. لذلك ، فعلت كلا ، وحتى في نسختين. والنتيجة هي 4 وظائف:

 function RDRand32: DWord; asm @Retry: db $0F, $C7, $F0 //RDRAND EAX (CF = 1    ) jnc @Retry end; function RDSeed32: DWord; asm @Retry: db $0F, $C7, $F8 //RDSEED EAX (CF = 1    ) jnc @Retry end; function RDRand64: QWord; asm .NOFRAME @Retry: db $48, $0F, $C7, $F0 //RDRAND RAX (CF = 1    ) jnc @Retry end; function RDSeed64: QWord; asm .NOFRAME @Retry: db $48, $0F, $C7, $F8 //RDSEED RAX (CF = 1    ) jnc @Retry end; 

فهي أبطأ في السرعة من وظيفة المكتبة عشوائية. RDRand حوالي 35 ٪ ، و RDSeed هو 50 ٪ أو أكثر ، ولكن جودة تفرد القيم التي تم إنشاؤها أعلى بكثير. هناك بعض المقالات الجيدة حول هذا الموضوع حول هذا المورد ، لكن مهمتي (لتوفير وظائف متوفرة في دلفي) قد اكتملت. لم أختبرها في لازاروس ، لكنها ستعمل على الأرجح دون أي تغييرات. في نهاية إعلان الوظيفة ، تحتاج فقط إلى إضافة أداة تجميع الكلمات الاحتياطية.

هنا هو شفرة المصدر لتطبيق وحدة الاختبار. هناك يمكنك العثور على نموذج أولي للوظائف Random32 و Random64 استنادًا إلى المعالج المضمن. ربما هذا هو ما كنت تبحث عنه. وداعا للجميع!

Source: https://habr.com/ru/post/ar441392/


All Articles