Table of Contents

פיתוח גרעין לינוקס מותאם אישית לחומרה הנדסית מיוחדת היא משימה מורכבת אך מתגמלת עמוק שנותנת למהנדסים שליטה מדויקת על ביצועי המערכת, האבטחה, והתאמה. בניגוד לתפוצה למטרות כלליות, גרעין מותאם אישית יכול להיות מפורז כדי לא לכלול מודולים מיותרים, מותאמים עם הרחבות בזמן אמת עבור התנהגות חקונית, ו מותאם לתמיכה ממשקים ייחודיים שלא ניתן לכסות על ידי נהגים קו ישר זה מספק דרך תהליך בדיקה סטנדרטית של תהליך תכנון, מעקב, מעקב ייחודי, על ידי תכנון, על ידי תהליך תכנון, על ידי תכנון, על ידי תהליך תכנון, ובדיקה של תהליך תכנון, ובדיקה של תהליך תכנון, והדרכה, על ידי תהליך תכנון, על ידי תכנון ייחודי, על ידי תכנון, על ידי תכנון, על ידי תכנון, על ידי תכנון, על ידי תהליך תכנון, ובדיקה של תהליך תכנון, על ידי תכנון, על ידי תכנון, והדרכה, על ידי תכנון, על ידי תהליך תכנון, על ידי תכנון ייחודי, על ידי תהליך תכנון ייחודי, על ידי תהליך תכנון, והדרכה, על ידי תהליך תכנון ייחודי, על ידי תכנון, והדרכה, על ידי תהליך תכנון, על ידי תכנון, והדרכה, על ידי תכנון, על ידי תכנון, על ידי תהליך תכנון, על ידי תכנון, על ידי תהליך תכנון, ו

הבנת הדרישות וספקטיבה של חומרה

