SlideShare a Scribd company logo
Linux Kernel
Modules
Eddy Reyes eddy@tasqr.io
Eddy Reyes
Founder of Tasqr (www.tasqr.io)
In my past life:
● IBM- AIX kernel developer
● Lifesize- Linux device driver developer
● Various other non-kernel software
development
Linux Kernel Modules
In this presentation, I will show what is a Linux
Kernel Module
● Kernel module-
○ Code that executes as part of the Linux kernel
○ Extends the capabilities and sometimes might
modify the behavior of the kernel
Let’s Back Up For a Second...
What exactly is the Linux Kernel?
Your Computer == Pile of Hardware
Your average computer (or phone) has a quite
large variety of hardware.
● CPU, Disk, NIC, GPU, Speakers, Display,
RAM, DVD Drive, Game Controller,
Webcam, Microphone, GSM Radio, WiFi,
Keyboard, Mouse, Touch Screen, etc.
What Is the Kernel?
Very simple answer: it's a program that makes
your hardware look and feel like an OS to other
programs
Hardware (CPU, Keyboard, Disk, Monitor)
Linux Kernel
GNOME bash cat Chome grep
Who Uses the Kernel?
The kernel provides a way for other programs
to use the hardware under a common model
called an “Operating System”
● The kernel is not designed for direct human
consumption (no UI)
● The kernel’s user is other programs
● Linux conforms to the POSIX specification.
Hardware Protection
Most modern processors protect access to
hardware
● User Mode… running program:
○ Has no access to hardware
○ Has its own dedicated address space
● Privileged Mode… running program:
○ Can mess with all hardware
○ Has access to single shared global address space
When Does Kernel Code Execute?
The Kernel has 2 primary entry points:
● On behalf of a process
○ When that process calls a system call
● In response to a hardware interrupt
○ You just pressed a key
○ Your disk just finished storing a block of data
○ A network packet just arrived
○ The timer just ticked
Kernel And Hardware
Kernel is the middle-man for hardware access.
Disk Kernel
System Call
cat ~/file
interrupt
System Call Layer
The kernel provides system calls for user
programs to perform actions that require
Privileged Mode:
● Example: cat ~/my-file
○ fd = open(“/home/eddy/myfile”)
○ contents = read(fd)
○ close(fd)
○ print(contents)
Linux vs. Linux Ecosystem
“Linux” originally referred only to the kernel.
● Linus only works on the kernel
● He doesn’t care a whole lot about what
happens outside of that
○ Except when something irritates him :-)
All the programs you use live outside of the
kernel (GNU/Linux, all distros)
Back to Kernel Modules
Almost all problems are solved in user space
programs.
● Why do we need kernel modules?
○ I have some hardware I want to make work in Linux
○ I want to create a program that resides in the kernel
and runs in privileged mode
■ In practice, almost never happens
To Write a Kernel Module...
● Kernel Modules are written in the C
programming language.
● You must have a Linux kernel source tree to
build your module.
● You must be running the same kernel you
built your module with to run it.
Anatomy of a Kernel Module
A kernel module file has several typical
components:
● MODULE_AUTHOR(“your name”)
● MODULE_LICENSE(“GPL”)
○ The license must be an open source license (GPL,
BSD, etc.) or you will “taint” your kernel.
■ Tainted kernel loses many abilities to run other
other open source modules and capabilities.
Anatomy of a Kernel Module
● int init_module(void)
○ Called when the kernel loads your module.
○ Initialize all your stuff here.
○ Return 0 if all went well, negative if something blew
up.
● void cleanup_module(void)
○ Called when the kernel unloads your module.
○ Free all your resources here.
Hello World Kernel Module Example
#include <linux/kernel.h>
#include <linux/module.h>
MODULE_AUTHOR(“Eddy Reyes”);
MODULE_LICENSE(“GPL”);
int init_module(void)
{
printk(KERN_ALERT “Hello worldn”);
return 0;
}
void cleanup_module(void)
{
printk(KERN_ALERT “Goodbye, cruel worldn”);
}
Kernel Programming Environment
● Kernel has no libc, none of the standard headers and
libraries you are used to.
○ i.e. No system calls, no standard buffered output
(stdio.h)
● No memory protection!
○ You can stomp on any other part of memory, no one
will stop you.
Kernel Programming Environment
● One big single namespace
○ You have access to all “exported” symbols from your
kernel module.
○ Exported functions are called “kernel services”
● Always multi-threaded
○ All modules must be thread-safe, like it or not
○ What about single-processor systems?
■ No concurrency, but Linux is a preemptable
Building Your Kernel Module
● Accompany your module with a 1-line GNU Makefile:
○ obj-m += hello.o
○ Assumes file name is “hello.c”
● Run the magic make command:
○ make -C <kernel-src> M=`pwd` modules
○ Produces: hello.ko
Assumes current directory is the module source.
Running Your Kernel Module
● To manually load your module:
○ insmod hello.ko
○ Where’s our hello world message?
■ dmesg
● To unload your module:
○ rmmod hello.ko
Kernel Module Dependencies
insmod/rmmod can be cumbersome...
● You must manually enforce inter-module dependencies.
Modprobe automatically manages dependent modules
● Copy hello.ko into /lib/modules/<version>
● Run depmod
● modprobe hello / modprobe -r hello
Dependent modules are automatically loaded/unloaded.
More Interesting Example...
Let’s make a character device
● /dev/hello-char
● When you read from it, it says “hello”
● Doesn’t let you write into it
Character devices are tracked by the kernel via
major and minor numbers
● Major == type of device, Minor == nth device
Hello Char Device
Linux Kernel uses an “ops” struct pattern that
allows you to fill in behaviors via callbacks.
struct file_operations fops = {
.open = open_dev,
.close = close_dev,
.read = read_dev,
.write = write_dev
}
Registering Your Device
Kernel Service- register_chrdev()
● Accepts:
○ Major number (0 tells the kernel to pick one)
○ Device type name (appears in /proc/devices)
○ Pointer to fops struct
● Call this in the init_module() routine
Reading / Writing From Your Device
● cat /dev/hello-char
○ Calls your read_dev() function
● echo hi >/dev/hello-char
○ Calls your write_dev() function
read_dev must return 0 when the device has no more data.
Using Your Device
Demo...
Linux Device Model
If you write a real device driver, don’t follow this
example. Further reading:
● Linux Device Model
○ Much richer API for modules that implement device
drivers
○ Integrates with udev
○ Not available on tainted kernels!
■ Must be open source to use this.
Congratulations!
We’ve built a couple kernel modules together!
Any lingering questions?

