تقدّم هذه الصفحة نصائح لتحسين وقت بدء التشغيل.
إزالة رموز تصحيح الأخطاء من الوحدات
على غرار طريقة إزالة رموز تصحيح الأخطاء من النواة على جهاز الإصدار العلني، تأكَّد أيضًا من إزالة رموز تصحيح الأخطاء من الوحدات. يساعد إزالة رموزال تصحيح الأخطاء من الوحدات في تقليل وقت التشغيل من خلال تقليل ما يلي:
- الوقت الذي تستغرقه قراءة البرامج الثنائية من flash.
- الوقت الذي يستغرقه فك ضغط ملف ramdisk
- المدة التي يستغرقها تحميل الوحدات
قد يؤدي إزالة رمز تصحيح الأخطاء من الوحدات إلى توفير عدة ثوانٍ أثناء التشغيل.
يكون خيار إزالة الرموز مفعَّلاً تلقائيًا في إصدار نظام التشغيل Android، ولكن
لتفعيله صراحةً، اضبط
BOARD_DO_NOT_STRIP_VENDOR_RAMDISK_MODULES
في الإعدادات الخاصة بالجهاز
ضمن device/vendor/device.
استخدام ضغط LZ4 للنواة وذاكرة التخزين المؤقت
يُنشئ Gzip ملفًا أصغر حجمًا مقارنةً بـ LZ4، ولكن LZ4 يُفكّ ضغطه بشكل أسرع من Gzip. بالنسبة إلى النواة والوحدات، فإنّ الانخفاض المطلق في حجم مساحة التخزين نتيجة استخدام Gzip ليس كبيرًا مقارنةً بفائدة وقت إلغاء الضغط التي يوفّرها LZ4.
تمت إضافة ميزة ضغط LZ4 لشريحة ذاكرة الوصول العشوائي (RAM) إلى نظام Android
الإصدار BOARD_RAMDISK_USE_LZ4
والإصدارات اللاحقة. يمكنك ضبط هذا الخيار في
الإعدادات الخاصة بالجهاز. يمكن ضبط ضغط النواة من خلال إعداد kernel defconfig.
من المفترض أن يؤدي التبديل إلى LZ4 إلى تقليل وقت التشغيل بمقدار 500 إلى 1,000 ملي ثانية.
تجنَّب التسجيل المفرط في برامج التشغيل
في ARM64 وARM32، تحتاج استدعاءات الدوال التي تكون أبعد من مسافة محددة من موقع الاتصال إلى جدول انتقال (يُعرف باسم جدول ربط الإجراءات أو PLT) حتى تكون قادرة على ترميز عنوان الانتقال الكامل. نظرًا لتحميل الوحدات ديناميكيًا، يجب إصلاح جداول الانتقال هذه أثناء تحميل الوحدة. تُعرف المكالمات التي تحتاج إلى إعادة التعيين باسم إدخالات إعادة التعيين التي تحتوي على ملحقَين واضحَين (أو RELA اختصارًا) في تنسيق ELF.
يُجري نواة Linux بعض تحسينات حجم الذاكرة (مثل تحسين عمليات الاستفادة من ذاكرة التخزين المؤقت) عند تخصيص جدول البحث في الذاكرة. مع الالتزام الرئيسي هذا، ينطوي مخطط التحسين على مستوى تعقيد O(N^2)
، حيث يمثّل N
عدد روابط RELA من النوع R_AARCH64_JUMP26
أو R_AARCH64_CALL26
. لذا، من المفيد تقليل عدد RELAs
من هذه الأنواع لتقليل وقت تحميل الوحدة.
من أنماط الترميز الشائعة التي تزيد من عدد RELAs
R_AARCH64_CALL26
أو R_AARCH64_JUMP26
هو التسجيل المفرط في
driver. تُضيف كلّ مكالمة إلى printk()
أو أيّ مخطّط تسجيل آخر عادةً إدخال CALL26
/JUMP26
RELA. في نص الالتزام في أعلى الصفحة،
لاحِظ أنّه حتى مع عملية التحسين، يستغرق تحميل الوحدات الست حوالي 250 ملي ثانية، وذلك لأنّ هذه الوحدات الست كانت أعلى ست وحدات تتضمّن
أكبر قدر من عمليات التسجيل.
يمكن أن يؤدي تقليل التسجيل إلى توفير 100 إلى 300 ملي ثانية في أوقات التشغيل، وذلك استنادًا إلى مدى كثرة التسجيلات الحالية.
تفعيل الاستقصاء غير المتزامن، بشكل انتقائي
عند تحميل وحدة، إذا سبق أن تمت تعبئة الجهاز المتوافق معها
من DT (شجرة الأجهزة) وإضافته إلى نواة برنامج التشغيل، يتم إجراء عملية فحص
الجهاز في سياق طلب module_init()
. عند إكمال عملية فحص الجهاز
في سياق module_init()
، لا يمكن للوحدة إكمال تحميلها إلا بعد اكتمال عملية الفحص. ونظرًا لأن تحميل الوحدة تتم بشكل متسلسل في الغالب، يؤدي الجهاز الذي يستغرق وقتًا طويلاً نسبيًا للتحقق من ذلك إلى إبطاء وقت التشغيل.
لتجنُّب زيادة وقت التشغيل، فعِّل الاستكشاف غير المتزامن للوحدات التي تستغرق وقتًا في فحص أجهزتها. قد لا يكون تفعيل الاستكشاف غير المتزامن لجميع الوحدات مفيدًا لأنّ الوقت الذي يستغرقه إنشاء سلسلة محادثات فرعية وبدء الفحص قد يكون مساويًا للوقت الذي يستغرقه فحص الجهاز.
يمكن أن تؤدي الأجهزة المتصلة من خلال ناقل بطيء مثل I2C والأجهزة التي تُجري عملية تحميل الثابت في وظيفة التحقيق والأجهزة التي تُجري الكثير من عمليات بدء تشغيل الأجهزة إلى حدوث مشكلة في التوقيت. أفضل طريقة لتحديد وقت حدوث ذلك هي جمع وقت التحقيق لكل سائق وفرزه.
لتفعيل الاستكشاف غير المتزامن لوحدة، لا يكفي فقط
ضبط العلامة PROBE_PREFER_ASYNCHRONOUS
في رمز برنامج التشغيل. بالنسبة إلى الوحدات، عليك أيضًا إضافة
module_name.async_probe=1
في سطر أوامر kernel
أو تمرير async_probe=1
كمَعلمة وحدة عند تحميل الوحدة باستخدام
modprobe
أو insmod
.
يمكن أن يؤدي تفعيل الاستكشاف غير المتزامن إلى توفير 100 إلى 500 ملي ثانية في أوقات التشغيل حسب الأجهزة أو برامج التشغيل.
افحص برنامج تشغيل CPUfreq في أقرب وقت ممكن
كلما أسرعت في التحقق من برنامج تشغيل CPUfreq، أصبح بإمكانك تقليص معدّل تكرار وحدة المعالجة المركزية (CPU) إلى أقصى حدّ (أو حدّ أقصى مقيَّدًا حراريًا) بشكل أسرع أثناء التشغيل. كلما كانت
وحدة المعالجة المركزية أسرع، كان البدء أسرع. ينطبق هذا الإرشاد أيضًا على devfreq
برامج التشغيل التي تتحكّم في ذاكرة الوصول العشوائي (DRAM) والذاكرة ومعدّل تكرار الربط.
في ما يتعلّق بالوحدات، يمكن أن يعتمد ترتيب التحميل على مستوى initcall
و
ترتيب تجميع أو ربط برامج التشغيل. استخدِم الاسم المعرِّف MODULE_SOFTDEP()
للتأكّد من أنّ برنامج تشغيل cpufreq
من بين أوّل الوحدات القليلة التي يتم تحميلها.
بالإضافة إلى تحميل الوحدة في وقت مبكر، عليك أيضًا التأكّد من فحص جميع التبعيات لفحص برنامج تشغيل CPUfreq. على سبيل المثال، إذا كنت تحتاج إلى مقبس ساعة أو وحدة تحكّم للتحكّم في معدّل تكرار وحدة المعالجة المركزية، تأكَّد أولاً من فحصهما. أو قد تحتاج إلى تحميل برامج تشغيل حرارية قبل برنامج تشغيل CPUfreq إذا كان من الممكن أن تصبح وحدات المعالجة المركزية (CPU) ساخنة جدًا أثناء عملية التمهيد. لذا، افعل ما بوسعك للتأكد من فحص CPUfreq وبرامج تشغيل devfreq في أسرع وقت ممكن.
يمكن أن تتراوح الفوائد الناتجة عن فحص برنامج تشغيل CPUfreq في وقت مبكر بين صغيرة جدًا وكبيرة جدًا، وذلك استنادًا إلى الوقت الذي يمكنك فيه إجراء هذا الفحص ومعدّل تكرار ترك مُشغِّل الإقلاع لوحدات المعالجة المركزية في وضع التشغيل.
نقل الوحدات إلى قسم "الإعداد في المرحلة الثانية" أو "المورّد" أو "vendor_dlkm"
ولأنّ عملية البدء في المرحلة الأولى تكون متسلسلة، لا تتوفّر العديد من
فرص لإجراء عملية التمهيد بشكل موازٍ. إذا لم تكن الوحدة مطلوبة لإكمال مرحلة الإعداد الأولى، يمكنك نقلها إلى مرحلة الإعداد الثانية من خلال وضعها في قسم vendor أو vendor_dlkm
.
لا تتطلّب عملية الإعداد في المرحلة الأولى فحص عدة أجهزة للوصول إلى مرحلة الإعداد الثانية. لا يلزم سوى إمكانات وحدة التحكّم والتخزين الفلاشي لبدء عملية التمهيد بشكلٍ طبيعي.
حمِّل برامج التشغيل الأساسية التالية:
watchdog
reset
cpufreq
في وضع الاسترداد ووضع fastbootd
لمساحة المستخدم، تتطلّب المرحلة الأولى من بدء التشغيل المزيد من
الأجهزة التي يتم فحصها (مثل USB) والشاشة. احتفظ بنسخة من هذه الوحدات في
شريحة الذاكرة العشوائية للتشغيل في المرحلة الأولى وفي قسم vendor أو vendor_dlkm
. يتيح ذلكتحميلها في مرحلة الإعداد الأولى للاسترداد أو fastbootd
عملية التمهيد. ومع ذلك،
لا تحمِّل وحدات وضع الاسترداد في مرحلة الإعداد الأولى أثناء عملية التمهيد العادية. يمكن تأجيل وحدات وضع الاسترداد إلى مرحلة الإعداد الثانية لتقليل
وقت التشغيل. يجب نقل جميع الوحدات الأخرى غير المطلوبة في مرحلة الإعداد الأولى
إلى قسم المورّد أو vendor_dlkm
.
استنادًا إلى قائمة بالأجهزة الطرفية (مثل UFS أو الجهاز التسلسلي)، يعثر dev needs.sh
النص البرمجي على جميع برامج التشغيل والأجهزة والوحدات اللازمة للعناصر المُستندة إليها أو
المزوّدين (مثل الساعات أو المنظمات أو gpio
) للفحص.
يؤدي نقل الوحدات إلى مرحلة التشغيل الثانية إلى تقليل أوقات التشغيل بالطُرق التالية:
- تقليل حجم ذاكرة التخزين المؤقت في ذاكرة الوصول العشوائي
- يؤدي ذلك إلى قراءة ذاكرة فلاش بشكل أسرع عندما يحمِّل مشغِّل التحميل ملف ramdisk (خطوة التمهيد التسلسلي).
- ويؤدي ذلك إلى سرعات فك ضغط أسرع عندما تفكّ النواة ضغط ملف ramdisk (خطوة التمهيد التسلسلي).
- تعمل مرحلة الإعداد الثانية بشكل موازٍ، ما يخفي وقت تحميل الوحدة مع العمل الذي يتم تنفيذه في مرحلة الإعداد الثانية.
يمكن أن يؤدي نقل الوحدات إلى المرحلة الثانية إلى توفير من 500 إلى 1000 ملي ثانية في أوقات التشغيل، وذلك استنادًا إلى عدد الوحدات التي يمكنك نقلها إلى مرحلة الإعداد الثانية.
الخدمات اللوجستية لتحميل الوحدات
يتضمن أحدث إصدار من Android إعدادات لوحة التحكّم التي تتحكّم في الوحدات التي يتم نسخها إلى كل مرحلة والوحدات التي يتم تحميلها. يركز هذا القسم على المجموعة الفرعية التالية:
BOARD_VENDOR_RAMDISK_KERNEL_MODULES
. هذه قائمة الوحدات التي سيتم نسخها إلى أداة تخزين مؤقت في ذاكرة الوصول العشوائي.BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD
. هذه قائمة بالوحدات التي سيتم تحميلها في مرحلة الإعداد الأولى.BOARD_VENDOR_RAMDISK_RECOVERY_KERNEL_MODULES_LOAD
. قائمة الوحدات هذه التي سيتم تحميلها عند اختيار الاسترداد أوfastbootd
من ذاكرة الوصول العشوائي.BOARD_VENDOR_KERNEL_MODULES
. هذه قائمة الوحدات التي سيتم نسخها إلى ملف التمهيد أو قسمvendor_dlkm
في الدليل/vendor/lib/modules/
.BOARD_VENDOR_KERNEL_MODULES_LOAD
. هذه قائمة بالوحدات التي سيتم تحميلها في مرحلة الإعداد الثانية.
يجب أيضًا نسخ وحدات التمهيد والاسترداد في ذاكرة التخزين المؤقت إلى قسم المورّد أو
vendor_dlkm
في /vendor/lib/modules
. إنّ نسخ هذه الوحدات إلى
قسم المورّد يضمن عدم إخفاء الوحدات أثناء بدء المرحلة الثانية،
وهو أمر مفيد لتصحيح الأخطاء وجمع modinfo
لإعداد تقارير الأخطاء.
من المفترض أن يشغل النسخ مساحة صغيرة على قسم المورّد أو vendor_dlkm
القسم
ما دامت مجموعة وحدات التمهيد قد تم تصغيرها إلى الحد الأدنى. تأكَّد من أنّ ملف العميل
modules.list
يحتوي على قائمة مفلتَرة بالوحدات في /vendor/lib/modules
.
تضمن القائمة التي تمّت فلترتها عدم تأثُّر أوقات التشغيل بتحميل الوحدات مجددًا (وهي عملية مكلفة).
تأكَّد من تحميل وحدات وضع الاسترداد كمجموعة. يمكن تحميل وحدات وضع الاسترداد في وضع الاسترداد أو في بداية المرحلة الثانية init في كل عملية تشغيل.
يمكنك استخدام ملفات Board.Config.mk
على الجهاز لتنفيذ هذه الإجراءات كما هو موضّح في المثال التالي:
# All kernel modules
KERNEL_MODULES := $(wildcard $(KERNEL_MODULE_DIR)/*.ko)
KERNEL_MODULES_LOAD := $(strip $(shell cat $(KERNEL_MODULE_DIR)/modules.load)
# First stage ramdisk modules
BOOT_KERNEL_MODULES_FILTER := $(foreach m,$(BOOT_KERNEL_MODULES),%/$(m))
# Recovery ramdisk modules
RECOVERY_KERNEL_MODULES_FILTER := $(foreach m,$(RECOVERY_KERNEL_MODULES),%/$(m))
BOARD_VENDOR_RAMDISK_KERNEL_MODULES += \
$(filter $(BOOT_KERNEL_MODULES_FILTER) \
$(RECOVERY_KERNEL_MODULES_FILTER),$(KERNEL_MODULES))
# ALL modules land in /vendor/lib/modules so they could be rmmod/insmod'd,
# and modules.list actually limits us to the ones we intend to load.
BOARD_VENDOR_KERNEL_MODULES := $(KERNEL_MODULES)
# To limit /vendor/lib/modules to just the ones loaded, use:
# BOARD_VENDOR_KERNEL_MODULES := $(filter-out \
# $(BOOT_KERNEL_MODULES_FILTER),$(KERNEL_MODULES))
# Group set of /vendor/lib/modules loading order to recovery modules first,
# then remainder, subtracting both recovery and boot modules which are loaded
# already.
BOARD_VENDOR_KERNEL_MODULES_LOAD := \
$(filter-out $(BOOT_KERNEL_MODULES_FILTER), \
$(filter $(RECOVERY_KERNEL_MODULES_FILTER),$(KERNEL_MODULES_LOAD)))
BOARD_VENDOR_KERNEL_MODULES_LOAD += \
$(filter-out $(BOOT_KERNEL_MODULES_FILTER) \
$(RECOVERY_KERNEL_MODULES_FILTER),$(KERNEL_MODULES_LOAD))
# NB: Load order governed by modules.load and not by $(BOOT_KERNEL_MODULES)
BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := \
$(filter $(BOOT_KERNEL_MODULES_FILTER),$(KERNEL_MODULES_LOAD))
# Group set of /vendor/lib/modules loading order to boot modules first,
# then the remainder of recovery modules.
BOARD_VENDOR_RAMDISK_RECOVERY_KERNEL_MODULES_LOAD := \
$(filter $(BOOT_KERNEL_MODULES_FILTER),$(KERNEL_MODULES_LOAD))
BOARD_VENDOR_RAMDISK_RECOVERY_KERNEL_MODULES_LOAD += \
$(filter-out $(BOOT_KERNEL_MODULES_FILTER), \
$(filter $(RECOVERY_KERNEL_MODULES_FILTER),$(KERNEL_MODULES_LOAD)))
يعرض هذا المثال مجموعة فرعية أسهل في الإدارة من BOOT_KERNEL_MODULES
و
RECOVERY_KERNEL_MODULES
لتحديدها محليًا فيملفّات ملفّات برمجة اللوحة. يعثر النص البرمجي السابق على كل وحدة من وحدات المجموعة الفرعية من
وحدات kernel المتاحة المحدّدة ويملؤها، ويترك الوحدات المتبقية لبدء الخطوة
الثانية.
بالنسبة إلى عملية الإعداد في المرحلة الثانية، ننصح بتشغيل تحميل الوحدة كخدمة كي لا تحظر عملية التشغيل. استخدِم نصًا برمجيًا لنظام التشغيل لإدارة تحميل الوحدات كي تتمكّن من الإبلاغ عن العمليات اللوجستية الأخرى، مثل معالجة الأخطاء والحدّ منها أو اكتمال تحميل الوحدات (أو تجاهلها) إذا لزم الأمر.
يمكنك تجاهل خطأ في تحميل وحدة تصحيح الأخطاء لا يظهر في إصدارات المستخدمين.
لتجاهل هذا الخطأ، اضبط السمة vendor.device.modules.ready
على
تفعيل المراحل اللاحقة من عملية التمهيد البرمجي init rc
للمتابعة إلى
شاشة الإطلاق. راجِع مثال النص البرمجي التالي إذا كان لديك الرمز البرمجي التالي
في /vendor/etc/init.insmod.sh
:
#!/vendor/bin/sh
. . .
if [ $# -eq 1 ]; then
cfg_file=$1
else
# Set property even if there is no insmod config
# to unblock early-boot trigger
setprop vendor.common.modules.ready
setprop vendor.device.modules.ready
exit 1
fi
if [ -f $cfg_file ]; then
while IFS="|" read -r action arg
do
case $action in
"insmod") insmod $arg ;;
"setprop") setprop $arg 1 ;;
"enable") echo 1 > $arg ;;
"modprobe") modprobe -a -d /vendor/lib/modules $arg ;;
. . .
esac
done < $cfg_file
fi
في ملف rc للأجهزة، يمكن تحديد خدمة one shot
باستخدام:
service insmod-sh /vendor/etc/init.insmod.sh /vendor/etc/init.insmod.<hw>.cfg
class main
user root
group root system
Disabled
oneshot
يمكن إجراء تحسينات إضافية بعد انتقال الوحدات من المرحلة الأولى إلى الثانية. يمكنك استخدام ميزة قائمة الحظر في modprobe لتقسيم مرحلة التمهيد الثانية لتضمين تحميل الوحدة المؤجَّل للوحدات غير الأساسية. يمكن تأجيل تحميل الوحدات التي يستخدمها HAL معيّن حصريًا لتحميل الوحدات فقط عند بدء HAL.
لتحسين أوقات التحميل الظاهرية، يمكنك اختيار وحدات معيّنة في
خدمة تحميل الوحدات التي تساهم بشكل أكبر في التحميل بعد
شاشة الإطلاق. على سبيل المثال، يمكنك تحميل وحدات فك ترميز الفيديو أو Wi-Fi بعد محو عملية التمهيد المبدئي
(sys.boot_complete
إشارة موقع Android، على سبيل المثال). تأكَّد من أنّ مستويات HALs لوحدات التحميل المتأخّرة تكفي لفترة طويلة عندما تكون برامج تشغيل النواة غير متوفّرة.
بدلاً من ذلك، يمكنك استخدام الأمر wait<file>[<timeout>]
في init ضمن النص البرمجي لمسار تسجيل boot
flow rc للانتظار إلى أن تظهر إدخالات sysfs
محدّدة تشير إلى أنّ وحدات برامج التشغيل
قد أكملت عمليات الفحص. على سبيل المثال، الانتظار إلى أن يكتمل تحميل
برنامج تشغيل الشاشة في الخلفية أثناء الاسترداد أو fastbootd
،
قبل عرض الرسومات في القائمة.
تهيئة تردد وحدة المعالجة المركزية (CPU) على قيمة معقولة في برنامج الإقلاع
قد لا تتمكّن بعض وحدات المعالجة المركزية (CPU) أو المنتجات من تشغيل وحدة المعالجة المركزية بأعلى تردد بسبب مشاكل حرارية أو في الطاقة أثناء اختبارات حلقة التمهيد. ومع ذلك، تأكَّد من أنّ بوتloader يضبط تردد جميع وحدات المعالجة المركزية (CPU) المتصلّة على أعلى معدّل ممكن بأمان لوحدة المعالجة المركزية (SoC) أو المنتج. هذا مهم جدًا لأنّه باستخدام نواة متكاملة بالكامل، يتم فك ضغط ملف ramdisk لبدء التشغيل قبل تحميل ملف التشغيل CPUfreq. لذا، إذا تركت وحدة المعالجة المركزية (CPU) عند المستوى الأدنى لمعدل تكرارها بواسطة برنامج الإقلاع، يمكن أن تستغرق مدة فك ضغط ذاكرة الوصول العشوائي (RAM) وقتًا أطول من النواة المجمّعة بشكل ثابت (بعد تعديل اختلاف حجم وحدة المعالجة المركزية (CPU)) لأن معدّل تكرار وحدة المعالجة المركزية (CPU) سيكون منخفضًا للغاية عند تنفيذ عمل مكثف على وحدة المعالجة المركزية (CPU). وينطبق الأمر نفسه على الذاكرة ومعدّل الربط.
تهيئة تردد وحدة المعالجة المركزية لوحدات المعالجة المركزية الكبيرة في برنامج الإقلاع
قبل أن يتم تحميل برنامج تشغيل CPUfreq
، لا تكون النواة على دراية بترددات وحدة المعالجة المركزية (CPU) ولا تعمل على قياس السعة المُقررة لوحدة المعالجة المركزية (CPU) بما يتناسب مع معدّل التكرار الحالي. قد تنقل النواة سلاسل المهام إلى وحدة المعالجة المركزية الكبيرة إذا كان الحمل
مرتفعًا بما يكفي على وحدة المعالجة المركزية الصغيرة.
تأكَّد من أنّ وحدات المعالجة المركزية الكبيرة تحقّق أداءً لا يقلّ عن وحدات المعالجة المركزية الصغيرة في التردد الذي يتركها فيه مُشغِّل الإقلاع. على سبيل المثال، إذا كان أداء وحدة المعالجة المركزية الكبيرة يساوى أداء وحدة المعالجة المركزية الصغيرة بالتردد نفسه، إلا أن برنامج التحميل يضبط تردد وحدة المعالجة المركزية الصغيرة على 1.5 غيغاهرتز وتردد وحدة المعالجة المركزية الكبيرة على 300 ميغاهرتز، سينخفض أداء التشغيل إذا نقلت النواة السلسلة إلى وحدة المعالجة المركزية الكبيرة. في هذا المثال، إذا كان من الآمن تشغيل المعالج الضخم بسرعة 750 ميغاهرتز، عليك إجراء ذلك حتى إذا لم تكن تخطّط لاستخدامه صراحةً.
يجب ألا تحمِّل برامج التشغيل البرامج الثابتة في المرحلة الأولى من الإعداد.
قد تكون هناك بعض الحالات التي لا يمكن تجنُّبها والتي يجب فيها تحميل البرامج الثابتة في مرحلة بدء الأولى. ولكن بشكل عام، يجب ألا تحمِّل برامج التشغيل أيّ برنامج ثابت في المرحلة الأولى init، خاصةً في سياق فحص الجهاز. يؤدي تحميل البرامج الثابتة في مرحلة الإعداد الأولى إلى توقُّف عملية التمهيد بالكامل إذا لم تكن البرامج الثابتة متاحة في أداة ramdisk الخاصة بالمرحلة الأولى. وحتى إذا كان البرنامج الثابت متوفّرًا في المرحلة الأولى ramdisk، سيظلّ يتسبب في تأخير غير ضروري.