Linux设备驱动程序,个人学习,第一个模块hello world

使用linux 为 ubuntu 12.04 ,内核版本使用 uname -r得到3.2.0-23-generic

首先安装module-assistant

sudo apt-get install module-assistant


直接上代码

建立个文件夹

mkdir hello_printk

在其中建俩文件 一个是hello_printk.c

另外一个是 Makefile

点击打开链接

想要了解init.h可以参考blog

//filename <hello_printk.c>
#include <linux/init.h>
#include <linux/module.h>
//在linux 2.6以上版本应该都可以识别使用的。但是在linux 2.4版本下,编译会提示头文件未能加载。
#include <linux/sched.h>
//该头文件可以用于打印当前进程ID和命令名</span>
MODULE_LICENSE("Dual BSD/GPL");/*MODULE_LICENSE是用来告诉内核,该模块是采用自由许可证,如果没有这样的声明,内核在装载模块时候会抱怨一下*/

static int hello_init(void){
        printk(KERN_ALERT "hello,world!\n");
        printk(KERN_INFO "HELLO WORLD IS \"%s\" (pid %i)\n",current->comm,current->pid);
        return 0;
}
//代码中的字符串KERN_ALERT是定义了这条消息的优先级别
static void hello_exit(void){
        printk(KERN_ALERT "Goodbye,world\n");
}


module_init(hello_init);//模块初始化 将在装载该模块执行的动作
module_exit(hello_exit);//模块卸载时候执行的动作


 

Makefile文件如下

如果不懂makefile怎么写的话 可以参考这个blog点击打开链接

ifneq ($(KERNELRELEASE),)
    obj-m:=hello_printk.o
else
    KDIR := /lib/modules/$(shell uname -r)/build
    PWD := $(shell pwd)

all:
	$(MAKE) -C $(KDIR) M=$(PWD) modules

clean:
	rm -rf *.o *.ko *.mod.c 
endif

回到文件夹中执行编译make


编译完成后 可以切换到 root身份,因为插入模块需要root权限。获得root权限后 在hello_printk目录下可以找到 hello_printk.ko 使用命令 insmod hello_printk.ko 将模块插入,

有时候可能会因为操作系统版本问题,没有显示在屏幕上,在ubuntu 12.04版本中 该日志存在于 /var/log/kern.log中,可以使用shell命令 grep hello /var/log/kern.log 快速找到,插入模块时候的动作,

在使用rmmod hello_printk 删除该模块。


如果需要查看模块信息 可以使用 

modinfo查看内核模块信息

modinfo ./hello_printk.ko

我们可以使用 uname -r来对照模块版本号和操作系统内核版本号,如果不一致,内核会拒绝加载这个模块。在文库一篇关于linux设​备​驱​动​程​序​学​习​笔​记能找到相关信息:即使使用完全相同的配置文件,版本印戳还是有细小的差异的,但这足以导致模块加载的失败。


由于时间关系,今天就先到这里 blog更新时间为每个周末


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值