Adding Patch to Kernel Module
In this section, you are going to learn
How to create patches ?
How to add patches to kernel module ?
How to add patches using diff and patch commands ?
How to add patches using quilt ?
Topics in this section,
Let us answer few basic questions
What is a patch ?
See Answer
It is a file or set of changes made to a source code of program to modify or update it.
Used to fix bugs or add new features to existing ones.
What are the ways to generate and apply patch ?
See Answer
using diff and patch commands.
using quilt commands.
What is use of diff command ?
See Answer
command use to compare two files line by line.
What is use of patch command ?
See Answer
applies changes to the source code by reading the diff file.
What is the command to generate patch file ?
See Answer
diff -u helloworld_org.c helloworld.c > add_patch_to_helloworld.diff
What is the command to apply the patches to source code ?
See Answer
patch helloworld_org.c < add_patch_to_helloworld.diff
What is the command to remove the patches from source code ?
See Answer
patch -R helloworld_org.c < add_patch_to_helloworld.diff
What is quilt ?
See Answer
Tools used for managing a series of patches applied to the source code repository.
What quilt init does ?
See Answer
quilt init command is used to create a new quilt series.
$ quilt init
The quilt meta-data is now initialized.
What quilt new does ?
See Answer
quilt new is used to create a patch file.
* quilt new patch_file_name.patch
What quilt add does ?
See Answer
quilt add is used to add the source code files which needs to be modified.
quilt add <file1> <file2> ..... <fileN>
What quilt refresh does ?
See Answer
quilt refresh is used to update the series with latest modifications.
What quilt series does ?
See Answer
quilt series is used to display the name of the patches under that series.
What quilt push does ?
See Answer
quilt push is used to apply the patches.
What is quilt pop does ?
See Answer
quilt pop is used to unapply the top most patch in the series.
What quilt top does ?
See Answer
quilt top is used to display the currently applied patch.
It displays the top most patch present in the series.
Let us now explore it in depth !
Step 1: Edit the file which needs to be modified.
Step 2: Generate a patch file using the diff command.
diff -u <original_file_name> <modified_file_name> > <patch_file_name>
Step 3: Now the patches to the file can be applied using patch command.
patch <orginal_file_name> < <patch_file_name>
Now a patch is created and the changes is applied to the file.
1#include <linux/init.h>
2#include <linux/module.h>
3
4MODULE_LICENSE("GPL");
5
6static int __init helloworld_init(void)
7{
8 printk(KERN_INFO "Hello world\n");
9
10 return 0;
11}
12
13static void __exit helloworld_exit(void)
14{
15 printk(KERN_INFO "Exit\n");
16}
17
18module_init(helloworld_init);
19module_exit(helloworld_exit);
20
1#include <linux/init.h>
2#include <linux/module.h>
3
4MODULE_LICENSE("GPL");
5
6static int __init helloworld_init(void)
7{
8 printk(KERN_INFO "Hello world\n");
9 printk(KERN_INFO "Patch added to kernel module\n");
10 return 0;
11}
12
13static void __exit helloworld_exit(void)
14{
15 printk(KERN_INFO "Exit\n");
16}
17
18module_init(helloworld_init);
19module_exit(helloworld_exit);
20
1obj-m += helloworld_original.o
2
3all:
4 make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
5
6clean:
7 make -C /lib/modules/$(shell uname -r)/buld M=$(PWD) clean
$ diff -u helloworld_original.c helloworld_modified.c < add_patch_to_kernel_mod.diff
$ patch helloworld_original.c < add_patch_to_kernel_mod.diff
patching file helloworld_original.c
1--- helloworld_original.c 2024-01-02 16:42:13.460928842 +0530
2+++ helloworld_modified.c 2024-01-02 16:43:11.604579126 +0530
3 -6,7 +6,7
4 static int __init helloworld_init(void)
5 {
6 printk(KERN_INFO "Hello world\n");
7-
8+ printk(KERN_INFO "Patch added to kernel module\n");
9 return 0;
10 }
11
$ make
$ sudo insmod ./helloworld_original.ko
$ sudo rmmmod helloworld_original
$ dmesg
[1233082.552450] Hello world
[1233082.552451] Patch added to kernel module
[1233093.272275] Exit
Step 1: create a new quilt series using quilt init command.
$ quilt init
The quilt meta-data is now initialized.
Step 2: create a patch file using quilt new command.
$ quilt new add_hello_world_patch.patch
Patch patches/add_hello_world_patch.patch is now on top
Step 3: add the file which needs to be modified using quilt add command.
$ quilt add helloworld.c
File helloworld.c added to patch patches/add_hello_world_patch.patch
Step 4: edit the file and make the modifications needed.
$ vi helloworld.c
Step 5: once the changes is added run quilt refresh to update the series with latest modifications.
$ quilt refresh
Refreshed patch patches/add_hello_world_patch.patch
Now a patch is created and changes has been added to the series.
1#include <linux/init.h>
2#include <linux/module.h>
3
4MODULE_LICENSE("GPL");
5MODULE_AUTHOR("Your Name");
6MODULE_DESCRIPTION("Hello World Kernel Module");
7
8static int __init hello_world_init(void) {
9 printk(KERN_INFO "Hello World module loaded\n");
10 return 0;
11}
12
13static void __exit hello_world_exit(void) {
14 printk(KERN_INFO "Hello World module unloaded\n");
15}
16
17module_init(hello_world_init);
18module_exit(hello_world_exit);
19
1obj-m += helloworld.o
2KDIR := /lib/modules/$(shell uname -r)/build
3
4QUILT_SERIES = my_patches
5PATCHES_DIR = patches
6
7all: apply_patches
8 $(MAKE) -C $(KDIR) M=$(PWD) modules
9
10apply_patches:
11 quilt push || true
12
13.PHONY: clean
14clean:
15 quilt pop -a || true
16 $(MAKE) -C $(KDIR) M=$(PWD) clean
17
$ quilt init
The quilt meta-data is now initialized.
$ quilt new add_hello_world_patch.patch
Patch patches/add_hello_world_patch.patch is now on top
$ quilt add helloworld.c
File helloworld.c added to patch patches/add_hello_world_patch.patch
$ vi helloworld.c
$ quilt refresh
Refreshed patch patches/add_hello_world_patch.patch
1Index: app/helloworld.c
2===================================================================
3--- app.orig/helloworld.c
4+++ app/helloworld.c
5
6
7 static int __init hello_world_init(void) {
8 printk(KERN_INFO "Hello World!\n");
9+ printk(KERN_INFO "patches applied to kernel module!\n");
10 return 0;
11 }
12
$ make
sudo insmod ./helloworld.ko
$ dmesg
[10472.955996] Hello World module loaded
[10955.989570] patches applied to kernel module!
$ lsmod | grep helloworld
helloworld 16384 0
$ sudo rmmod ./helloworld
$ dmesg
[10516.629413] Hello World module unloaded
Other topics of linux x86
Current Module
Previous Module
Next Module
Other Modules