Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

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/

...