تحسين وقت التشغيل

تقدّم هذه الصفحة نصائح لتحسين وقت بدء التشغيل.

إزالة رموز تصحيح الأخطاء من الوحدات

وعلى غرار طريقة إزالة رموز تصحيح الأخطاء من النواة على جهاز مخصّص للإنتاج، احرص أيضًا على إزالة رموز تصحيح الأخطاء من الوحدات. يساعد حذف رموز تصحيح الأخطاء من الوحدات في تقليل وقت التشغيل من خلال تقليل ما يلي:

  • الوقت الذي يستغرقه قراءة الملفات الثنائية من الذاكرة المؤقتة
  • الوقت الذي يستغرقه فك ضغط ramdisk
  • الوقت المستغرَق لتحميل الوحدات

قد يؤدي إزالة رمز تصحيح الأخطاء من الوحدات إلى توفير عدة ثوانٍ أثناء عملية التشغيل.

يكون إيقاف الرموز مفعَّلاً تلقائيًا في إصدار منصة Android، ولكن لتفعيلها بشكل صريح، اضبط BOARD_DO_NOT_STRIP_VENDOR_RAMDISK_MODULES في الإعدادات الخاصة بجهازك ضمن device/vendor/device.

استخدام ضغط LZ4 للنواة وramdisk

ينتج عن Gzip ناتج مضغوط أصغر مقارنةً بـ LZ4، ولكن يتم فك ضغط LZ4 بشكل أسرع من Gzip. بالنسبة إلى النواة والوحدات، لا يكون الانخفاض المطلق في حجم التخزين الناتج عن استخدام Gzip كبيرًا مقارنةً بميزة وقت فك الضغط في LZ4.

تمت إضافة إمكانية ضغط ramdisk باستخدام LZ4 إلى إصدار منصة Android من خلال BOARD_RAMDISK_USE_LZ4. يمكنك ضبط هذا الخيار في إعدادات جهازك. يمكن ضبط ضغط النواة من خلال ملف defconfig الخاص بالنواة.

من المفترض أن يؤدي التبديل إلى LZ4 إلى تقليل وقت التشغيل بمقدار 500 إلى 1,000 ملي ثانية.

تجنُّب التسجيل المفرط في برامج التشغيل

في ARM64 وARM32، تحتاج استدعاءات الدوال التي تبعد أكثر من مسافة معيّنة عن موقع الاستدعاء إلى جدول انتقال (يُعرف باسم جدول ربط الإجراءات أو PLT) لتتمكّن من ترميز عنوان الانتقال الكامل. وبما أنّه يتم تحميل الوحدات بشكل ديناميكي، يجب إصلاح جداول الانتقال هذه أثناء تحميل الوحدة. تُسمّى المكالمات التي تحتاج إلى نقل إدخالات النقل مع الإضافات الصريحة (أو RELA، باختصار) في تنسيق ELF.

تجري نواة Linux بعض عمليات تحسين حجم الذاكرة (مثل تحسين الوصول إلى البيانات المخزّنة مؤقتًا) عند تخصيص جدول PLT. باستخدام عملية الدمج مع المصدر الأصلي، يصبح مخطط التحسين ذا تعقيد O(N^2)، حيث N هو عدد RELAs من النوع R_AARCH64_JUMP26 أو R_AARCH64_CALL26. لذا، من المفيد أن يكون لديك عدد أقل من RELA من هذه الأنواع للمساعدة في تقليل مدة تحميل الوحدة.

أحد أنماط الترميز الشائعة التي تزيد من عدد أخطاء R_AARCH64_CALL26 أو R_AARCH64_JUMP26 RELA هو التسجيل المفرط في برنامج التشغيل. يؤدي كل طلب إلى printk() أو أي نظام تسجيل آخر إلى إضافة إدخال CALL26/JUMP26 RELA. في نص عملية الإيداع في عملية الإيداع الأصلية، لاحظ أنّه حتى مع التحسين، تستغرق الوحدات الست حوالي 250 ملي ثانية للتحميل، وذلك لأنّ هذه الوحدات الست كانت الوحدات الست الأوائل التي تحتوي على أكبر قدر من التسجيل.

