كمبرمج، ماذا علي أن تقلق بشأنه عند الانتقال إلى Windows 64 بت؟

StackOverflow https://stackoverflow.com/questions/544296

  •  23-08-2019
  •  | 
  •  

سؤال

تم معظم برامجي الأخيرة على Windows 32 بت باستخدام C / C ++ / C # / VB6. في الآونة الأخيرة، يسأل عملاي عما إذا كان الرمز الخاص بي سيعمل على Windows 64 بت.

أنا أتساءل ما هي الميزات القديمة التي قد أستخدمها التي ستستفيد من 64 بت؟ ما هي بعض قضايا العالم الحقيقي التي أحتاج إلى التفكير والقلق؟

من الواضح أنني سأختبر التعليمات البرمجية الخاصة بي على نظام التشغيل 64 بت، ولكن أود أن أعرف ما هي المشكلات المشتركة للبحث عنها. أنا أكثر اهتماما بالثناء الحاليين، لكنني منفتح على التعليقات حول ما يدعو للقلق عند إعادة ترجمة (حيثما أمكن).

تحرير: هنا هو قائمة لطيفة من البق تيار 64 بت.

نصائح أخرى

بقدر ما أشعر بالقلق، الشيء الوحيد الأكثر أهمية حول Porting C / C ++ رمز إلى Windows 64 بت هو اختبار طلبك مع MEM_TOP_DOWN مخصصات تمكين (AllocationPreference قيمة التسجيل) كما هو موضح في ضبط 4 غيغابايت:

لفرض المخصصات على تخصيص من عناوين أعلى قبل انخفاض العناوين لأغراض الاختبار، حدد MEM_TOP_DOWN عند الاتصال VirtualAlloc أو تعيين قيمة التسجيل التالية إلى 0x100000:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Memory Management\AllocationPreference

متى هذا الأمر؟

  • إذا كان لديك exes 32 بت الموجودة تم بناؤها مع /LARGEADDRESSAWARE خيار Linker MSVC (أو الذي لديك IMAGE_FILE_LARGE_ADDRESS_AWARE العلم المحدد في رؤوس PE الخاصة بهم من خلال وسائل أخرى، مثل editbin.exe)، ثم يحصلون على مساحة العنوان الافتراضية الكاملة 4 جيجابايت كاملة في نوافذ 64 بت، ويجب عليك اختبارها مع AllocationPreference مجموعة قيمة التسجيل.
  • إذا كان لديك DLL أجهزة DLL 32 بت الموجودة التي قد يتم تحميلها عن طريق إخراج عنوان كبير، يجب عليك اختبارها AllocationPreference مجموعة قيمة التسجيل.
  • إذا قمت بإعادة ترجمة رمز C / C ++ الخاص بك إلى EXE 64 بت أو DLL، يجب عليك اختبار ذلك مع AllocationPreference مجموعة قيمة التسجيل.

إذا كان تطبيق C / C ++ يقع في إحدى هذه الفئات الثلاث ولا يمكنك الاختبار MEM_TOP_DOWN مخصصات، الاختبار من غير المرجح أن تلتقط أي أخطاء مؤشر اقتطاع / إشعال في التعليمات البرمجية الخاصة بك.

ثاني أهم شيء، إذا كنت تستخدم MSVC وأنت تعيد ترجمة رمز C / C ++ ل 64 بت، هو استخدم ال /Wp64 برنامج التحويل البرمجي الخاص بك 64 بت يبني:

  • سيؤدي ذلك إلى أن برنامج التحويل البرمجي ينبعث من التحذيرات من أجل الطبقات التي اقتطاع المؤشرات أو تمديد أنواع جزءا لا يتجزأ أصغر في المؤشرات (حتى عندما reinterpret_cast أو يتم استخدام صفة نمط C)، بالإضافة إلى عدد قليل من مشكلات التنفيذ 64 بت الأخرى.
  • نعم، توثيق يقول ذلك بدلا من تجميع مع /Wp64 يجب عليك استخدام مترجم يستهدف منصة 64 بت، ولكن هذا وحده لن يمسك مشكلات اقتطاع المؤشر / التمديد في وقت الترجمة. باستخدام مترجم يستهدف 64 بت و تمكين /Wp64 سيؤدي خيار التحويل البرمجي إلى إنشاء العديد من مشاكل اقتطاع / تمديد المؤشرات في وقت الترجمة، وسيوفر لك هذا الوقت على المدى الطويل.
  • لسوء الحظ، مع MSVC 2008، سينتج هذا أيضا "تحذير سطر الأوامر" لكل وحدة ترجمة تقول ذلك /Wp64 يتم إهمال الخيار. أستطيع أن أرى لماذا يتم إهمال الخيار لبناء 32 بت (حيث يكون الاختراق الشرير يتطلب التسجيل العديد من Typedefs)، ولكن من المؤسف أنه يتم إهماله أيضا لعمليات 64 بت (حيث يكون مفيدا بالفعل).

