初次编写linux内核模块碰到的问题

一、背景

    最近学习linux内核的东西,尝试去编写一个简单的内核模块。内核模块对于编写的格式要求是十分苛刻的。所以在编写、运行的过程中碰到了许多“坑“,就在此以作记录。

二、编写的简单的内核模块程序

#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/init.h>

static int __init lkp_init(void)
{
  printk("<1>Hello,World!from the kernel space...\n");
  return 0;
}

static void __exit lkp_cleanup(void)
{
  printk("<1>Goodbye,World!leaving kernel space...\n");
}

module_init(lkp_init);
module_exit(lkp_cleanup);
MODULE_LICENSE("GPL");

三、编写的Makefile文件

obj-m += test.o
CURRENT_PATH:=$(shell pwd)
LINUX_KERNEL:=$(shell uname -r)
LINUX_KERNEL_PATH := /usr/src/kernels/$(LINUX_KERNEL)

all:
        make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
        make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean

四、碰到的问题

1、test.c中比较容易犯错的地方


首先是这个init与exit前面不是一个下划线,而是两个下划线。

而且要注意print后跟的是k,不可以习惯性的打成f了。

2、Makefile中比较容易犯错的地方

这里共有四处是要特别注意的,比较容易犯错的地方。而且如果没有注意到的同学往往自己检查起来也很难查到出错的原因。

首先,obj与-m中间没有空格。

其次,右上角的框框里是你的模块程序的名字后加.o。比如我这里模块程序的名字叫test.c,于是我这里是test.o

接下来,两个make的前面是一个TAB键,绝对不可以使用其他比如空格之类的来在形式上进行替代。

最后,$符号前面与M=之间没有空格,必须紧密相连。

五、总结

    我这里只就讲了一些初次接触内核模块编程遇到的小问题,总之,内核模块的编程不同于一般的C语言或其他的语言编程,它能更加苛刻一些。

至于如何插入模块,如何删除模块这里也就不赘述了。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值