يمكن أن يؤدي تقليل التسجيل إلى توفير حوالي 100 إلى 300 ملي ثانية من أوقات التشغيل، وذلك حسب مدى الإفراط في التسجيل الحالي.

تفعيل الاستقصاء غير المتزامن بشكل انتقائي

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

لتجنُّب بطء أوقات التشغيل، فعِّل البحث غير المتزامن عن الوحدات التي تستغرق وقتًا طويلاً للبحث عن أجهزتها. قد لا يكون تفعيل البحث غير المتزامن لجميع الوحدات النمطية مفيدًا لأنّ الوقت المستغرَق في إنشاء نسخة من سلسلة محادثات وبدء البحث قد يكون طويلاً مثل الوقت المستغرَق في البحث في الجهاز.

يمكن أن تؤدي الأجهزة المتصلة عبر ناقل بطيء، مثل I2C، والأجهزة التي يتم تحميل البرامج الثابتة فيها في وظيفة الفحص، والأجهزة التي تجري الكثير من عمليات تهيئة الأجهزة، إلى حدوث مشكلة في التوقيت. وأفضل طريقة لتحديد وقت حدوث ذلك هي جمع وقت التحقيق لكل برنامج تشغيل وترتيبه.

لتفعيل عملية التحقّق غير المتزامنة لوحدة، لا يكفي ضبط العلامة PROBE_PREFER_ASYNCHRONOUS في رمز برنامج التشغيل فقط. بالنسبة إلى الوحدات، عليك أيضًا إضافة module_name.async_probe=1 في سطر أوامر النواة أو تمرير async_probe=1 كمَعلمة وحدة عند تحميل الوحدة باستخدام modprobe أو insmod.

يمكن أن يؤدي تفعيل ميزة "التحقّق غير المتزامن" إلى توفير حوالي 100 إلى 500 ملي ثانية من أوقات التشغيل استنادًا إلى الأجهزة/برامج التشغيل.

فحص برنامج تشغيل CPUfreq في أقرب وقت ممكن

كلما تم فحص برنامج تشغيل CPUfreq مبكرًا، كلما تمكنت من رفع تردد وحدة المعالجة المركزية إلى الحد الأقصى (أو بعض الحدود القصوى الحرارية) أثناء عملية التشغيل. وكلما كانت وحدة المعالجة المركزية أسرع، كان بدء التشغيل أسرع. تنطبق هذه الإرشادات أيضًا على devfreq برامج التشغيل التي تتحكّم في ذاكرة الوصول العشوائي الديناميكية (DRAM) والذاكرة ومعدّل تكرار الربط البيني.

باستخدام الوحدات، يمكن أن يعتمد ترتيب التحميل على مستوى initcall وترتيب التجميع أو الربط الخاص ببرامج التشغيل. استخدِم اسمًا مستعارًا MODULE_SOFTDEP() للتأكّد من أنّ برنامج التشغيل cpufreq هو من بين الوحدات القليلة الأولى التي يتم تحميلها.

بالإضافة إلى تحميل الوحدة مبكرًا، عليك أيضًا التأكّد من أنّ جميع التبعيات اللازمة لفحص برنامج تشغيل CPUfreq قد تم فحصها أيضًا. على سبيل المثال، إذا كنت بحاجة إلى ساعة أو مقبض منظِّم للتحكّم في معدّل تكرار وحدة المعالجة المركزية، تأكَّد من أنّهما يتم فحصهما أولاً. أو قد تحتاج إلى تحميل برامج تشغيل حرارية قبل برنامج تشغيل CPUfreq إذا كان من المحتمل أن ترتفع درجة حرارة وحدات المعالجة المركزية بشكل كبير أثناء عملية بدء التشغيل. لذا، عليك بذل ما بوسعك للتأكّد من أنّ برامج تشغيل CPUfreq وdevfreq ذات الصلة تبدأ عملها في أقرب وقت ممكن.