לפני נוגע קו אחד של קוד, עליך לבצע ניתוח יסודי של חומרת היעד ואת המגבלות התפעוליות שלה. חומרה הנדסית מיוחדת כרוך לעתים קרובות היקפים לא סטנדרטיים, אוטובוסים קנייניים, או לולאות בקרה בזמן אמת.

  • (FLT:0) אדריכלות של אדריכלות פרוקטטור 1 (ARM64, x86 64, RISC-V, או סטנדרט SoC. זה קובע את המדר, כלי שרשרת ותצורת הקרנל הנדרשת.
  • (FLT:0) מזכר ומחסנית הפריסה של מחסנים 1 - מערכות Embedded עשויות להיות מוגבלות RAM, NOR / NAND פלאש, או eMMC. הגדרות ניהול זיכרון קרנל חייב להתאים עם מגבלות אלה.
  • (FLT:0)Peripherals וממשקים 1FLT:1 - מכשירים FPGA מותאם אישית, אוטובוסים יכולים, GPIO מרחיבים, או כרטיסי רכישה במהירות גבוהה של נתונים.כל אחד היקפי עשוי צריך נהג גרעין או ספריית חלל המשתמש.
  • (FLT:0) דרישות בזמן אמת-TimesFLT:1 - Latency Limits, להפריע זמני תגובה, וסובלנות Jitter. אלה החלטות נהיגה על מודלים של טרום-אופטיקה, טיפול, ואם ליישם את תיקון ה- PREPT RT.
  • (FLT:0)Power and תרמי גבולות FLT:1 - חומרה ללא חתומה או חומרה מופעלת סוללה עשויים לדרוש תדירות דינמית סקאלה מושלים, ותרמית תרמית.

צור מסמך ספציפי חומרה כי הקצאות צלב כל רכיב עם תמיכה בנהג לינוקס upstream.אם נהג אינו קיים או אינו שלם, רשימה של משימות הפיתוח המותאמות אישית הנדרשת. מסמך זה הופך לבסיס של תצורת הקרנל שלך.

הקמת סביבת הפיתוח

בחירת מערכת מארחת ושרשרת כלים

השתמש בהפצת לינוקס יציבה על מארח הפיתוח שלך - אובונטו 22.04 LTS או Debian 12 הם אפשרויות מוצקות.

sudo apt update
sudo apt install build-essential git ncurses-dev bison flex libssl-dev libelf-dev

עבור cross-compilation (common כאשר המטרה היא ARM או RISC-V המכשיר), להתקין את ה-Toolchain המתאימה ל-ARM64:

sudo apt install gcc-aarch64-linux-gnu

לחלופין, השתמש בשרשרת כלי מ-FLT:0 (הרש"י של אראם) ב- 1 (או מערכת בנייה מוטבעת ייעודית כמו FLT:2BuildrootFLT 3 או פרויקט Yocto לשילוב מורכב יותר.

מקור: The Kernel Source

⁇ קוד המקור הרשמי של לינוקס מקור מקור מקור מקור מקור לינוקס:0 גרעין:0 .orgearph:1 . . השתמש בשחרור ארוך האחרון (LTS) עבור מערכות ייצור, או מועמד שחרור אם אתה צריך תכונות מדממות.

git clone --depth 1 --branch v6.6-linux-next git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git

Cloning רק את ההתחייבות האחרונה (ב) 1 מעמיק מאיץ את ההורדה הראשונית.עבור היסטוריה מלאה ויכולת ליישם כתמים, השתמש בשקיט מלא.

ניהול בקרת גרסאות ו- Patch Management

לעקוב אחר השינויים שלך בסניף Git מקומי, אם אתה מתכנן ליישם כתמים (למשל, PREEMPT RT, מחוץ ל-tree נהגים), לשמור על סט של מחסנים בסגנון quilt או להשתמש ב- Git's am function.

« « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « «

סודיות אינטראקטיבית עם התפריט

השיטה הנפוצה ביותר להתאים אישית אפשרויות ליבה היא FLT:5 זה TUI (ממשק משתמש קבוע) מאפשר לך לנווט דרך אלפי אפשרויות המקובצים על ידי קטגוריה.

export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make menuconfig

אזורי מפתח כדי להגדיר:

  • (ב) ,0) ,(ההגדרה הכללית של ההרחבה: (Fential SetupFLT:1) – בחר את מודל הזיהוי שלך (FirLT 7 או FLT:8), בקרת תמיכה קבוצתית ומערכת.
  • (ב) ,0) דרישות מסוג ותכונות מסוג ותכונות מסוג זה (FLT:1) – משפחות CPU אפשריות או בלתי ניתנות להפרדה, ריבוי סימטרי (SMT), תמיכה בעמוד ענק, ו- NUMA אם יש צורך בכך.
  • (FLT:0) ניהול כוח ו- ACPIFLT:1 - מדינות cu idle , מושלי cpufreq, והפסקת תמיכה ב-Time Systems, לשקול לנטרל מדינות C-PU עמוקות כדי להפחית את השקיפות.
  • (FLT:0) נהגים מתעתקים 1:1 - נהגים שאינם צריכים (Wi-Fi, Bluetooth, רוב מנהלי GPU) כדי להפחית את גודל הקרנל ואת פני השטח התקפה.
  • (ב) ⁇ 0 (הכולל רק את מערכת הקבצים המשמשת למטרה (למשל, אקסט 4, שמיכות לקריאה בלבד, או UBIFS עבור פלאש גולמי).
  • (FLT:0Networking SupporttureFLT:1) - מכשירים הנדסיים רבים דורשים Ethernet תעשייתי (למשל, PROFINET, EtherCAT) או אוטובוס יכול להיות מסוגל אוטובוס תת-מערכת ומודולים פרוטוקולים רלוונטיים.

לאחר בחירת הבחירה, שמור את התצורה שלך כ-FLT:9 לרוץ (FLT:10) כדי ליצור תצורה מינימלית כי מתעד רק בחירות שאינן מוגדרות - זה אידיאלי עבור בקרת גרסאות, במיוחד כאשר שיתוף צוות.

שימוש ב-Kelnel Fragments

לחומרה מורכבת עם עיכובים מרובים, השתמש בפיצולי תצורה.קובץ שבר מכיל רק את האפשרויות שברצונך לעקוף.מרג אותם לתוך תצורה הבסיס עם:

./scripts/kconfig/merge_config.sh -O obj_dir base_defconfig fragment.config

גישה זו נקייה מעריכה ידנית של תצורה ומאפשרת פיזורים רבים (למשל, FLT:12, FLT:13).

התאמת תכונות Kernel וכותב נהג

זמן אמת-זמן אמיתי

להתנהגות ⁇ סטית מובטחת, ליישם את ה-FLT:0 ⁇ PREEMPT RT להגדיר את ה- 1LT (התיקים האלה הופכים את הקרנל למערכת הפעלה בזמן אמת לחלוטין: צעדים: צעדים:

  1. הורד את קובץ הסימון המתאים לגרסת הקרנל שלך.
  2. החל מה-FLT:14
  3. ב-FLT:15 תחת הגדרה כללית של מודל Preemption, בחר "מלאי Preemptible Kernel (Real-Time)".
  4. (ב) ויקרא י"ד: "וַיָּבְהַה הוּא" (בראשית י"ד, ט).

מבחן עם סייקליקט (מתוך חבילת ה- rt-tests) כדי למדוד את הכדאיות הגרועה ביותר. לצפות ב-microII-דיגיטלי יחיד על חומרה ממוקדת היטב.

המונחים: Custom Kernelמודולs

אם לחומרה שלך אין נהג ראשי, עליך לכתוב אחד.התחל עם מודול מינימלי "עולם השלום" כדי לאמת את תשתית הבנייה, ולאחר מכן להרחיב כדי להתמודד עם הפרעות, I / O, DMA, ופעולות קובץ.

/* my_device_driver.c */
#include <linux/module.h>
#include <linux/platform_device.h>

static int my_probe(struct platform_device *pdev)
{
 // request_mem_region, ioremap, register irq
 return 0;
}

static int my_remove(struct platform_device *pdev)
{
 // cleanup
 return 0;
}

static struct platform_driver my_driver = {
 .probe = my_probe,
 .remove = my_remove,
 .driver = { .name = "my_device" },
};
module_platform_driver(my_driver);

הוסף את קובץ המקור של הנהג שלך לעץ הקרנל של עץ הקרנל (FLT:19) ועדכון המקבילה של ה-FLT:20 ו- FLT:21 זה הופך אותו לבחירה באמצעות תפריט.

התאמת ניהול זיכרון

חומרה מיוחדת דורשת הקצאות זיכרון גדולות עבור DMA buffers - למשל, עיבוד תמונה או רדיו מוגדר תוכנה. EnableFLT:22 (Contigent Memory Allocator) ולהגדיר את גודלו באמצעות קו פיקוד הלבנל (ראה FLT:23).

בניית הקרנל והמודולים

אדריכלות היעד

הגדר את סביבת משתנה ולנהל את הבניין.עבור מטרה ARM64 עם ארבע משרות במקביל:

export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make -j4 Image.gz modules dtbs

זה מייצר תמונת גרעין דחוסה (FLT:27), מודולים בעלי ערך (FLT:28), ונפיחות עץ המכשיר (ראהFLT:29) אם החומרה שלך משתמשת עץ מכשירים שטוח (FDT), להבטיח את הנכון (FLT:30 קובץ קובץ הוא מואסף - ייתכן שיהיה צורך להוסיף או לשנות את לוח ספציפי DTS.

בניית עם Out-of-Treeמודולs

אם אתה מפתח מודול מחוץ לעץ הקרנל (למשל, מ-FPGA מוכר ה- SDK), השתמש במטרה לבנות את מערכת הגרעין של מערכת הגרעין של מערכת FPGA:31 נגד גרעין שנבנה בעבר:

export KERNEL_SRC=/path/to/kernel
make -C $KERNEL_SRC M=$PWD modules

עקבו אחרי The Device Tree Blob

וודאו כי עץ המכשיר בנוי כראוי על ידי הפעלתו של ההרחבה (FLT:33) לבדוק את הקובץ שנוצר (FLT:35) עם גניבת קבצים.

בדיקה ודיון על הקרנל המכס

בדיקה ראשונית Boot Testing

לטעון את תמונת הקרנל על המטרה באמצעות U-Boot, UEFI, או JTAG פלאשer. עיין הודעות מנעולים מוקדמות על הקונסולה סדרתית.

  • ראה את קו הפיקוד של הקרנל כולל (FLT:36 או את הנמל הסדרי הנכון).
  • (בתרגום חופשי: ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • אם האתחול תלה, הביטו במסר המודפס האחרון – לעתים קרובות הוא מצביע על נהג התקן לא מוגדר או חסר מערכת קבצים שורש.

שימוש ב-Dmesg ו- strace

לאחר שהולפס, רץ (FLT:39) כדי לסנן שגיאות ואזהרות. השתמש ביישומים של משתמשים אשר אינטראקציה עם מודולים של גרעין מותאם אישית, עבור מערכות בזמן אמת, לפקח על תזמון תזמון עם קיבולת של תזמון עם FPLT:41 ו-FLT:42 .

קרנל מתווכח עם KGDB

(ב) ב[[1924]], [[1924]], [[1924]]]], [[1924]]]], [[1924]]]], [[1924]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]], [[1924]]]]]]]]]]]]]]

