מודולי ליבה הם פיסות קוד שניתן לטעון ולפרוק לתוך הליבה לפי דרישה. הם מרחיבים את הפונקציונליות של הליבה ללא צורך לאתחל את המערכת. ניתן להוסיף קודים מותאמים אישית לגרעיני לינוקס בשתי שיטות. - הדרך הבסיסית היא להוסיף את הקוד לעץ המקור של הליבה ולהרכיב מחדש את הליבה.
  - דרך יעילה יותר היא לעשות זאת היא על ידי הוספת קוד לקרנל בזמן שהוא פועל. תהליך זה נקרא טעינת המודול כאשר מודול מתייחס לקוד שאנו רוצים להוסיף לקרנל.
  
מכיוון שאנו טוענים את הקודים הללו בזמן ריצה והם אינם חלק מקרנל הלינוקס הרשמי, הם נקראים מודול ליבה לטעינה (LKM) אשר שונה מהקרנל הבסיסי. ליבת הבסיס ממוקמת בספריית /boot ונטען תמיד כאשר אנו מאתחלים את המחשב שלנו ואילו LKMs נטענים לאחר שגרעין הבסיס כבר נטען. אף על פי כן, LKM אלו הם חלק מאוד מהקרנל שלנו והם מתקשרים עם ליבת הבסיס כדי להשלים את הפונקציות שלהם. LKMs יכולים לבצע מגוון של משימות, אבל בעצם הם מגיעים תחת שלוש קטגוריות עיקריות - מנהל ההתקן
  - מנהל התקן של מערכת הקבצים ו
  - שיחות מערכת.
  
   אז איזה יתרון מציעים LKMs? יתרון מרכזי אחד שיש להם הוא שאנחנו לא צריכים להמשיך לבנות מחדש את הליבה בכל פעם שאנחנו מוסיפים מכשיר חדש או אם אנחנו משדרגים מכשיר ישן. זה חוסך זמן וגם עוזר לשמור על שגיאות הליבה הבסיסית שלנו. כלל אצבע שימושי הוא שאנחנו לא צריכים לשנות את ליבת הבסיס שלנו ברגע שיש לנו גרעין בסיס עובד. זה גם עוזר באבחון בעיות במערכת. לדוגמה נניח שהוספנו מודול לגרעין הבסיס (כלומר שינינו את ליבת הבסיס שלנו על ידי הידור מחדש) ולמודול יש באג. זה יגרום לשגיאה באתחול המערכת ולעולם לא נדע איזה חלק בקרנל גורם לבעיות. בעוד שאם נטען את המודול בזמן ריצה והוא גורם לבעיות נדע מיד את הבעיה ונוכל לפרוק את המודול עד שנתקן אותה. LKMs גמישים מאוד במובן זה שניתן לטעון ולפרוק אותם בשורת פקודה אחת. זה עוזר לחסוך בזיכרון כאשר אנו טוענים את ה-LKM רק כאשר אנו זקוקים להם. יתר על כן, הם אינם איטיים יותר מהקרנל הבסיסי, כי הקריאה לכל אחד מהם היא פשוט טעינת קוד מחלק אחר בזיכרון. **אזהרה: LKMs אינן תוכניות מרחב משתמש. הם חלק מהגרעין. יש להם הפעלה חופשית של המערכת והם יכולים בקלות לקרוס אותה.   So now that we have established the use loadable kernel modules we are going to write a hello world kernel module. That will print a message when we load the module and an exit message when we unload the module. Code: CPP /**  * @file hello.c  * @author Akshat Sinha  * @date 10 Sept 2016  * @version 0.1  * @brief An introductory 'Hello World!' loadable kernel  * module (LKM) that can display a message in the /var/log/kern.log  * file when the module is loaded and removed. The module can accept  * an argument when it is loaded -- the name which appears in the  * kernel log files. */ #include  /* Needed by all modules */ #include  /* Needed for KERN_INFO */ #include  /* Needed for the macros */ ///< The license type -- this affects runtime behavior MODULE_LICENSE('GPL'); ///< The author -- visible when you use modinfo MODULE_AUTHOR('Akshat Sinha'); ///< The description -- see modinfo MODULE_DESCRIPTION('A simple Hello world LKM!'); ///< The version of the module MODULE_VERSION('0.1'); static int __init hello_start(void) {  printk(KERN_INFO 'Loading hello module...n');  printk(KERN_INFO 'Hello worldn');  return 0; } static void __exit hello_end(void) {  printk(KERN_INFO 'Goodbye Mr.n'); } module_init(hello_start); module_exit(hello_end); 
   הסבר לקוד לעיל: מודולי ליבה חייבים לכלול לפחות שתי פונקציות: פונקציית 'התחלה' (אתחול) הנקראת init_module() הנקראת כאשר המודול מוכנס לתוך הליבה ופונקציית 'סיום' (cleanup) בשם cleanup_module() שנקראת ממש לפני שהיא עוברת rmmoded. למעשה דברים השתנו החל מגרעין 2.3.13. כעת תוכל להשתמש בכל שם שתרצה עבור פונקציות ההתחלה והסיום של מודול. למעשה השיטה החדשה היא השיטה המועדפת. עם זאת, אנשים רבים עדיין משתמשים ב-init_module() וב-cleanup_module() עבור פונקציות ההתחלה והסיום שלהם. בקוד זה השתמשנו ב-hello_start() כפונקציית init וב-hello_end() כפונקציית ניקוי. דבר נוסף שאולי שמתם לב הוא שבמקום הפונקציה printf() השתמשנו ב-printk(). הסיבה לכך היא שהמודול לא ידפיס שום דבר במסוף, אבל הוא ירשום את ההודעה ב-/var/log/kern.log. מכאן שהוא משמש לאיתור באגים במודולי ליבה. יתר על כן, ישנן שמונה מחרוזות אפשריות של loglevel המוגדרות בכותרת הנדרשות בעת שימוש ב-printk(). רשמנו אותם לפי סדר חומרת הירידה: - KERN_EMERG: משמש עבור הודעות חירום בדרך כלל אלה שלפני התרסקות.
  - KERN_ALERT: מצב הדורש פעולה מיידית.
  - KERN_CRIT: מצבים קריטיים קשורים לעתים קרובות לכשלי חומרה או תוכנה חמורים.
  - KERN_ERR: משמש לדיווח על מצבי שגיאה; מנהלי התקנים משתמשים לעתים קרובות ב-KERN_ERR כדי לדווח על קשיי חומרה.
  - KERN_WARNING: אזהרות לגבי מצבים בעייתיים שאינם יוצרים כשלעצמם בעיות חמורות במערכת.
  - KERN_NOTICE: מצבים נורמליים אך עדיין ראויים לציון. ברמה זו מדווחים מספר תנאים הקשורים לביטחון.
  - KERN_INFO: הודעות מידע. מנהלי התקנים רבים מדפיסים מידע על החומרה שהם מוצאים בזמן ההפעלה ברמה זו.
  - KERN_DEBUG: משמש לאיתור באגים בהודעות.
 השתמשנו ב-KERN_INFO כדי להדפיס את ההודעה. הכנת המערכת להפעלת הקוד:   The system must be prepared to build kernel code and to do this you must have the Linux headers installed on your device. On a typical Linux desktop machine you can use your package manager to locate the correct package to install. For example under 64-bit Debian you can use: 
