我是linux的初学者,并且有关于makefile的问题 我通过互联网搜索过,但它对我没用 我使用的是ubuntu 16.04v,问题是pg.96-99上的问题,编程作业1,操作系统概念第9册。
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
int simple init(void)
{
printk(KERN INFO "Loading Module\n");
return 0;
}
void simple exit(void)
{
printk(KERN INFO "Removing Module\n");
}
module init(simple init);
module exit(simple exit);
MODULE LICENSE("GPL");
MODULE DESCRIPTION("Simple Module");
MODULE AUTHOR("SGG");
这是代码,问题如下。
使用附带的Makefile编译此内核模块
simple.c
这个项目的源代码。要编译模块,请输入 在命令行上跟随:make
编译产生几个文件。文件
simple.ko
代表 编译内核模块。以下步骤说明了插入此模块 进入Linux内核。
但我不知道如何使用Makefile编译它。 我尝试了很多次但却找不到原因。也许还需要另外一个代码? Plz告诉我。
答案 0 :(得分:3)
这是非常基本的。如果你有c源,你需要编译。为了编译和链接makefile使用。您可以编写自己的makefile来编译加载模块。那就是说。
这是简单内核加载模块的一般示例,您可以编辑源文件名和路径。
只做vi Makefile。
makefile模板
obj-m = hello.o
KVERSION = $(shell uname -r)
all:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean
保存并关闭文件。在此之前不要忘记编辑加载模块名称。
有关上述makefile的信息
Makefile第一行称为目标定义,它定义了要构建的模块hello.o
。例如obj-m
定义可加载模块目标
$(shell uname -r)
是一个有用的调用,用于返回当前的内核构建版本
然后M=$(PWD)
变量赋值告诉make命令实际项目文件存在的位置
答案 1 :(得分:2)
这可能对您的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
取自http://www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html
另外,请务必安装内核头文件
答案 2 :(得分:0)
如果模块所在的路径中有一个名为Makefile的文件,则在命令行中转到该路径运行命令“ make”。这将编译模块代码并创建simple.ko文件。
要将模块加载到内核中,请使用“ insmod”命令(例如:“ insmod simple.ko”)。要了解更多类型,请在命令行中输入“ man insmod”。