(二) Hello World模块

来源:互联网 发布:java redis list 删除 编辑:程序博客网 时间:2024/06/05 08:16

1.hello world驱动程序

  linux内核对驱动处理有两种方式,第一种方式:把所有需要的功能全部编译到内核中,这种方式导致重新添加或者删除都需要重新编译内核。第二种方式:动态添加模块,也就是以模块的方式添加驱动,也是常用的一中对于很多编程语言,一般都是采用Hello World作为简单说明,下面就驱动程序的简单示例以Hello World进行完整的入门介绍:

/*包含初始化宏定义的头文件,代码中的module_init和module_exit在此文件中*/#include <linux/init.h> /*包含初始化加载模块的头文件,代码中的MODULE_LICENSE在此头文件中*/#include <linux/module.h>/*声明是开源的,没有内核版本限制*/MODULE_LICENSE("Dual BSD/GPL");/*声明作者*/MODULE_AUTHOR("flywang606");static int hello_init(void){    printk(KERN_EMERG "HELLO WORLD !\n");    return 0;}static void hello_exit(void){    printk(KERN_EMERG "HELLO WORLD exit!\n");}module_init(hello_init);module_exit(hello_exit);

  该模块定义了两个函数(hello_init和hello_exit),hello_init在模块装载到内核时执行,另一在模块移除内核时执行。moudule_initmodule_exit使用了内核特殊宏表示上述两个函数扮演的角色。另外对于MODULE_LICENSE是用来告诉内核,该模块四采用的自由许可证;如果没有这样的声明,内核在装载该模块时会产生问题。 
  函数printk和C语言中的printf,printk属于内核空间,而printf属于用户空间。代码中的KERN_EMERG定义了这条消息的优先级。printk分为八个级别:

#define KERN_EMERG 0/*紧急事件消息,系统崩溃之前提示,表示系统不可用*/#define KERN_ALERT 1/*报告消息,表示必须立即采取措施*/#define KERN_CRIT 2/*临界条件,通常涉及严重的硬件或软件操作失败*/#define KERN_ERR 3/*错误条件,驱动程序常用KERN_ERR 来报告硬件的错误*/#define KERN_WARNING 4/*警告条件,对可能出现问题的情况进行警告*/#define KERN_NOTICE 5/*正常但又重要的条件,用于提醒*/#define KERN_INFO 6/*提示信息,如驱动程序启动时,打印硬件信息*/#define KERN_DEBUG 7/*调试级别的消息*/

2.hello world程序装载卸载

编写好的驱动程序首先通过make对驱动程序进行编译,Makefile文件如下:

#!/bin/bash#通知编译器我们要编译模块的哪些源码obj-m += hello_world.o #源码目录变量,这里用户需要根据实际情况选择路径KDIR := /home/code_4412/arm_linux_Kernel_3.0#当前目录变量PWD ?= $(shell pwd)#make命名默认寻找第一个目标#make -C就是指调用执行的路径#$(KDIR)Linux源码目录,作者这里指的是/home/code_4412/arm_linux_Kernel_3.0#$(PWD)当前目录变量#modules要执行的操作all:    make -C $(KDIR) M=$(PWD) modules  #make clean执行的操作是删除后缀为o的文件clean:    rm -rf *.mod.c *.o *.order *.ko *.mod.o *.symvers

在root权限输入make命令进行编译,生成.o以及.ko文件,然后通过insmod和rmmod进行编译测试。

//装载insmod ./hello_world.ko//卸载rmmod hello_world
0 0
原创粉丝点击