C 如何编译内核模块
我正试图编译一个简单的hello world模块,但我不知道Makefile实际上在做什么C 如何编译内核模块,c,makefile,linux-kernel,linux-device-driver,C,Makefile,Linux Kernel,Linux Device Driver,我正试图编译一个简单的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命令时,它将运行all配方,该配方运行make-C/lib
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
命令时,它将运行all
配方,该配方运行make-C/lib/modules/$(shell uname-r)/build M=$(PWD)modules
。因此,现在它运行在-C
标志后给出的路径中找到的Makefile,但是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变量,它存储到内核模块的当前路径<代码>生成在切换到内核构建路径时需要存储该文件
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"
Example :- for me, my kernel is "4.6.0-rc1".
Example :- "make -C /lib/modules/$(shell uname -r)/build" will change to "make -C /lib/modules/4.6.0-rc1/build.
您的源代码需要在环境中运行。这就是为什么我们必须使用-C选项来更改构建目录。它们有所有需要的定义、头文件、宏等。现在在更改到构建目录后,您需要告诉模块所在的位置,这就是为什么我们使用M=$PWD。好的,谢谢,但是
M=$(PWD)模块有什么相关问题:。我从中下载了设备内核源代码,但没有构建文件夹!实际上,如果运行̀make`,默认情况下它将运行第一个定义的目标,除非名为.default_GOAL的变量定义为另一个目标的名称。