More Related Content

What's hot (20)

PDF
Linux scheduler
Liran Ben Haim
 
PDF
Linux kernel debugging
libfetion
 
PDF
Linux kernel modules
Dheryta Jaisinghani
 
PPTX
Linux Boot Process
darshhingu
 
PPTX
System Booting Process overview
RajKumar Rampelli
 
PDF
Linux boot process
Archana Chandrasekharan
 
PDF
Linux systems - Linux Commands and Shell Scripting
Emertxe Information Technologies Pvt Ltd
 
PDF
Launch the First Process in Linux System
Jian-Hong Pan
 
PDF
Introduction To Linux Kernel Modules
dibyajyotig
 
PPT
Memory management
Vishal Singh
 
PDF
A practical guide to buildroot
Emertxe Information Technologies Pvt Ltd
 
PDF
Linux kernel
Mahmoud Shiri Varamini
 
PPT
Kernel module programming
Vandana Salve
 
PDF
BusyBox for Embedded Linux
Emertxe Information Technologies Pvt Ltd
 
PDF
Introduction to Ubuntu
Khairul Aizat Kamarudzzaman
 
PDF
Linux Internals - Part III
Emertxe Information Technologies Pvt Ltd
 
PDF
Part 01 Linux Kernel Compilation (Ubuntu)
Tushar B Kute
 
PPTX
Linux Initialization Process (1)
shimosawa
 
PPTX
Linux Kernel Module - For NLKB
shimosawa
 
Linux scheduler
Liran Ben Haim
 
Linux kernel debugging
libfetion
 
Linux kernel modules
Dheryta Jaisinghani
 
Linux Boot Process
darshhingu
 
System Booting Process overview
RajKumar Rampelli
 
Linux boot process
Archana Chandrasekharan
 
Linux systems - Linux Commands and Shell Scripting
Emertxe Information Technologies Pvt Ltd
 
Launch the First Process in Linux System
Jian-Hong Pan
 
Introduction To Linux Kernel Modules
dibyajyotig
 
