如何编译内核模块

Jor*_*amp 10 c makefile linux-device-driver linux-kernel

我正在尝试按照本指南编译一个简单的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
Run Code Online (Sandbox Code Playgroud)

据我所知,当我输入make命令时,它将运行运行的all配方make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules.所以现在它运行在-C标志后给出的路径上找到的Makefile,但它做了M=$(PWD) modules什么?

小智 12

  1. ' obj-m ': - 指定构建为可加载内核模块的目标文件.
  2. ' 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"
    
    Run Code Online (Sandbox Code Playgroud)

3." uname -r ': - 获取有关当前内核的名称和信息.

 Example :- for me, my kernel is "4.6.0-rc1".
Run Code Online (Sandbox Code Playgroud)
  1. 选项' -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.
    
    Run Code Online (Sandbox Code Playgroud)
  2. ' $ pwd ': - 获取当前目录的路径.

现在,您希望使用" make -C/lib/modules/$(shell uname -r)/ build M = $(PWD) modules" 来创建可加载模块.

您的源代码需要运行环境.这就是我们必须使用-C选项来更改构建目录的原因.哪些都需要定义,头文件,宏等等.现在更改为构建目录后,您需要告诉您的模块在哪里,这就是我们使用M = $ PWD的原因.


art*_*rtm 5

要编译内核模块,make通常需要使用以下形式的命令:

make -C /lib/modules/3.16.0-70-generic/build M=/home/test/ldd3/hello modules
Run Code Online (Sandbox Code Playgroud)

其中,-C表示切换到另一条路径。

/lib/modules/3.16.0-70-generic/
Run Code Online (Sandbox Code Playgroud)

是所用内核的路径,并且

/home/test/ldd3/hello
Run Code Online (Sandbox Code Playgroud)

是模块源所在的位置。

M = $(PWD)模块有什么作用?

因此,正如我所说的,M=$(PWD)它只是一个shell变量,用于存储内核模块的当前路径。make在切换到内核构建路径时需要存储它。