c - 如何编译内核模块

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

我正在尝试按照 guide 编译一个简单的 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) 模块。所以现在它运行在 -C 标志后给出的路径中找到的 Makefile,但是 M=$(PWD) 模块 做什么?

最佳答案

  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"
    

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':- 获取当前目录的路径。

现在您想使用“ma​​ke -C/lib/modules/$(shell uname -r)/build M=$(PWD) modules”创建可加载模块。

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

关于c - 如何编译内核模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37507320/

相关文章:

python - SWIG/Python : Passing pointer into function

makefile - make 命令 makefile 错误 :18: *** missing separator. 停止

makefile - 如何在 Cmake QtCreator 项目中为 make 设置多个并行作业?

c - printk 和 pr_info 的区别

无法将全局变量从 dll 导入到应用程序中?

c - c中的utils.h到底是什么?

c++ - 如何选择为每个平台编译哪些源文件?

c - 为什么linux源代码中有这么多typedef?

linux - 在哪里可以找到 ubuntu 12.04 的调试信息内核 rpm?

c - C 上的字符串行为