تكوين النواة

استخدم إعدادات التكوين التالية كقاعدة لتكوين 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. استخدم مجموعة ملفات التكوين التي تتوافق مع إصدار النواة الذي تستخدمه.

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

إنشاء تكوين النواة

بالنسبة للأجهزة التي تحتوي على تنسيق 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 الخفي

يتضمن 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 kernel الخاص بك عن طريق تمكين vDSO32 مع CONFIG_COMPAT و CONFIG_CROSS_COMPILE_COMPAT_VDSO مع المترجم الثلاثي Arm32. قام فريق Android Kernel بنقل الإصدارات الأقدم من سلسلة تصحيحات vDSO إلى أجهزة Pixel، بحيث يمكنك العثور على أمثلة في إصدارات Pixel kernel ( مسار LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN ومرجع CROSS_COMPILE_ARM32 وتكوين CONFIG_CROSS_COMPILE_ARM32 ).

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

قم بضبط kernel/ActivityManager لتقليل الاسترداد المباشر

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

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

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

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

يمكن تكوين هذه الحدود باستخدام إطار عمل 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>