تكوين النواة

استخدم إعدادات التكوين التالية كأساس لتكوين Android kernel. يتم تنظيم الإعدادات في ملفات .cfg لـ android-base و android-base- ARCH و android-recommended :

  • تعمل خيارات android-base تمكين ميزات Android الأساسية ويجب تهيئتها على النحو المحدد بواسطة جميع الأجهزة.
  • تعمل خيارات android-base- ARCH تمكين ميزات Android الأساسية ويجب تكوينها على النحو المحدد بواسطة جميع أجهزة الهندسة المعمارية ARCH . لا تحتوي جميع البنى على ملف مطابق للخيارات المطلوبة الخاصة بالعمارة. إذا لم يكن لدى العمارة الخاصة بك ملف ، فلن تحتوي على متطلبات تكوين kernel إضافية خاصة بالبنية لنظام Android.
  • android-recommended . تعمل هذه الخيارات على تمكين ميزات Android المتقدمة وهي اختيارية للأجهزة.

توجد ملفات التكوين هذه في kernel/configs repo. استخدم مجموعة ملفات التكوين التي تتوافق مع إصدار kernel الذي تستخدمه.

للحصول على تفاصيل حول عناصر التحكم التي تم إجراؤها بالفعل لتقوية النواة على أجهزتك ، راجع أمان النظام والنواة . للحصول على تفاصيل حول الإعدادات المطلوبة ، راجع مستند تعريف توافق Android (CDD) .

توليد تهيئة kernel

بالنسبة للأجهزة التي تحتوي على تنسيق defconfig مبسط ، استخدم البرنامج النصي merge_config.sh في شجرة kernel لتمكين الخيارات:

ARCH=ARCH scripts/kconfig/merge_config.sh <...>/device_defconfig <...>/android-base.cfg <...>/android-base-ARCH.cfg <...>/android-recommended.cfg

يؤدي هذا إلى إنشاء ملف .config يمكنك استخدامه لحفظ ملف defconfig جديد أو تجميع نواة جديدة مع تمكين ميزات Android.

متطلبات تكوين النواة الإضافية

في بعض الحالات ، يمكن لمشرف النظام الأساسي الاختيار من بين ميزات kernel المتعددة لتلبية تبعية Android. لا يمكن التعبير عن مثل هذه التبعيات في ملفات أجزاء تكوين kernel (الموضحة أعلاه) لأن تنسيق هذه الملفات لا يدعم التعبيرات المنطقية. في Android 9 والإصدارات الأحدث ، تتحقق مجموعة اختبار التوافق (CTS) ومجموعة اختبار البائع (VTS) من استيفاء المتطلبات التالية:

  • CONFIG_OF=y أو CONFIG_ACPI=y
  • 4.4 و 4.9 نواة لها CONFIG_ANDROID_LOW_MEMORY_KILLER=y أو تحتوي على كل من CONFIG_MEMCG=y و CONFIG_MEMCG_SWAP=y
  • CONFIG_DEBUG_RODATA=y أو CONFIG_STRICT_KERNEL_RWX=y
  • CONFIG_DEBUG_SET_MODULE_RONX=y أو CONFIG_STRICT_MODULE_RWX=y
  • بالنسبة لـ ARM64 فقط: CONFIG_ARM64_SW_TTBR0_PAN=y أو CONFIG_ARM64_PAN=y

بالإضافة إلى ذلك ، يجب تعيين خيار CONFIG_INET_UDP_DIAG على y لـ 4.9 نواة في Android 9 والإصدارات الأحدث.

قم بتمكين خيارات وضع مضيف USB

بالنسبة إلى صوت وضع مضيف USB ، قم بتمكين الخيارات التالية:

CONFIG_SND_USB=y
CONFIG_SND_USB_AUDIO=y
# CONFIG_USB_AUDIO is for a peripheral mode (gadget) driver

بالنسبة لوضع مضيف USB MIDI ، قم بتمكين الخيار التالي:

CONFIG_SND_USB_MIDI=y

Seccomp BPF مع TSYNC

Secure Computing Berkeley Packet Filter (Seccomp BPF) عبارة عن تقنية أمان kernel تتيح إنشاء صناديق الحماية التي تحدد السياق الذي قد تقوم فيه العملية بإجراء مكالمات النظام. تتيح ميزة مزامنة مؤشر الترابط (TSYNC) استخدام Seccomp BPF من البرامج متعددة مؤشرات الترابط. تقتصر هذه الإمكانية على البنى التي تحتوي على دعم Seccomp للتحميل (ARM و ARM64 و x86 و x86_64).

برنامج Android Live-Lock Daemon

يشتمل Android 10 على Android Live-Lock Daemon ( llkd ) ، والذي تم تصميمه للقبض على الجمود kernel والتخفيف من حدته. للحصول على تفاصيل حول استخدام llkd ، راجع برنامج Android Live-Lock Daemon .

vDSO32 على ARM64

الكائن الظاهري المشترك الديناميكي (vDSO) هو بديل لمكالمات النظام التي ، عند استخدامها وتكوينها بشكل صحيح ، يمكن أن تقلل من تكاليف الدورة. يضيف Android 10 دعمًا لـ vDSO32 على نواة 64 بت (يدعم Android بالفعل vDSO64 على نواة 64 بت و vDSO32 على نواة 32 بت). يوفر استخدام vDSO32 ( CONFIG_VDSO_COMPAT ) في بنية ARM64 زيادة بنسبة 0.4 في المائة في عمر البطارية وتحسينات أخرى في الأداء.

