C 如何编译内核模块

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

我正试图编译一个简单的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/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变量,它存储到内核模块的当前路径<代码>生成在切换到内核构建路径时需要存储该文件

  • obj-m”:-指定生成为可加载的对象文件 内核模块
  • all and clean”:-如果默认情况下运行“make”,它将运行“all:”。 但我们可以使用所有的和干净的制造。它将只运行那些特定的命令

    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”:-在读取生成文件之前更改为目录dir

    Example :- "make -C /lib/modules/$(shell uname -r)/build" will change to "make -C /lib/modules/4.6.0-rc1/build.
    
  • $pwd”:-获取当前目录的路径
  • 现在,您希望通过使用“make-C/lib/modules/$(shell uname-r)/buildm=$(PWD)modules”来创建可加载的模块


    您的源代码需要在环境中运行。这就是为什么我们必须使用-C选项来更改构建目录。它们有所有需要的定义、头文件、宏等。现在在更改到构建目录后,您需要告诉模块所在的位置,这就是为什么我们使用M=$PWD。

    好的,谢谢,但是
    M=$(PWD)模块有什么相关问题:。我从中下载了设备内核源代码,但没有构建文件夹!实际上,如果运行̀make`,默认情况下它将运行第一个定义的目标,除非名为.default_GOAL的变量定义为另一个目标的名称。