(二) 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_init和module_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
- (二) Hello World模块
- hello world 模块
- LDD3 hello world 模块
- hello world 内核模块
- hello world 模块编译
- Drupal Hello World模块
- hello world 模块编译
- hello world!(驱动模块)
- Hello World 解析二
- 内核模块的hello world!
- 编写 Hello world 模块驱动
- 驱动学习,hello world模块
- 编写 Hello world 模块驱动
- Linux加载 hello world模块
- Hello, World 模块的 printk()
- TQ2440驱动-hello world 模块
- TQ2440驱动-hello world 模块
- linux Hello World 模块编程
- “AndroidStudio2.1.3\sdk\build-tools\24.0.0\aapt.exe''finished with non-zero exit value 1问题解决方法
- 第25周-window程序设计(基础篇)-第4章-滚动条新功能
- 数据库范式
- CentOS6.5下Mysql的主从复制原理及配置
- 比较几种语言的Web开发效率
- (二) Hello World模块
- JAVA 异常
- 重载运算符
- win10 搭建apache+php
- Java.lang.UnsatisfiedLinkError: C:\apache\apache-tomcat-7.0.14\bin\tcnative-1.dll: Can't load AM
- 点击文件后自动添加到暴风影音播放列表
- swift3新路程(11)错误处理(Error Handling)
- Oracle、SQL Server、MySQL数据类型
- 208. Implement Trie (Prefix Tree)