Memory management
Vishal Singh
 
A practical guide to buildroot
Emertxe Information Technologies Pvt Ltd
 
Kernel module programming
Vandana Salve
 
BusyBox for Embedded Linux
Emertxe Information Technologies Pvt Ltd
 
Introduction to Ubuntu
Khairul Aizat Kamarudzzaman
 
Linux Internals - Part III
Emertxe Information Technologies Pvt Ltd
 
Part 01 Linux Kernel Compilation (Ubuntu)
Tushar B Kute
 
Linux Initialization Process (1)
shimosawa
 
Linux Kernel Module - For NLKB
shimosawa
 

Viewers also liked (20)

PPTX
Linux Kernel Programming
Nalin Sharma
 
PPT
Linux Kernel Development
Priyank Kapadia
 
PPTX
Kernel modules
Elmàgic Àlàâ
 
PDF
Kernel Configuration and Compilation
Bud Siddhisena
 
PDF
Gumby: Package Dependency Visualization for Linux
Andre Guerreiro
 
PDF
Psi android telephony_case_study_v10
Primesoftinc
 
PPTX
Labmeeting - 20150211 - Novel End-to-End Voice Encryption Method in GSM System
Syuan Wang
 
PDF
Introduction to Information Visualization (Part 1)
Andrew Vande Moere
 
PPTX
Encrypted Voice Communications
sbwahid
 
PDF
Android presentation
Siva Ramakrishna kv
 
PPTX
Voice encryption for gsm using arduino
iruldaworld
 
PPT
RT Procedure new KTM
Raj Pradhan
 
PPT
Cellular network
Aman Niranjan
 
PDF
Android telephony stack
David Marques
 
PDF
Android Telephony Manager and SMS
Jussi Pohjolainen
 
PPT
Basic Linux kernel
Morteza Nourelahi Alamdari
 
PPT
5432 cellular network
Raafat younis
 
PPT
Voice securityprotocol review
Fabio Pietrosanti
 
PDF
RIL and Android Telephony
Leaf Johnson
 
Linux Kernel Programming
Nalin Sharma
 
Linux Kernel Development
Priyank Kapadia
 
Kernel modules
Elmàgic Àlàâ
 
Kernel Configuration and Compilation
Bud Siddhisena
 
Gumby: Package Dependency Visualization for Linux
Andre Guerreiro
 
Psi android telephony_case_study_v10
Primesoftinc
 
Labmeeting - 20150211 - Novel End-to-End Voice Encryption Method in GSM System
Syuan Wang
 
Introduction to Information Visualization (Part 1)
Andrew Vande Moere
 
Encrypted Voice Communications
sbwahid
 
Android presentation
Siva Ramakrishna kv
 
Voice encryption for gsm using arduino
iruldaworld
 
RT Procedure new KTM
Raj Pradhan
 
Cellular network
Aman Niranjan
 
Android telephony stack
David Marques
 
Android Telephony Manager and SMS
Jussi Pohjolainen
 
Basic Linux kernel
Morteza Nourelahi Alamdari
 
5432 cellular network
Raafat younis
 
Voice securityprotocol review
Fabio Pietrosanti
 
RIL and Android Telephony
Leaf Johnson
 
Ad

Similar to Linux kernel modules (20)

PPTX
Linux Device Driver’s
Rashmi Warghade
 
PDF
Linux Module Programming
Amir Payberah
 
PPTX
Device Drivers and Running Modules
YourHelper1
 
PDF
Linux device driver
chatsiri
 
PPTX
LINUX M1 P4 notes.pptxgyfdes e4e4e54v 4
abhinandpk2405
 
PDF
brief intro to Linux device drivers
Alexandre Moreno
 
PDF
Course 102: Lecture 25: Devices and Device Drivers
Ahmed El-Arabawy
 
PDF
Unit 6 Operating System TEIT Savitribai Phule Pune University by Tushar B Kute
Tushar B Kute
 
PPTX
Linux device drivers
Abhishek Sagar
 
PPT
Linux Device Driver for Writing a real world driver for embedded Linux
AchyuthShettigar2
 
PDF
Studienarb linux kernel-dev
murali_purushothaman
 
PDF
Compiling kernel.pdf Compiling kernel Compiling kernel
RaghuBR9
 
PPT
lecture_1_introduction.ppt
RandyGaray
 