aarch64-linux-gnu-gdb vmlinux
(gdb) target remote /dev/ttyUSB0
(gdb) continue

הגדר נקודות, לבחון זיכרון, וצעד דרך מטפלים מפריעים.

המונחים: Custom Kernel

התקנת הקרנל והמודולים

במכשיר היעד, העתק את תמונת הקרנל לחלוקת המגף (למשל, FLT:48) ולהתקין מודולים:

sudo make ARCH=arm64 INSTALL_MOD_PATH=/path/to/rootfs modules_install

אם משתמשים ב-Raldisk (initramfs), לבנות אותו מחדש עם FLT:50 או , כדי לכלול מודולים הדרושים למערכת הקבצים השורשית.

עקבו אחרי Bootloader

(ב) ב[[1924]], [[1924]], [[1924]], [[1924]]]], [[1924]] ו[[1924]], [[1924]], [[1924]], [[1924]]]], [[1924]], [[1924]]]], [[1924]]

setenv bootargs console=ttyAMA0,115200 root=/dev/mmcblk0p2 rw rootfstype=ext4
setenv kernel_addr_r 0x80000000
setenv fdt_addr_r 0x88000000
load mmc 0:1 ${kernel_addr_r} /Image.gz
unzip ${kernel_addr_r} ${kernel_addr_r} # if gzip compressed
load mmc 0:1 ${fdt_addr_r} /my_board.dtb
booti ${kernel_addr_r} - ${fdt_addr_r}

