
على افتراض عدم وجود اعتراضات من قبل Linus Torvalds ، فقد تم تقديم طلب سحب مبكر للمقبل Linux 6.17 دمج نافذة لمعالجة قيود kernel الغامضة التي كانت سارية في مكانها إلى عام 1993 خلال أيام kernel Linux v0.99.
تم الإبلاغ عن مهندس Linux الذي يعمل في Alibaba مؤخرًا عن ملف تجميع تم إنشاؤه بواسطة البرنامج النصي والذي عند إنشائه بواسطة برنامج التحويل البرمجي لجامعة GCC وتشغيله كملف ELF قد يسبب مشاكل غريبة. قد يفشل ملف ELF هذا على Linux AARCH64/ARM64 إذا كان يستخدم kernel القياسي حجم صفحة 4K بسبب “خطأ تنسيق exec”. ولكن إذا كنت تستخدم حجم صفحة 64k الحديث لـ ARM64، هذا ملف قزم سيعمل بشكل جيد.
مهندس علي بابا ذُكر كان ذلك ضمن إحدى وظائف التحميل ELF في kernel فحصًا لمعرفة ما إذا كان الحجم أكبر من elf_min_align / page_size وإنقاذ ما إذا كان هذا هو الحال ، والذي تم إعطاؤه عدد رؤوس البرنامج في ملف ELF هذا. ولكن لم يكن واضحا لماذا كان هذا الشيك في مكانه. إذا كانت إزالة هذا kernel ، تحقق من أن الملف الثنائي الخاص يعمل بشكل جيد على kernel بحجم صفحة 4K.
حفر مطور Linux Linux Linux Cook من خلال الكود القديم قبل الوطن لمحاولة اكتشافه. هو أوضح:
“النظر من خلال https://git.kernel.org/pub/scm/linux/kernel/git/history/history.git (الذي لا يحتوي على تاريخ مرتبط ، لذلك عليك فحص” ما قبل git “الصريح) ، أرى:
4779B38BCB96 (“((Patch) Linux-0.99.13 (19 سبتمبر 1993)”) التي تقول “ELF Binary Support It Change. هنا ، page_size
تحقق غير موجود. عندما تمت إضافة دعم elf interp في 9e11983a5a3e (“استيراد 0.99.15F”) ، نرى الشيك يظهر ، وأستطيع
لا تجد الأساس المنطقي.ومع 6A8D38945CF4 (“BINFMT_ELF: قم بتحميل رأس برنامج ELF إلى دالة”) ، فإن التحقق من Page_size هو _added_ للأحمال غير الموروثة.
يبدو أن الحد الأقصى لعدد 64 كيلو كافي؟ (إذا كان الهدف هو تجنب تخصيصات الذاكرة الكبيرة التي تحدث من مساحة المستخدمين ، فإننا نتجاوز page_size هذه الأيام بين IPC و BPF ، وما إلى ذلك) هل هذا يعمل من أجلك؟ “
حتى الآن من أجل Linux 6.17 رقعة لإسقاط القيود 4K لحجم رأس البرنامج.
“لدينا رمز التجميع الذي تم إنشاؤه بواسطة برنامج نصي. يقوم GCC بنجاح بتجميعه. ومع ذلك ، لا يمكن لـ kernel تحميلها على منصة ARM64 بحجم صفحة 4K. على النقيض من ذلك ، يتم تحميل ملف ELF نفسه بشكل صحيح على نفس النظام الأساسي بحجم صفحة 64 كيلو متر.
السبب الجذري هو قيود Linux kernel ELF_MIN_ALIGN على رؤوس برنامج ملفات ELF. يحتوي ملف ELF على 78 رأسًا للبرنامج (يقوم البرنامج النصي بإدراج العديد من الثقوب عند إنشاء رمز التجميع). على ARM64 بحجم صفحة 4K ، يفرض ELF_MIN_ALLIGN كحد أقصى 74 رأسًا للبرنامج ، مما تسبب في فشل ملف ELF. ومع ذلك ، مع حجم صفحة 64 كيلو بايت ، يتم استرخاء elf_min_align لأكثر من 1،184 رأسًا للبرنامج ، مما يسمح للملف بالتشغيل بشكل صحيح.
حدد Cook بلطف أن هذا القيد تم تقديمه في Linux-0.99.15F دون تفسير لغرضه.
لا تفرض مواصفات ELF مثل هذا التقييد على رؤوس البرنامج. إزالة قيود elf_min_align على رؤوس البرنامج للتوافق مع مواصفات ELF. بعد إزالة القيد ELF_MIN_ALIGN ، لا يزال الحد من حجم 64 كيلو كافيًا. “
تم إرسال هذا التصحيح كجزء من التغييرات execve ل Linux 6.17. على افتراض عدم وجود مشكلات تم اكتشافها من Linus Torvalds بنفسه ، يجب دمج هذا الإصلاح بمجرد فتح نافذة دمج Linux 6.17 … والتي ستكون بمجرد الاثنين على افتراض أن Linux 6.16 يذهب كما هو مخطط له يوم الأحد.
اترك تعليقاً