
نواة هجينة تجمع بين Mach وFreeBSD وIOKit لنظامي macOS وiOS. تقدم خدمات نظام التشغيل الأساسية، إطار عمل السائق، وتطبيق سياسات الأمان على x86_64 وARM64.
نواة XNU هي جزء من نظام تشغيل Darwin المستخدم في أنظمة تشغيل macOS و iOS. XNU هو اختصار لعبارة X is Not Unix. XNU هي نواة هجينة تجمع بين نواة Mach التي طورتها جامعة Carnegie Mellon مع مكونات من FreeBSD وواجهة برمجة تطبيقات C++ لكتابة برامج التشغيل تسمى IOKit. تعمل XNU على x86_64 و ARM64 لكل من التكوينات أحادية المعالج ومتعددة المعالجات.
config - تكوينات لواجهات برمجة التطبيقات المصدرة للبنية الأساسية والمنصة المدعومة.SETUP - مجموعة أساسية من الأدوات المستخدمة لتكوين النواة، وإدارة الإصدارات، وإدارة رموز kext.EXTERNAL_HEADERS - ملفات الرأس المستمدة من مشاريع أخرى لتجنب دورات التبعية أثناء البناء. يجب مزامنة هذه الملفات بانتظام عند تحديث المصدر.libkern - كود مكتبة IOKit بلغة C++ للتعامل مع برامج التشغيل وملحقات النواة (kexts).libsa - كود تمهيد النواة لبدء التشغيل.libsyscall - واجهة مكتبة استدعاءات النظام لبرامج مساحة المستخدم.libkdd - مصدر مكتبة المستخدم لتحليل بيانات النواة مثل البيانات المجزأة للنواة.makedefs - قواعد وتعريفات المستوى الأعلى لبناء النواة.osfmk - الأنظمة الفرعية القائمة على نواة Mach.pexpert - كود خاص بالمنصة مثل معالجة المقاطعات، الذريات، إلخ.security - واجهات سياسة فحص الوصول الإلزامي والتنفيذ المرتبط بها.bsd - كود الأنظمة الفرعية لـ BSD.tools - مجموعة من الأدوات لاختبار وتصحيح وتحليل أداء النواة.DEVELOPMENTيمكن لنظام make الخاص بـ xnu بناء نواة بناءً على متغيرات KERNEL_CONFIGS و ARCH_CONFIGS كوسائط.
إليك الصيغة:```text
make SDKROOT= ARCH_CONFIGS= KERNEL_CONFIGS=
Where:
* `<sdkroot>`: المسار إلى macOS SDK على القرص. (الافتراضي `/`)
* `<variant>`: يمكن أن يكون `debug`، `development`، `release`، `profile` ويقوم بتكوين أعلام الترجمة والتأكيدات عبر كود النواة.
* `<arch>`: يمكن أن يكون بنية صالحة للبناء من أجلها. (مثال: `X86_64`)
لبناء نواة لنفس بنية نظام التشغيل الجاري، اكتب فقط```text
make SDKROOT=macosx.internal
بالإضافة إلى ذلك، هناك دعم لتكوين البنى من خلال ARCH_CONFIGS وتكوينات النواة باستخدام KERNEL_CONFIGS.```text
make SDKROOT=macosx.internal ARCH_CONFIGS=X86_64 KERNEL_CONFIGS=DEVELOPMENT
make SDKROOT=macosx.internal ARCH_CONFIGS=X86_64 KERNEL_CONFIGS="RELEASE DEVELOPMENT DEBUG"
> ملاحظة: يتم تعيين البنية افتراضيًا على بنية جهاز البناء، ويتم تعيين تكوين kernel الافتراضي للبناء من أجل `DEVELOPMENT`.
سيؤدي هذا أيضًا إلى إنشاء صورة قابلة للإقلاع، و kernel.[config]، وملف ثنائي للنواة مع الرموز، kernel.[config].unstripped.
لتثبيت kernel في DSTROOT، استخدم الهدف `install_kernels`:```text
make install_kernels DSTROOT=/tmp/xnu-dst
للحصول على تجربة تصحيح أخطاء النواة أكثر إرضاءً، مع الوصول إلى جميع المتغيرات والوسائط المحلية، ولكن دون جميع الفحوصات الإضافية لنواة DEBUG، أضف شيئًا مثل ما يلي إلى أمر make الخاص بك:```text CFLAGS_DEVELOPMENTARM64="-O0 -g -DKERNEL_STACK_MULTIPLIER=2" CXXFLAGS_DEVELOPMENTARM64="-O0 -g -DKERNEL_STACK_MULTIPLIER=2"
تذكر استبدال `DEVELOPMENT` و `ARM64` بالبناء والمنصة المناسبين.
> الخيارات الإضافية: يمكنك تمرير خيارات إضافية لمجمع C من سطر الأوامر باستخدام إعداد البناء `EXTRA_CFLAGS`. يتم إلحاق هذه الخيارات بقاعدة `CFLAGS`، والقيمة الافتراضية للإعداد هي سلسلة فارغة.
>
> يتيح لك هذا الإعداد، على سبيل المثال، تشغيل كود التصحيح بشكل انتقائي المحمي بواسطة ماكرو المعالج المسبق. مثال الاستخدام...
>
> ```text
> make SDKROOT=macosx.internal PRODUCT_CONFIGS=j314s
> EXTRA_CFLAGS='-DKERNEL_STACK_MULTIPLIER=2'
> ```
* لبناء مع تكوين نواة RELEASE
```text
make KERNEL_CONFIGS=RELEASE SDKROOT=/path/to/SDK
```
### بناء ثنائي نواة FAT
حدد البنى في بيئتك أو عند تشغيل أمر make.```text
make ARCH_CONFIGS="X86_64" exporthdrs all
يمكن لنظام بناء XNU اختياريا إخراج مخرجات بناء ملونة. لتمكين ذلك، يمكنك إما
تعيين متغير البيئة XNU_LOGCOLORS إلى y، أو يمكنك تمرير LOGCOLORS=y لأمر make.
يتم اشتقاق إصدار xnu من SDK أو KDK عن طريق قراءة CFBundleVersion
من ملف System/Library/Extensions/System.kext/Info.plist الخاص بهما.
يمكن تخصيص ذلك عن طريق تعيين المتغير RC_DARWIN_KERNEL_VERSION في
البيئة أو في سطر أمر make.
انظر doc/building/xnu_version.md لمزيد من التفاصيل.
بشكل افتراضي، يتم إنشاء مستودع معلومات تصحيح DWARF أثناء مرحلة التثبيت؛ وهو "حزمة" تحمل اسم kernel.development.<variant>.dSYM لتحديد تنسيق معلومات تصحيح STABS الأقدم (حيث تكون معلومات التصحيح مضمنة في صورة kernel.development.unstripped)، قم بتعيين متغير البيئة BUILD_STABS.```sh export BUILD_STABS=1 make
## بناء ذواكر النواة (KernelCaches)
لاختبار نواة xnu، تحتاج إلى بناء ذاكرة نواة (kernelcache) تربط الإضافات (kexts) والنواة معًا في صورة واحدة قابلة للإقلاع.
لبناء ذاكرة نواة، يمكنك استخدام الآليات التالية:
* استخدام التوليد التلقائي لذاكرة النواة مع `kextd`.
يقوم البرنامج الخفي `kextd` بمراقبة التغييرات في دليل `/System/Library/Extensions`.
لذا يمكنك إعداد نواة جديدة كالتالي:
```text
cp BUILD/obj/DEVELOPMENT/X86_64/kernel.development /System/Library/Kernels/
touch /System/Library/Extensions
ps -e | grep kextd
```
* استدعاء `kextcache` يدويًا لبناء ذاكرة نواة جديدة.
```text
kextcache -q -z -a x86_64 -l -n -c /var/tmp/kernelcache.test -K /var/tmp/kernel.test /System/Library/Extensions
```
## إقلاع ذاكرة نواة على جهاز مستهدف
يدعم كل من النواة التطويرية و iBoot تكوين وسائط الإقلاع (boot arguments) بحيث يمكننا الإقلاع بأمان إلى نواة اختبارية، وإذا حدث خطأ، نعود بأمان إلى ذاكرة النواة المستخدمة سابقًا.
فيما يلي خطوات تحقيق هذا الإعداد:
1. إنشاء ذاكرة نواة باستخدام أمر kextcache باسم `/kernelcache.test`
2. نسخ تكوينات الإقلاع الحالية إلى ملف بديل
```sh
cp /Library/Preferences/SystemConfiguration/com.apple.Boot.plist /next_boot.plist
```
3. تحديث ذاكرة النواة ووسائط الإقلاع لإعدادك
```sh
plutil -insert "Kernel Cache" -string "kernelcache.test" /next_boot.plist
plutil -replace "Kernel Flags" -string "debug=0x144 -v kernelsuffix=test " /next_boot.plist
```
4. نسخ التكوين الجديد إلى `/Library/Preferences/SystemConfiguration/`
```sh
cp /next_boot.plist /Library/Preferences/SystemConfiguration/boot.plist
```
5. بارك (bless) الحجم بالتكوينات الجديدة.
```text
sudo -n bless --mount / --setBoot --nextonly --options "config=boot"
```
العلامة `--nextonly` تحدد استخدام تكوينات `boot.plist` فقط لمرة إقلاع واحدة.
لذا إذا حدث ذعر في النواة، يمكنك بسهولة إعادة التشغيل والتعافي إلى النواة الأصلية.
## إنشاء علامات (tags) وقاعدة cscope
أعد بيئة البناء ومن الدليل العلوي، قم بتشغيل:
make tags # سيبني هذا ctags و etags على وحدة تخزين حساسة لحالة الأحرف، و ctags فقط على غير حساسة
make TAGS # سيبني هذا etags
make cscope # سيبني هذا قاعدة بيانات cscope
## تثبيت ملفات الرؤوس الجديدة من XNU
تقوم XNU بتثبيت ملفات الرؤوس في المواقع التالية -
a. $(DSTROOT)/System/Library/Frameworks/Kernel.framework/Headers
b. $(DSTROOT)/System/Library/Frameworks/Kernel.framework/PrivateHeaders
c. $(DSTROOT)/usr/include/
d. $(DSTROOT)/usr/local/include/
e. $(DSTROOT)/System/DriverKit/usr/include/
f. $(DSTROOT)/System/Library/Frameworks/IOKit.framework/Headers
g. $(DSTROOT)/System/Library/Frameworks/IOKit.framework/PrivateHeaders
h. $(DSTROOT)/System/Library/Frameworks/System.framework/PrivateHeaders