قد يكون من الأسهل ترحيل رمز .NET إذا كان لديك 100٪ "نوع رمز مدار آمن". يمكنك فقط نسخها إلى منصة 64 بت وتشغيلها بنجاح تحت CLR 64 بت. افحص هذا MSDN Link. على ترحيل الكود المدارة 32 بت إلى 64 بت.

راجع للشغل، هانسلان مدون حول الموضوع مؤخرا.

إذا كنت تتحدث عن برامج 32 بت، فلن يكون لديك أي شيء يدعو للقلق عمليا لأن نظام التشغيل Windows 64 سيقوم بتشغيلها تحت مضاهاة 32 بت. من المحتمل أن تكون أي مشاكل في إصدارات Windows المستقبلية (مثل نظام التشغيل Windows 7) غير توافقات بدلا من المشكلات التي تحتوي على نظام تشغيل 64 بت.

ومع ذلك، إذا تم تجميع التعليمات البرمجية المدارة الخاصة بك من النظام الأساسي المستهدف "أي وحدة المعالجة المركزية"، وتجري مكالمات إلى رمز غير مدار (مثل Pinvoke)، أو تعتمد على التجميعات الأخرى، فهناك بعض الأشياء التي يجب أن تكون على دراية بها. سكوت هانسلان بريد حول CLR X86 / X64 يغطي هذا وهو شرح جيد ل CLR على Win32 / 64.

عند تطوير البرامج الأصلية 64 بت ثم دليل البرمجة لنظام Windows 64 بت هو دليل جيد. يأتي إلى حد كبير إلى المؤشرات وحجم أنواع البيانات :)

سيتم تشغيل برامج 32 بت بخير على نوافذ 64 بت. طالما أنك لا تفعل أي نوع من تنمية سائق الجهاز بالطبع.

إذا قمت بتجميع برنامجك كبرنامج 64 بت في المرة الأولى، تحتاج إلى رعاية التالية:

  • مؤشر هو 64 بت واسعة، في حين أن INT هو 32 بت. لا تقم بتخزين المؤشرات في Ints، سوف يكسر الكود الخاص بك.
  • عملية 64 بت تحتاج إلى 64 بت dlls. إذا كنت تعتمد على الجزء الثالث DLLs، فتأكد من توفيرها أيضا في 64 بت. إذا كنت بحاجة إلى التواصل بين عملية 32 بت وعملة 64 بت، فستحتاج إلى بعض الطرق المختلفة المختلفة ل IPC على Windows. وظائف الاتصال مباشرة غير وظائف.
  • تختلف أدلة النظام على نوافذ 64 بت عن نوافذ 32 بت. إذا كان لديك بعض المسارات المشفرة الثابت، فقد تحتاج إلى التحقق منها مرة أخرى.

إذا قمت بحقنة DLL لأي سبب، فستحصل على مشكلة.

من وجهة نظر C / C ++ ....

شيء واضح واضح هو أن حجم Int سيصبح 8 بايت بدلا من 4 بايت. إذا كان أي من التعليمات البرمجية يعتمد على ذلك قد تحصل على نتائج غير متوقعة. الهيكل والمحاذاة المتغيرة قد تحول. قد تكون قادرا على التغلب على حزمة #Pragma، لكنني لست بطلاقة للغاية في المحاذاة والتعبئة.

إذا كنت تستخدم أي نقابات مع Ints لهم، فقد يتغير السلوك.

إذا كنت تستخدم أي هياكل Bitfield، بناء على INTS قد تسبب 32 بت إضافية. لن يكون بت تسجيل الدخول حيث كنت تعتقد أنه كان.

إذا قمت بترميز أي ثوابت عرافة ونتوقع علامات السلبية، فقد تواجه مشكلات. مثال 0x8000000 هو رقم سلبي كجلد، أو عدد صحيح 32 بت. 0x80000000 كعدد صحيح على منصة 64 بت هو رقم إيجابي. لتعيين بت تسجيل الدخول مباشرة، يجب عليك استخدام 0x80000000 00000000 (مساحة مضمنة للقراءة فقط)

كما أتوقع أن ينمو الحجم المناسب بشكل مناسب. إذا كنت تقوم بأي مخصصات بناء على Max_int، فستكون أكبر بكثير.

لتجنب هذا النوع من الحالات الشاذة الحجم، أنا عصا عموما مع أوقات طويلة بدلا من Ints.

هو مضاهاة 32 بت حقا دليل رصاصة؟ لقد رأيت أن السجل يتم وضعه بطريقة مختلفة قليلا. أنا فقط أتساءل ما الأشياء النموذجية لا تعمل ...

أيضا، يمكن أن يحتوي الدليل C: Windows System32 فقط أن يحتوي فقط على DLLS 64 بت. إذا كان لديك DLL 32 بت، فأنت بحاجة إلى وضعه في C: Windows SYSWOW64

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top