This digest from http://blog.csdn.net/lufeiop02/article/details/6446343
Linux drivers are generally loaded in the form of module modules, which first need to compile the driver into the form of a module. A simple example,
#include <linux/init.h>#include<linux/kernel.h>#include<linux/module.h>Static int__init Test_init (void) {PRINTK ("Init module/n"); return 0;}Static void__exit Test_exit (void) {PRINTK ("Exit modules/n");} Module_init (Test_init); Module_exit (test_exit);
Makefile is:
PWD ==/usr/src/linux-source-2.6. / obj-M: = test.omodule-objs: = test.o All: -C $ (KERNEL_SRC) m=$ (PWD) Modules Clean : *. Ko *.o
Run make in the same directory as test.c and makefile, if you see similar output
Make-c/usr/src/linux-source-2.6. m=/home/vmeth modulesmake[1]: Entering directory '/usr/src/linux-source-2.6 . the ' CC [M] /home/vmeth/hello.o 2. Modpost CC /home/vmeth/hello.mod.o LD [M] /home/vmeth/hello.komake[ 1]: Leaving directory '/usr/src/linux-source-2.6. the '
# Makefile2. 6 Ifneq ($ (kernelrelease),) #kbuild syntax. Dependency Relationshsip of files and target modules are listed Here.mymodule -OBJS: = hello.oobj-M: = hello.oelsePWD :=? = $ (shell Uname-R) Kdir:=/lib/modules/$ (kver)/build #KDIR目录其实是链接到上面那个Makefile中的那个 /usr/src/ linux-source-2.6. the /* All in: $ (make)-C $ (Kdir) m=$ (PWD) Clean: rm-rf. *.cmd *.o *.mod.c *.ko. Tmp_versionsendif
Kernelrelease is a variable defined in the top-level makefile of the kernel source, and kernelrelease is not defined when the first read executes this makefile, so make reads the content after the else is executed. When the target of make is all, the-C $ (kdir) indicates that jumping to the kernel source directory reads the makefile;m=$ (PWD) there and then returns to the current directory to continue to read in and execute the current makefile. When returned from the kernel source directory, Kernelrelease has been defined and Kbuild is also initiated to parse the Kbuild syntax, and make will continue to read the content before else. Else before is a Kbuild syntax statement that indicates the dependencies of the files in the module's source code and the name of the target module to be generated. The name of each kernel contains its version number, which is also the value displayed by the Uname-r command. Resolution for the following error: makefile:1: * * * missing delimiter This has a number of situations: 1, the command before the TAB key 2, may be the punctuation into a Chinese-shaped 3, such as the above file: Ifneq to add a space after
Linux-powered Modular drive Makefile