Versions Compared

Key

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

...

Code Block
wellslu@scdiu3:~/Q654$ ll linux-headers-5.10.201/
total 736
drwxr-xr-x  6 wellslu sp   4096 Apr 24 13:16 ./
drwxr-xr-x 12 wellslu sp   4096 Apr 24 13:16 ../
drwxr-xr-x  3 wellslu sp   4096 Apr 24 13:16 arch/
-rw-r--r--  1 wellslu sp 135525 Apr 24 13:16 .config
-rw-r--r--  1 wellslu sp     39 Apr 24 13:16 .gitignore
drwxr-xr-x  4 wellslu sp   4096 Apr 24 13:16 include/
drwxr-xr-x  2 wellslu sp   4096 Apr 24 13:16 kernel/
-rw-r--r--  1 wellslu sp    141 Apr 24 13:16 Makefile
-rw-r--r--  1 wellslu sp   1044 Apr 24 13:16 .missing-syscalls.d
-rw-r--r--  1 wellslu sp 576967 Apr 24 13:16 Module.symvers
drwxr-xr-x  8 wellslu sp   4096 Apr 24 13:16 scripts/
lrwxrwxrwx  1 wellslu sp     31 Apr 24 13:16 source -> /home/wellslu/Q654/linux/kernel/
wellslu@scdiu3:~/Q654$ 

Install Linux

...

Kernel-headers

Before using the Linux kernel headers, copy the linux-headers-5.10.201 folder to /usr/src/ on your target board. Refer to report of ll command in Ubuntu where linux-headers has been copied to:

...

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

...

a Kernel Module (an example)

To ensure compatibility, update your GCC version to 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 simple kernel module with by setting up two files: 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 moduleNavigate to your module directory and build it using the make command. You should see output similar to this:

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 This process will get generate a hello.ko and you can probe this module with insmod command. You will see this module with lsmod command. file, which is the compiled kernel module.

You can load the compiled module into the kernel with the insmod command and verify its presence with lsmod:

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

...

Building a Kernel Module with DKMS

Dynamic Kernel Module Support (DKMS) allows you to automatically rebuild kernel modules when a new kernel is installed. Refer to below link for an introduction of DKMS in ubuntu, please refer to below linkUbuntu:

dkms - Dynamic Kernel Module Support

Install DKMS

Code Block
sudo apt install dkms

Create a

...

Sample DKMS Module

First, set up a new directory and create the necessary files:

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

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

...

build/ in Project Top-directory

Code Block
headers:
	@KERNELRELEASE=$(shell cat $(LINUX_PATH)/include/config/kernel.release 2>/dev/null)
	@if ! [ -f $(LINUX_PATH)/.config ]; then \
		echo File \'$(LINUX_PATH)/.config\' does not exist!; \
		exit 1; \
	fi
	@if ! [ -f $(LINUX_PATH)/Module.symvers ]; then \
		echo File \'$(LINUX_PATH)/Module.symvers\' does not exist!; \
		exit 1; \
	fi
	rm -rf linux-headers-$(KERNELRELEASE)
	mkdir -p linux-headers-$(KERNELRELEASE)
	cp -f $(LINUX_PATH)/.config linux-headers-$(KERNELRELEASE)
	cp -f $(LINUX_PATH)/Module.symvers linux-headers-$(KERNELRELEASE)
	$(MAKE_ARCH) $(MAKE_JOBS) -C $(LINUX_PATH) CROSS_COMPILE=$(CROSS_COMPILE_FOR_LINUX) mrproper
	$(MAKE_ARCH) $(MAKE_JOBS) -C $(LINUX_PATH) O=../../linux-headers-$(KERNELRELEASE) CROSS_COMPILE=$(CROSS_COMPILE_FOR_LINUX) modules_prepare
	$(MAKE_ARCH) $(MAKE_JOBS) -C $(LINUX_PATH) headers_install INSTALL_HDR_PATH=../../linux-headers-$(KERNELRELEASE) CROSS_COMPILE=$(CROSS_COMPILE_FOR_LINUX)
	rm linux-headers-$(KERNELRELEASE)/source
	cp -rf $(LINUX_PATH)/include linux-headers-$(KERNELRELEASE)
	mkdir -p linux-headers-$(KERNELRELEASE)/arch
	cp -rf $(LINUX_PATH)/arch/arm64 linux-headers-$(KERNELRELEASE)/arch
	cp -f $(LINUX_PATH)/Makefile linux-headers-$(KERNELRELEASE)
	cp -rf $(LINUX_PATH)/scripts linux-headers-$(KERNELRELEASE)

...