4412开发板学习之Linux驱动开发(一):HELLO WORLD

前言

开始学习Linux驱动开发了,对于所有的程序员来说,任何语言,任何工具,第一个程序当然是Hello World了

最小驱动模块示意图

在这里插入图片描述

Hello World源码及分析

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

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

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);

<linux/module.h>
MODULE_LICENSE 声明协议 GPL 开放源代码(如果不声明GPL 协议模块将无法在Linux中使用)Dual BSD
MODULE_AUTHOR 模块作者
<linux/init.h>
包含初始化宏定义的头文件
入口函数module_init(x)
出口函数module_exit(x)
打印信息printk是分级的
1、#define KERN_EMERG 0
紧急事件信息,系统崩溃之前提示,表示系统不可用
2、#define KERN_ALERT 1
报告信息,表示必须立即采取措施
3、#define KERN_CRIT 2
临界条件,通常涉及严重的硬件或软件操作失败
4、#define KERN_ERR 3
错误条件,驱动程序常用KERN_ERR来报告硬件的错误
5、#define KERN_WARNING 4
警告条件,对可能出现的情况进行警告
6、#define KERN_NOTICE 5
正常但又重要的条件,用于提醒
7、#define KERN_INFO 6
提示星系,如驱动程序启东时,打印硬件信息
8、#define KERN_DEBUG 7
调试级别的消息

使用Makefile进行编译

Makefile源码及分析

#使用bash语言
#!/bin/bash
#通知编译器我们要编译模块的那些源码
obj-m += mini_linux_module.o
#源码目录变量
KDIR := /home/topeet/work/iTop4412_Kernel_3.0
#当前目录变量
PWD ?= $(shell pwd)
#make命名默认寻找第一个目标
#make -C指调用执行的路径
#$(KDIR)Linux源码目录,即/home/topeet/work/iTop4412_Kernel_3.0
#M表示模块
#$(PWD)当前目录变量
#modules 要执行的操作
all:
	make -C $(KDIR) M=$(PWD) modules
#清除中间文件(以.o为后缀的文件,也可以清除其它的,只需要.ko为后缀的文件即可)
clean:
	rm-rf *.o

编译流程分析

在这里插入图片描述

编译

make

在这里插入图片描述

在开发板进行模块的操作

将.ko文件复制到开发板

cp mini_linux_module.ko /home/topeet/minLinux/system/drivers/hello_world/

安装模块

insmod .ko文件

在这里插入图片描述

查看模块

lsmod 

在这里插入图片描述

cat /proc/modules 

在这里插入图片描述

卸载模块

rmmod 模块名

在这里插入图片描述
问题** rmmod: can’t change directory to ‘/lib/modules’: No such file or directory **
解决方法:
1.mkdir /lib/modules 再次rmmod
2.提示rmmod: can’t change directory to ‘3.0.15’: No such file or directory
3.mkdir /lib/modules/3.0.15 再次rmmod
4.成功

发布了123 篇原创文章 · 获赞 598 · 访问量 34万+

猜你喜欢

转载自blog.csdn.net/a568713197/article/details/89501207