如何编译内核模块

时间:2016-05-29 07:27:00

标签: c makefile linux-kernel linux-device-driver

我试图在ngAnimateChildren docs之后编译一个简单的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的{​​{1}}配方。所以现在它运行在make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules标志之后给出的路径上找到的Makefile但是-C做了什么?

2 个答案:

答案 0 :(得分:10)

  1. '的 OBJ-M ' : - 指定构建为可加载的目标文件     内核模块。
  2. ' all and clean ' : - 如果你跑'做''默认情况下,它将运行" 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. 3。' uname -r ' : - 获取有关当前内核的名称和信息。

     Example :- for me, my kernel is "4.6.0-rc1".
    
    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.
      
    2. ' $ pwd ': - 获取当前目录的路径。
    3. 现在您要使用" make -C / lib / modules / $(shell uname -r)/ build M = $(PWD) modules&#34创建可加载模块;。

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

答案 1 :(得分: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需要在切换到内核构建路径时存储它。