PPT
lecture_1_introduction_linux_1234567.ppt
ubalearchana6
 
PDF
Embedded Android : System Development - Part II (Linux device drivers)
Emertxe Information Technologies Pvt Ltd
 
PPT
Driver_linux
Sayanton Vhaduri
 
PPT
lesson03.ppt
IraqReshi
 
PPTX
managing kernal module from egineering sunject operating system
mohammadshahnawaz77
 
PDF
Linux_kernelmodule
sudhir1223
 
PPTX
Pppt
R.Hanan Raj
 
Linux Device Driver’s
Rashmi Warghade
 
Linux Module Programming
Amir Payberah
 
Device Drivers and Running Modules
YourHelper1
 
Linux device driver
chatsiri
 
LINUX M1 P4 notes.pptxgyfdes e4e4e54v 4
abhinandpk2405
 
brief intro to Linux device drivers
Alexandre Moreno
 
Course 102: Lecture 25: Devices and Device Drivers
Ahmed El-Arabawy
 
Unit 6 Operating System TEIT Savitribai Phule Pune University by Tushar B Kute
Tushar B Kute
 
Linux device drivers
Abhishek Sagar
 
Linux Device Driver for Writing a real world driver for embedded Linux
AchyuthShettigar2
 
Studienarb linux kernel-dev
murali_purushothaman
 
Compiling kernel.pdf Compiling kernel Compiling kernel
RaghuBR9
 
lecture_1_introduction.ppt
RandyGaray
 
lecture_1_introduction_linux_1234567.ppt
ubalearchana6
 
Embedded Android : System Development - Part II (Linux device drivers)
Emertxe Information Technologies Pvt Ltd
 
Driver_linux
Sayanton Vhaduri
 
lesson03.ppt
IraqReshi
 
managing kernal module from egineering sunject operating system
mohammadshahnawaz77
 
Linux_kernelmodule
sudhir1223
 
Ad

Recently uploaded (20)

PPT
Brief History of Python by Learning Python in three hours
adanechb21
 
PDF
Infrastructure planning and resilience - Keith Hastings.pptx.pdf
Safe Software
 
PDF
Enhancing Security in VAST: Towards Static Vulnerability Scanning
ESUG
 
PDF
Troubleshooting Virtual Threads in Java!
Tier1 app
 
PPTX
TRAVEL APIs | WHITE LABEL TRAVEL API | TOP TRAVEL APIs
philipnathen82
 
PDF
Enhancing Healthcare RPM Platforms with Contextual AI Integration
Cadabra Studio
 
PDF
Applitools Platform Pulse: What's New and What's Coming - July 2025
Applitools
 
PPTX
Role Of Python In Programing Language.pptx
jaykoshti048
 
PDF
MiniTool Power Data Recovery Crack New Pre Activated Version Latest 2025
imang66g
 
PDF
WatchTraderHub - Watch Dealer software with inventory management and multi-ch...
WatchDealer Pavel
 
PPTX
Employee salary prediction using Machine learning Project template.ppt
bhanuk27082004
 
PDF
New Download FL Studio Crack Full Version [Latest 2025]
imang66g
 
PDF
Salesforce Pricing Update 2025: Impact, Strategy & Smart Cost Optimization wi...
GetOnCRM Solutions
 
PDF
Step-by-Step Guide to Install SAP HANA Studio | Complete Installation Tutoria...
SAP Vista, an A L T Z E N Company
 
PDF
Generating Union types w/ Static Analysis
K. Matthew Dupree
 
PDF
How to Download and Install ADT (ABAP Development Tools) for Eclipse IDE | SA...
SAP Vista, an A L T Z E N Company
 
PDF
SAP GUI Installation Guide for macOS (iOS) | Connect to SAP Systems on Mac
SAP Vista, an A L T Z E N Company
 
PDF
System Center 2025 vs. 2022; What’s new, what’s next_PDF.pdf
Q-Advise
 
PDF
SAP GUI Installation Guide for Windows | Step-by-Step Setup for SAP Access
SAP Vista, an A L T Z E N Company
 
PDF
AWS_Agentic_AI_in_Indian_BFSI_A_Strategic_Blueprint_for_Customer.pdf
siddharthnetsavvies
 
Brief History of Python by Learning Python in three hours
adanechb21
 