يعمل مجتمع Linux بنشاط على توحيد vDSOs عبر البنى . يمكنك إعداد vDSO في نواة Linux الخاصة بك عن طريق تمكين vDSO32 مع CONFIG_COMPAT و CONFIG_CROSS_COMPILE_COMPAT_VDSO مع مجموعة ثلاثية لمجمع arm32. قام فريق Android Kernel بنقل الإصدارات الأقدم من سلسلة التصحيح vDSO إلى أجهزة Pixel ، لذلك يمكنك العثور على أمثلة في إصدارات Pixel kernel ( LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN path ، CROSS_COMPILE_ARM32 ، و CONFIG_CROSS_COMPILE_ARM32 ).

تكوين ذاكرة الوصول العشوائي المنخفضة

لحن kernel / ActivityManager لتقليل الاسترداد المباشر

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

لتجنب الاسترداد المباشر ، تحتوي النواة على علامات مائية تؤدي إلى kswapd أو استعادة الخلفية. هذا هو الخيط الذي يحاول تحرير الصفحات بحيث في المرة التالية التي يتم فيها تخصيص خيط حقيقي ، يمكن أن ينجح بسرعة.

الحد الأدنى الافتراضي لتشغيل استعادة الخلفية منخفض إلى حد ما ، حيث يبلغ حوالي 2 ميجابايت على جهاز بسعة 2 جيجابايت و 636 كيلو بايت على جهاز بسعة 512 ميجابايت. تستعيد النواة بضعة ميغا بايت فقط من الذاكرة في استعادة الخلفية. هذا يعني أن أي عملية تخصص بسرعة أكثر من بضعة ميغا بايت ستصل بسرعة إلى استرداد مباشر.

تمت إضافة دعم kernel tunable في فرع kernel Android-3.4 كـ patch 92189d47f66c67e5fd92eafaa287e153197a454f ("أضف كيلو بايتات مجانية إضافية قابلة للضبط"). يسمح اختيار Cherry لهذا التصحيح إلى نواة الجهاز لـ ActivityManager بإخبار النواة بمحاولة الاحتفاظ بثلاث مخازن مؤقتة بملء الشاشة 32 bpp خالية من الذاكرة.

يمكن تكوين هذه الحدود باستخدام إطار عمل config.xml .

<!-- Device configuration setting the /proc/sys/vm/extra_free_kbytes tunable
in the kernel (if it exists). A high value will increase the amount of memory
that the kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier. A low value allows more memory to be used by
processes but may cause more allocations to block waiting on disk I/O or
lowmemorykiller. Overrides the default value chosen by ActivityManager based
on screen size. 0 prevents keeping any extra memory over what the kernel keeps
by default. -1 keeps the default. -->
<integer name="config_extraFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the /proc/sys/vm/extra_free_kbytes
tunable in the kernel (if it exists). 0 uses the default value chosen by
ActivityManager. A positive value will increase the amount of memory that the
kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier. A negative value allows more memory to be
used by processes but may cause more allocations to block waiting on disk I/O
or lowmemorykiller. Directly added to the default value chosen by
ActivityManager based on screen size. -->
<integer name="config_extraFreeKbytesAdjust">0</integer>

لحن LowMemoryKiller

يقوم ActivityManager بتكوين عتبات LowMemoryKiller لمطابقة توقعاته الخاصة بمجموعة العمل من الصفحات المدعومة بالملفات (الصفحات المخزنة مؤقتًا) المطلوبة لتشغيل العمليات في كل مجموعة من مستويات الأولوية. إذا كان للجهاز متطلبات عالية لمجموعة العمل ، على سبيل المثال إذا كانت واجهة المستخدم الخاصة بالمورد تتطلب ذاكرة أكبر أو إذا تمت إضافة المزيد من الخدمات ، فيمكن زيادة العتبات.

يمكن تقليل العتبات إذا تم حجز قدر كبير جدًا من الذاكرة للصفحات المدعومة بالملفات ، بحيث يتم إيقاف عمليات الخلفية قبل وقت طويل من حدوث تحطم القرص بسبب صغر حجم ذاكرة التخزين المؤقت.

<!-- Device configuration setting the minfree tunable in the lowmemorykiller
in the kernel. A high value will cause the lowmemorykiller to fire earlier,
keeping more memory in the file cache and preventing I/O thrashing, but
allowing fewer processes to stay in memory. A low value will keep more
processes in memory but may cause thrashing if set too low. Overrides the
default value chosen by ActivityManager based on screen size and total memory
for the largest lowmemorykiller bucket, and scaled proportionally to the
smaller buckets. -1 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the minfree tunable in the
lowmemorykiller in the kernel. A high value will cause the lowmemorykiller to
fire earlier, keeping more memory in the file cache and preventing I/O
thrashing, but allowing fewer processes to stay in memory. A low value will
keep more processes in memory but may cause thrashing if set too low. Directly
added to the default value chosen by ActivityManager based on screen
size and total memory for the largest lowmemorykiller bucket, and scaled
proportionally to the smaller buckets. 0 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAdjust">0</integer>