עבור מערכות מבוססות UEFI, השתמש ב-FLT:55 כדי לרשום את הקרנל ככניסה לחול.

עקבו אחרי Successful Boot

לאחר boot, לבדוק את הגירסה החדשה של הקרנל.בדוק את כל המודולים המותאמים אישית עמוסים ב-FLT:57 (המבחן של Run Comload) - להדגיש את נתיבי הנתונים של החומרה, למדוד את העצלות, ולא לאשר פאניקה הקרנל או או אופס מופיעים בגלציות לאורך תקופת הספוגה ממושכת.

עקבו אחרי Benchmarking

CPU Scaling ו- Governor Selection

עבור יישומים הנדסיים רגישים לעקביות, קבע מושל CPU ל-FLT:58:

echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

לחלופין, השתמש בכלים של לוח זמנים של משתמשים כמו FLT:60 כדי למקם תהליכים קריטיים ליבות ייעודיות ולבודד אותם מהלוח הזמנים של הקרנל.

I/O Planr ו-block Layer

(ב) למגבלות בזמן אמת, השתמש בתכונות ה-FLT:61 או ב-62 (I/O לוח הזמנים של NVMe (NVMe) לעיתים קרובות בשימוש ב-FLT:63) תכונות גרעין בלתי ניתנות ל-FLT:64 ו-FLT:65 אם לא צריך, כפי שהן מוסיפים מעל פני השטח.

רשת Network Stack Tuning