Infrastructure planning and resilience - Keith Hastings.pptx.pdf
Safe Software
 
Enhancing Security in VAST: Towards Static Vulnerability Scanning
ESUG
 
Troubleshooting Virtual Threads in Java!
Tier1 app
 
TRAVEL APIs | WHITE LABEL TRAVEL API | TOP TRAVEL APIs
philipnathen82
 
Enhancing Healthcare RPM Platforms with Contextual AI Integration
Cadabra Studio
 
Applitools Platform Pulse: What's New and What's Coming - July 2025
Applitools
 
Role Of Python In Programing Language.pptx
jaykoshti048
 
MiniTool Power Data Recovery Crack New Pre Activated Version Latest 2025
imang66g
 
WatchTraderHub - Watch Dealer software with inventory management and multi-ch...
WatchDealer Pavel
 
Employee salary prediction using Machine learning Project template.ppt
bhanuk27082004
 
New Download FL Studio Crack Full Version [Latest 2025]
imang66g
 
Salesforce Pricing Update 2025: Impact, Strategy & Smart Cost Optimization wi...
GetOnCRM Solutions
 
Step-by-Step Guide to Install SAP HANA Studio | Complete Installation Tutoria...
SAP Vista, an A L T Z E N Company
 
Generating Union types w/ Static Analysis
K. Matthew Dupree
 
How to Download and Install ADT (ABAP Development Tools) for Eclipse IDE | SA...
SAP Vista, an A L T Z E N Company
 
SAP GUI Installation Guide for macOS (iOS) | Connect to SAP Systems on Mac
SAP Vista, an A L T Z E N Company
 
System Center 2025 vs. 2022; What’s new, what’s next_PDF.pdf
Q-Advise
 
SAP GUI Installation Guide for Windows | Step-by-Step Setup for SAP Access
SAP Vista, an A L T Z E N Company
 
AWS_Agentic_AI_in_Indian_BFSI_A_Strategic_Blueprint_for_Customer.pdf
siddharthnetsavvies
 