يمكن أن تكون وفورات الطاقة الناتجة عن فحص برنامج تشغيل CPUfreq مبكرًا صغيرة جدًا أو كبيرة جدًا، وذلك حسب مدى إمكانية إجراء هذا الفحص مبكرًا والتردد الذي يترك فيه برنامج التشغيل وحدات المعالجة المركزية.

نقل الوحدات إلى مرحلة التهيئة الثانية أو قسم vendor أو vendor_dlkm

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

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

حمِّل برامج التشغيل الأساسية التالية:

  • watchdog
  • reset
  • cpufreq

بالنسبة إلى وضع الاسترداد ومساحة المستخدم fastbootd، يتطلّب برنامج init في المرحلة الأولى المزيد من الأجهزة التي يجب فحصها (مثل USB) والشاشة. احتفِظ بنسخة من هذه الوحدات في ramdisk في المرحلة الأولى وفي قسم المورّد أو vendor_dlkm. ويتيح ذلك تحميلها في مرحلة التهيئة الأولى لعملية الاسترداد أو مسار بدء التشغيل fastbootd. ومع ذلك، لا تحمِّل وحدات وضع الاسترداد في عملية الإعداد الأولية أثناء عملية التشغيل العادية. يمكن تأجيل وحدات وضع الاسترداد إلى مرحلة التهيئة الثانية لتقليل وقت التشغيل. يجب نقل جميع الوحدات الأخرى التي لا تكون مطلوبة في مرحلة الإعداد الأولى إلى قسم المورّد أو vendor_dlkm.

عند توفّر قائمة بأجهزة فرعية (مثل UFS أو الجهاز التسلسلي)، dev needs.sh يبحث البرنامج النصي عن جميع برامج التشغيل والأجهزة والوحدات اللازمة للتبعيات أو المورّدين (مثل الساعات أو المنظِّمات أو gpio) لإجراء عملية فحص.

يؤدي نقل الوحدات إلى مرحلة التهيئة الثانية إلى تقليل أوقات التشغيل بالطرق التالية:

  • تقليل حجم Ramdisk
    • ويؤدي ذلك إلى قراءة أسرع للذاكرة المؤقتة عند تحميل برنامج التشغيل ramdisk (خطوة تسلسلية للتشغيل).
    • ويؤدي ذلك إلى تسريع عملية فك الضغط عندما يفك النواة ضغط ramdisk (خطوة التسلسل عند بدء التشغيل).
  • تعمل عملية التهيئة في المرحلة الثانية بالتوازي، ما يخفي وقت تحميل الوحدة النمطية مع العمل الذي يتم تنفيذه في عملية التهيئة في المرحلة الثانية.

يمكن أن يؤدي نقل الوحدات إلى المرحلة الثانية إلى توفير 500 إلى 1000 ملي ثانية من أوقات التشغيل، وذلك حسب عدد الوحدات التي يمكنك نقلها إلى عملية الإعداد في المرحلة الثانية.

الخدمات اللوجستية لتحميل الوحدات

يتضمّن أحدث إصدار من Android إعدادات لوحة تحكّم تتحكّم في الوحدات التي يتم نسخها إلى كل مرحلة والوحدات التي يتم تحميلها. يركّز هذا القسم على المجموعة الفرعية التالية:

  • BOARD_VENDOR_RAMDISK_KERNEL_MODULES: هذه قائمة بالوحدات التي سيتم نسخها إلى ramdisk.
  • 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: هذه قائمة بالوحدات التي سيتم تحميلها في مرحلة الإعداد الثانية.

يجب أيضًا نسخ وحدتَي التشغيل والاسترداد في ramdisk إلى قسم المورّد أو 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 يسهل إدارتها، ويمكن تحديدها محليًا في ملفات إعداد اللوحة. يبحث النص البرمجي السابق عن كل وحدات المجموعة الفرعية ويملأها من وحدات النواة المتاحة المحدّدة، ويترك الوحدات المتبقية لعملية التهيئة في المرحلة الثانية.

