加载模块驱动

—、必备的头文件

Linux头文件位置
1、类似#include <linux/module.h>的头文件,它们是在Linux源码目录下的include/linux/module.h
#include <linux/module.h>头文件
所有的Linux 代码必须遵循GPL 协议,如果不知道Linux 的GPL 协议,去查一下资料
– 如果你不声明GPL 协议,你的模块将无法在Linux 中使用的
– MODULE_LICENSE(_license)添加遵循GPL协议,必须的!

– MODULE_AUTHOR(_author)代码作者

2、#include <linux/init.h>
– 包含初始化宏定义的头文件,代码中的函数module_init和module_exit在此文件中
– 入口函数module_init(x)

– 出口函数module_exit(x)

二、新建.c文件

module_init(hello_init);

– /*初始化函数*/
module_exit(hello_exit);

– /*卸载函数*/

声明区
– MODULE_LICENSE("Dual BSD/GPL");
– /*声明是开源的,没有内核版本限制*/
– 必须有
– MODULE_AUTHOR("TOPEET");
– /*声明作者*/

– 可有可无

static int hello_init(void){
   printk(KERN_EMERG "Hello World enter!\n");
   /*打印信息,KERN_EMERG表示紧急信息*/
   return 0;
}
static void hello_exit(void)
{
      printk(KERN_EMERG "Hello world exit!\n");
}
mini_linux_module.c
#include <linux/init.h>
#include <linux/module.h>

MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("TOPEET");

static int hello_init(void)
{
	printk(KERN_EMERG "HELLO WORLD enter!\n");
	return 0;
}

static void hello_exit(void)
{
	printk(KERN_EMERG "HELLO WORLD exit!\n");
	
}

module_init(hello_init);
module_exit(hello_exit);

makefile

#!/bin/bash
#通知编译器我们要编译模块的哪些源码
#这里是编译itop4412_hello.c这个文件编译成中间文件itop4412_hello.o
obj-m += mini_linux_module.o 

#源码目录变量,这里用户需要根据实际情况选择路径
#作者是将Linux的源码拷贝到目录/home/topeet/android4.0下并解压的
KDIR := /home/hjx/work/itop-4412/iTop4412_Kernel_3.0

#当前目录变量
PWD ?= $(shell pwd)

#make命名默认寻找第一个目标
#make -C就是指调用执行的路径
#$(KDIR)Linux源码目录,作者这里指的是/home/topeet/android4.0/iTop4412_Kernel_3.0
#$(PWD)当前目录变量
#modules要执行的操作
all:
	make -C $(KDIR) M=$(PWD) modules
		
#make clean执行的操作是删除后缀为o的文件
clean:
	rm -rf *.o

结果:

[root@iTOP-4412]# insmod mini_linux_module.ko
[ 1169.960476] HELLO WORLD enter!
[root@iTOP-4412]# 
[root@iTOP-4412]# 
[root@iTOP-4412]# lsmod
mini_linux_module 700 0 - Live 0xbf00c000
[root@iTOP-4412]# rmmod mini_linux_module
[ 1179.536123] HELLO WORLD exit!
三、无法卸载模块的解决办法

rmmod mini_linux_module
卸载模块的时候会弹出错误,如下

– rmmod: can't change directory to '/lib/modules': No such file or directory

提示没有'/lib/modules'目录

– 使用命令“#mkdir /lib/modules”,新建一个目录

是用rmmod命令仍然会出现如下错误:

– rmmod: can't change directory to '3.0.15': No such file or directory

提示没有目录'3.0.15'
– 使用命令“#mkdir /lib/modules/3.0.15”,继续建目录

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011425939/article/details/80316834
个人分类: kernel&驱动
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