Linux kernel modules

  • 2. Eddy Reyes Founder of Tasqr (www.tasqr.io) In my past life: ● IBM- AIX kernel developer ● Lifesize- Linux device driver developer ● Various other non-kernel software development
  • 3. Linux Kernel Modules In this presentation, I will show what is a Linux Kernel Module ● Kernel module- ○ Code that executes as part of the Linux kernel ○ Extends the capabilities and sometimes might modify the behavior of the kernel
  • 4. Let’s Back Up For a Second... What exactly is the Linux Kernel?
  • 5. Your Computer == Pile of Hardware Your average computer (or phone) has a quite large variety of hardware. ● CPU, Disk, NIC, GPU, Speakers, Display, RAM, DVD Drive, Game Controller, Webcam, Microphone, GSM Radio, WiFi, Keyboard, Mouse, Touch Screen, etc.
  • 6. What Is the Kernel? Very simple answer: it's a program that makes your hardware look and feel like an OS to other programs Hardware (CPU, Keyboard, Disk, Monitor) Linux Kernel GNOME bash cat Chome grep
  • 7. Who Uses the Kernel? The kernel provides a way for other programs to use the hardware under a common model called an “Operating System” ● The kernel is not designed for direct human consumption (no UI) ● The kernel’s user is other programs ● Linux conforms to the POSIX specification.
  • 8. Hardware Protection Most modern processors protect access to hardware ● User Mode… running program: ○ Has no access to hardware ○ Has its own dedicated address space ● Privileged Mode… running program: ○ Can mess with all hardware ○ Has access to single shared global address space
  • 9. When Does Kernel Code Execute? The Kernel has 2 primary entry points: ● On behalf of a process ○ When that process calls a system call ● In response to a hardware interrupt ○ You just pressed a key ○ Your disk just finished storing a block of data ○ A network packet just arrived ○ The timer just ticked
  • 10. Kernel And Hardware Kernel is the middle-man for hardware access. Disk Kernel System Call cat ~/file interrupt
  • 11. System Call Layer The kernel provides system calls for user programs to perform actions that require Privileged Mode: ● Example: cat ~/my-file ○ fd = open(“/home/eddy/myfile”) ○ contents = read(fd) ○ close(fd) ○ print(contents)
  • 12. Linux vs. Linux Ecosystem “Linux” originally referred only to the kernel. ● Linus only works on the kernel ● He doesn’t care a whole lot about what happens outside of that ○ Except when something irritates him :-) All the programs you use live outside of the kernel (GNU/Linux, all distros)
  • 13. Back to Kernel Modules Almost all problems are solved in user space programs. ● Why do we need kernel modules? ○ I have some hardware I want to make work in Linux ○ I want to create a program that resides in the kernel and runs in privileged mode ■ In practice, almost never happens
  • 14. To Write a Kernel Module... ● Kernel Modules are written in the C programming language. ● You must have a Linux kernel source tree to build your module. ● You must be running the same kernel you built your module with to run it.
  • 15. Anatomy of a Kernel Module A kernel module file has several typical components: ● MODULE_AUTHOR(“your name”) ● MODULE_LICENSE(“GPL”) ○ The license must be an open source license (GPL, BSD, etc.) or you will “taint” your kernel. ■ Tainted kernel loses many abilities to run other other open source modules and capabilities.
  • 16. Anatomy of a Kernel Module ● int init_module(void) ○ Called when the kernel loads your module. ○ Initialize all your stuff here. ○ Return 0 if all went well, negative if something blew up. ● void cleanup_module(void) ○ Called when the kernel unloads your module. ○ Free all your resources here.
  • 17. Hello World Kernel Module Example #include <linux/kernel.h> #include <linux/module.h> MODULE_AUTHOR(“Eddy Reyes”); MODULE_LICENSE(“GPL”); int init_module(void) { printk(KERN_ALERT “Hello worldn”); return 0; } void cleanup_module(void) { printk(KERN_ALERT “Goodbye, cruel worldn”); }
  • 18. Kernel Programming Environment ● Kernel has no libc, none of the standard headers and libraries you are used to. ○ i.e. No system calls, no standard buffered output (stdio.h) ● No memory protection! ○ You can stomp on any other part of memory, no one will stop you.
  • 19. Kernel Programming Environment ● One big single namespace ○ You have access to all “exported” symbols from your kernel module. ○ Exported functions are called “kernel services” ● Always multi-threaded ○ All modules must be thread-safe, like it or not ○ What about single-processor systems? ■ No concurrency, but Linux is a preemptable
  • 20. Building Your Kernel Module ● Accompany your module with a 1-line GNU Makefile: ○ obj-m += hello.o ○ Assumes file name is “hello.c” ● Run the magic make command: ○ make -C <kernel-src> M=`pwd` modules ○ Produces: hello.ko Assumes current directory is the module source.
  • 21. Running Your Kernel Module ● To manually load your module: ○ insmod hello.ko ○ Where’s our hello world message? ■ dmesg ● To unload your module: ○ rmmod hello.ko
  • 22. Kernel Module Dependencies insmod/rmmod can be cumbersome... ● You must manually enforce inter-module dependencies. Modprobe automatically manages dependent modules ● Copy hello.ko into /lib/modules/<version> ● Run depmod ● modprobe hello / modprobe -r hello Dependent modules are automatically loaded/unloaded.
  • 23. More Interesting Example... Let’s make a character device ● /dev/hello-char ● When you read from it, it says “hello” ● Doesn’t let you write into it Character devices are tracked by the kernel via major and minor numbers ● Major == type of device, Minor == nth device
  • 24. Hello Char Device Linux Kernel uses an “ops” struct pattern that allows you to fill in behaviors via callbacks. struct file_operations fops = { .open = open_dev, .close = close_dev, .read = read_dev, .write = write_dev }
  • 25. Registering Your Device Kernel Service- register_chrdev() ● Accepts: ○ Major number (0 tells the kernel to pick one) ○ Device type name (appears in /proc/devices) ○ Pointer to fops struct ● Call this in the init_module() routine
  • 26. Reading / Writing From Your Device ● cat /dev/hello-char ○ Calls your read_dev() function ● echo hi >/dev/hello-char ○ Calls your write_dev() function read_dev must return 0 when the device has no more data.
  • 28. Linux Device Model If you write a real device driver, don’t follow this example. Further reading: ● Linux Device Model ○ Much richer API for modules that implement device drivers ○ Integrates with udev ○ Not available on tainted kernels! ■ Must be open source to use this.
  • 29. Congratulations! We’ve built a couple kernel modules together! Any lingering questions?