بالنسبة إلى عملية التهيئة في المرحلة الثانية، ننصح بتشغيل تحميل الوحدات كوظيفة خدمة حتى لا تحظر عملية بدء التشغيل. استخدِم نصًا برمجيًا shell لإدارة تحميل الوحدات النمطية حتى يمكن إبلاغ العمليات اللوجستية الأخرى، مثل معالجة الأخطاء وتخفيفها أو إكمال تحميل الوحدات النمطية، أو تجاهلها إذا لزم الأمر.

يمكنك تجاهل تعذُّر تحميل وحدة تصحيح الأخطاء التي لا تظهر في إصدارات المستخدمين. لتجاهل هذا الخطأ، اضبط السمة 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، على سبيل المثال). تأكَّد من أنّ حزم HAL للوحدات التي يتم تحميلها لاحقًا تحظر وقتًا طويلاً بما يكفي عندما لا تكون برامج تشغيل النواة متوفّرة.

بدلاً من ذلك، يمكنك استخدام الأمر wait<file>[<timeout>] الخاص بـ init في نصوص rc البرمجية الخاصة بتسلسل التشغيل لانتظار ظهور إدخالات sysfs المحدّدة التي تشير إلى أنّ وحدات برامج التشغيل قد أكملت عمليات الفحص. ومن الأمثلة على ذلك انتظار اكتمال تحميل برنامج تشغيل الشاشة في الخلفية أثناء عملية الاسترداد أو fastbootd، قبل عرض رسومات القائمة.

تهيئة تردد وحدة المعالجة المركزية (CPU) إلى قيمة معقولة في برنامج الإقلاع

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

تهيئة تردد وحدة المعالجة المركزية (CPU) الكبيرة في برنامج الإقلاع

قبل تحميل برنامج تشغيل CPUfreq، لا تكون النواة على دراية بترددات وحدة المعالجة المركزية ولا يمكنها تغيير سعة جدولة وحدة المعالجة المركزية وفقًا للتردد الحالي. قد ينقل النواة سلاسل التعليمات إلى وحدة المعالجة المركزية الكبيرة إذا كان الحمل مرتفعًا بدرجة كافية على وحدة المعالجة المركزية الصغيرة.

تأكَّد من أنّ وحدات المعالجة المركزية الكبيرة لا يقل أداؤها عن وحدات المعالجة المركزية الصغيرة عند التردد الذي يتركها فيه برنامج التحميل. على سبيل المثال، إذا كان أداء وحدة المعالجة المركزية الكبيرة أفضل بمرتين من أداء وحدة المعالجة المركزية الصغيرة عند التردد نفسه، ولكن برنامج التشغيل يضبط تردد وحدة المعالجة المركزية الصغيرة على 1.5 غيغاهرتز وتردد وحدة المعالجة المركزية الكبيرة على 300 ميغاهرتز، سينخفض أداء التشغيل إذا نقلت النواة سلسلة التعليمات إلى وحدة المعالجة المركزية الكبيرة. في هذا المثال، إذا كان من الآمن تشغيل وحدة المعالجة المركزية الكبيرة بسرعة 750 ميغاهرتز، عليك إجراء ذلك حتى إذا لم تكن تخطّط لاستخدامها بشكل صريح.

يجب ألا يتم تحميل برامج التشغيل في مرحلة الإعداد الأولية.

قد تكون هناك بعض الحالات التي لا يمكن تجنُّبها والتي يجب فيها تحميل البرامج الثابتة في مرحلة التهيئة الأولى. ولكن بشكل عام، يجب ألا تحمّل برامج التشغيل أي برامج ثابتة في مرحلة الإعداد الأولى، خاصةً في سياق فحص الجهاز. يؤدي تحميل البرامج الثابتة في مرحلة التهيئة الأولى إلى توقّف عملية التشغيل بأكملها إذا لم تكن البرامج الثابتة متاحة في قرص RAM في المرحلة الأولى. وحتى إذا كانت البرامج الثابتة متوفرة في المرحلة الأولى من ذاكرة الوصول العشوائي، سيظل ذلك يؤدي إلى تأخير غير ضروري.