[英]how to compile a kernel module
我正在尝试按照本指南编译一个简单的hello world模块,我对Makefile实际上在做什么感到困惑。
obj-m += hello-1.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
据我所知,当我输入make
命令时,它将运行运行make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
的all
配方。 所以现在它运行在-C
标志之后给出的路径上找到的Makefile但是M=$(PWD) modules
做了什么?
' all and clean ': - 如果你默认运行'make',它将运行“all:”。 但我们可以使用all和clean with make。 它只会运行那些特定的命令。
Example :- 'make all' will run "make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules" 'make clean will run "make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean"
3.” uname -r ': - 获取有关当前内核的名称和信息。
Example :- for me, my kernel is "4.6.0-rc1".
选项' -C dir ': - 在读取makefile之前更改目录dir。
Example :- "make -C /lib/modules/$(shell uname -r)/build" will change to "make -C /lib/modules/4.6.0-rc1/build.
现在,您希望使用“ make -C / lib / modules / $(shell uname -r)/ build M = $(PWD) modules”来创建可加载模块。
您的源代码需要运行环境。 这就是我们必须使用-C选项来更改构建目录的原因。 哪些都需要定义,头文件,宏等等。现在更改为构建目录后,您需要告诉您的模块在哪里,这就是我们使用M = $ PWD的原因。
要编译内核模块,您通常需要的make
命令采用以下形式:
make -C /lib/modules/3.16.0-70-generic/build M=/home/test/ldd3/hello modules
其中, -C
表示切换到另一条路径。
/lib/modules/3.16.0-70-generic/
是使用中的内核的路径,和
/home/test/ldd3/hello
是模块源所在的位置。
M = $(PWD)模块有什么作用?
所以我说M=$(PWD)
只是一个shell变量,它存储了内核模块的当前路径。 make
需要在切换到内核构建路径时存储它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.