...
Code Block |
---|
sunplus@ubuntu:/usr/src/linux-headers-5.10.201$ sudo rm source sunplus@ubuntu:/usr/src/linux-headers-5.10.201$ sudo ln -s /usr/src/linux-headers-5.10.201 /lib/modules/5.10.201/build sunplus@ubuntu:/usr/src/linux-headers-5.10.201$ ll /lib/modules/5.10.201/build/ total 736 drwxr-xr-x 6 4031 501 4096 Mar 27 21:53 ./ drwxr-xr-x 3 root root 4096 Mar 27 21:50 ../ drwxr-xr-x 3 4031 501 4096 Apr 24 2024 arch/ -rw-r--r-- 1 4031 501 135525 Apr 24 2024 .config -rw-r--r-- 1 4031 501 39 Apr 24 2024 .gitignore drwxr-xr-x 4 4031 501 4096 Apr 24 2024 include/ drwxr-xr-x 2 4031 501 4096 Apr 24 2024 kernel/ -rw-r--r-- 1 4031 501 141 Apr 24 2024 Makefile -rw-r--r-- 1 4031 501 1044 Apr 24 2024 .missing-syscalls.d -rw-r--r-- 1 4031 501 576967 Apr 24 2024 Module.symvers drwxr-xr-x 8 4031 501 4096 Apr 24 2024 scripts/ sunplus@ubuntu:/usr/src/linux-headers-5.10.201$ |
Generate kernel scripts for aarch64 and copy scripts to /usr/src/linux-headers-5.10.201
Code Block |
---|
sudo apt update
sudo apt install build-essential fakeroot libncurses5-dev libssl-dev ccache libncurses-dev bison flex libelf-dev
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.201.tar.xz
tar -xf linux-5.10.201.tar.xz
cd linux-5.10.201
cp /usr/src/linux-headers-5.10.201/.config ./
make oldconfig
make prepare
make modules_prepare
make scripts
sudo cp -rf scripts/ /usr/src/linux-headers-5.10.201/ |
Build kernel module
Change gcc version to be 12.3
Code Block |
---|
sudo apt-get install gcc-12
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12 |
Create a sample kernel module with hello.c and Makefile.
Content of hello.c:
Code Block |
---|
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
static int __init hello_init(void)
{
printk(KERN_INFO "Hello, World!\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_INFO "Goodbye, World!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple Hello World Kernel Module"); |
Content of Makefile:
Code Block |
---|
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 |
Build module:
Code Block |
---|
sunplus@ubuntu:~/code/module-temp$ make
make -C /lib/modules/5.10.201/build M=/home/sunplus/code/module-temp modules
make[1]: Entering directory '/usr/src/linux-headers-5.10.201'
CC [M] /home/sunplus/code/module-temp/hello.o
MODPOST /home/sunplus/code/module-temp/Module.symvers
CC [M] /home/sunplus/code/module-temp/hello.mod.o
LD [M] /home/sunplus/code/module-temp/hello.ko
make[1]: Leaving directory '/usr/src/linux-headers-5.10.201' |
It will get hello.ko and you can probe this module with insmod command. You will see this module with lsmod command.
Code Block |
---|
sunplus@ubuntu:~/code/module-temp$ sudo insmod hello.ko
sunplus@ubuntu:~/code/module-temp$ lsmod
Module Size Used by
hello 16384 0
galcore 794624 0
edt_ft5x06 32768 0
sp7350_rng 16384 0
rng_core 24576 1 sp7350_rng |
Another way to build kernel module with DKMS. For introduction of DKMS in ubuntu, please refer to below link:
dkms - Dynamic Kernel Module Support
Install DKMS
Code Block |
---|
sudo apt install dkms |
Create a sample DKMS module:
Code Block |
---|
sudo mkdir -p /usr/src/mymodule-1.0
cd /usr/src/mymodule-1.0
sudo su
echo -e "obj-m += mymodule.o\nall:\n\tmake -C /lib/modules/\$(uname -r)/build M=\$(PWD) modules\nclean:\n\tmake -C /lib/modules/\$(uname -r)/build M=\$(PWD) clean" > /usr/src/mymodule-1.0/Makefile
echo -e "#include <linux/init.h>\n#include <linux/module.h>\nstatic int __init mymodule_init(void){return 0;}\nstatic void __exit mymodule_exit(void){}\nmodule_init(mymodule_init);\nmodule_exit(mymodule_exit);\nMODULE_LICENSE(\"GPL\");" > /usr/src/mymodule-1.0/mymodule.c
echo -e "PACKAGE_NAME=\"mymodule\"\nPACKAGE_VERSION=\"1.0\"\nBUILT_MODULE_NAME[0]=\"mymodule\"\nDEST_MODULE_LOCATION[0]=\"/updates/dkms/\"\nAUTOINSTALL=\"yes\"" > /usr/src/mymodule-1.0/dkms.conf
exit |
Add ,build and install DKMS module to system
Code Block |
---|
sunplus@ubuntu:/usr/src/mymodule-1.0$ sudo dkms add -m mymodule -v 1.0
Creating symlink /var/lib/dkms/mymodule/1.0/source -> /usr/src/mymodule-1.0
sunplus@ubuntu:/usr/src/mymodule-1.0$ sudo dkms build -m mymodule -v 1.0
Kernel preparation unnecessary for this kernel. Skipping...
Building module:
cleaning build area...
make -j4 KERNELRELEASE=5.10.201 -C /lib/modules/5.10.201/build M=/var/lib/dkms/mymodule/1.0/build....
cleaning build area...
sunplus@ubuntu:/usr/src/mymodule-1.0$ sudo dkms install -m mymodule -v 1.0
mymodule.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/5.10.201/updates/dkms/
depmod...
sunplus@ubuntu:/usr/src/mymodule-1.0$ sudo modprobe mymodule
sunplus@ubuntu:/usr/src/mymodule-1.0$ lsmod
Module Size Used by
mymodule 16384 0
hello 16384 0
galcore 794624 0
edt_ft5x06 32768 0
sp7350_rng 16384 0
rng_core 24576 1 sp7350_rng |
Appendix: List of target headers in Makefile within Q654_code_folder/build/
...