akshat@gfg:~$ sudo apt-get install build-essential linux-headers-$(uname -r) 
   Makefile כדי להרכיב את קוד המקור:   obj-m = hello.o all: make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 
   **הערה: אל תשכח את רווחי הטאב ב-Makefile     הידור וטעינת המודול:   Run the make command to compile the source code. Then use insmod to load the module. akshat@gfg:~$ make make -C /lib/modules/4.2.0-42-generic/build/ M=/home/akshat/Documents/hello-module modules make[1]: Entering directory `/usr/src/linux-headers-4.2.0-42-generic' CC [M] /home/akshat/Documents/hello-module/hello.o Building modules stage 2. MODPOST 1 modules CC /home/akshat/Documents/hello-module/hello.mod.o LD [M] /home/akshat/Documents/hello-module/hello.ko make[1]: Leaving directory `/usr/src/linux-headers-4.2.0-42-generic' 
 Now we will use insmod to load the hello.ko object. akshat@gfg:~$ sudo insmod hello.ko 
   בדיקת המודול:   You can get information about the module using the modinfo command which will identify the description author and any module parameters that are defined: akshat@gfg:~$ modinfo hello.ko filename: /home/akshat/Documents/hello-module/hello.ko version: 0.1 description: A simple Hello world LKM author: Akshat Sinha license: GPL srcversion: 2F2B1B95DA1F08AC18B09BC depends: vermagic: 4.2.0-42-generic SMP mod_unload modversions 
 To see the message we need to read the kern.log in /var/log directory. akshat@gfg:~$ tail /var/log/kern.log ... ... Sep 10 17:43:39 akshat-gfg kernel: [26380.327886] Hello world To unload the module we run rmmod: akshat@gfg:~$ sudo rmmod hello Now run the tail command to get the exit message. akshat@gfg:~$ tail /var/log/kern.log ... Sep 10 17:43:39 akshat-gfg kernel: [26380.327886] Hello world Sep 10 17:45:42 akshat-gfg kernel: [26503.773982] Goodbye Mr.