חומרה הנדסית משתמשת לעתים קרובות שקעים גולמיים או פרוטוקולים תעשייתיים. Tune the networkערימה של שקיפות נמוכה:

  • ויקרא י"ד: 6 ויקרא י"ד: ויקרא י"ד ויקרא י"ד ויקרא י"ד ויקרא יט:
  • שימוש ב-FLT:68 כדי להפחית את ה-Jitter.
  • (ב) אם יש לך מספר ליבות.

שמירה והעלאה של המחל

עקבו אחרי Upstream Releases

(הופנה מהדף ⁇ לינוקס kernel יציב url kernel ndle , 1 ), ולאחר מכן מהדורות LTS.כאשר יוצא שחרור יציב חדש, חזור על הפגמים המותאמים אישית שלך על זה.

git fetch stable
git checkout -b custom-6.7 v6.7
git rebase -i v6.6

בדוק כל בסיס מחדש ביסודיות לפני פריסת חומרת הייצור.

בדיקות אבטחה ושיקום

חומרה מיוחדת לעיתים קרובות חסרה ביקורת אבטחה - גרעין מותאם אישית שלעולם לא מעודכנת יכול להפוך לדלת אחורית. להגדיר צינור בנייה ומבחן אוטומטי. השתמש ב-FLT:72 או מקרה ג'נקינס מקומי לרוץ בדיקות מנעולים, בדיקות לבה, ובדיקות פונקציונליות ספציפיות נהיגה בכל פעם שתיקון חדש מוחל.

מסמכים ושיתוף ידע

שמור מסמך חי המפרט כל אפשרות של תצורה של גרעין שונה מה ברירת המחדל, כל תיקון יישומי, וכל נהג מותאם אישית.מנע מ-ME עם הוראות לבנייה מחדש מאפס.זה בלתי יקר כאשר חברי הצוות משתנים או כאשר אתה צריך לשחזר את שנות ההתקנה מאוחר יותר.

דוגמה אמיתית לעולם: Custom Kernel עבור פיזיקה גבוהה

שקול מערכת DAQ מדעית (רכישה של נתונים) הקוראת 10,000 ערוצים מ- ASIC על כרטיס PCIe מותאם אישית.

  • הפרעה חד-משמעית טיפול עם פחות מ 5 מיקרו-מיקרו-עוצמה.
  • הקצאת זיכרון רציפה עבור 2 GB של DMA buffers.
  • אין שום צמיד, אין רשת, אחסון מינימלי.

המהנדס היה:

  1. התחל עם קו הראשי ARM64 kernel וליישם את תיקון PREEMPT RT.
  2. להשבית את כל הרשתות, אודיו ונהגי GPU.
  3. ניתן ל-CMA עם ההרחבה:73 על קו הפיקוד של הקרנל.
  4. כותב נהג אופי המשתמש ב-FLT:74 (בקיצור:74) בהקצאת buffer ורישום מטפל מפריע עם FLT:75 שימוש ב-FLT:76.
  5. בדוק עם בדיקת לחץ הקוראת 100 מיליון אירועים ללא תקלה או טעות בעמוד.

מערכת כזו תפורז במעבדה ולעולם לא מחוברת לאינטרנט, אבל הקרנל שלה עדיין צריך להיות ביקורתי ומעודכנת כאשר מתרחשת טעות קריטית.

מסקנה

פיתוח גרעין מותאם אישית של חומרת הנדסה מיוחדת נותן לך שליטה מלאה על הביצועים של הפלטפורמה, הדטרמיניזם, ואבטחה.התהליך - החל ניתוח הכרחי לתחזוקה - דורש אך מנוהל היטב ברגע שאתה מבין את תת-מערכת הבסיסית. על ידי מינוף כלים כמו תפריט, נכשל עץ המכשיר יתר על המידה, בדיקות מחזוריות עםחול פלאשיקציה ו- , אתה יכול להפעיל מסלול בטוח על ידי תיקון אמיתי, עם רזולוציה גבוהה של כל זמן חיים, עם טיפול אמיתי, עם פתור חדש, כמו תמיד, כמו גם על ידי תיקון אמיתי, טיפול אמיתי, ניסיון אמיתי, עם פתור, כמו גם על פני השטח שלך.