如何编译Linux内核模块?

11

我正在尝试根据这个指南编译一个简单的“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) modules是什么意思?

好的,谢谢。但是M=$(PWD) modules是什么意思? - Jordan Camp
相关问题:https://dev59.com/Ll0a5IYBdhLWcg3wt6mK。 - Sam Protsenko
2个回答

15
  1. 'obj-m' :- specifies object files which are built as loadable kernel modules.
  2. 'all and clean' :- If you run 'make' by default it will run "all :". But we can use all and clean with make. it will run only those specific command.

    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':获取当前内核的名称和信息。


请注意,此处保留了HTML标签。
 Example :- for me, my kernel is "4.6.0-rc1".
  1. Option ‘-C dir’ :- Change to directory dir before reading the makefiles.

    Example :- "make -C /lib/modules/$(shell uname -r)/build" will change to "make -C /lib/modules/4.6.0-rc1/build.
    
  2. '$pwd':- get the path of your current directory.
现在你想使用"make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules"来创建可加载模块。
您的源代码需要环境才能运行。这就是为什么我们必须使用-C选项来更改构建目录。其中包含所有所需的定义、头文件、宏等。现在,在更改为构建目录之后,您需要告诉模块的位置在哪里,这就是为什么我们使用M=$PWD的原因。

实际上,如果你运行 make,默认情况下它会运行第一个定义的目标,除非一个名为 .DEFAULT_GOAL 的变量被定义为另一个目标的名称。 - Aurélien Martin

5

编译内核模块,通常需要使用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 需要将其存储,因为它会切换到内核构建路径。


我从http://openlinux.amlogic.com:8000/download/ARM/kernel/?C=M;O=D下载了我的设备内核源代码,但是没有build文件夹! - Dr.jacky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接