嵌入式应用程序设计设备驱动演示文稿
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第15页,共23页。
编译装载过程
$ ls
hello.c Makefile
$ make make -C /usr/src/linux-2.4.20/ M=/wu/char_8 modules
$ ls
hello.c hello.mod.c hello.mode.o hello.o make.log Makefile modules.order
module_param(howmany, int, 0444);
module_param(whom, charp, S_IRUGO); static int __init hello_init(void)
{ int i; for (i = 0; i < howmany; i++)
printk( “(%d) Hello, %s\n”, i, whom); return 0;
222
第22页,共23页。
举例:带参数的内核模块
#include <linux/module.h>
#include <linux/init.h>
#include <linux/moduleparam.h>
static char *whom = "world";
static int howmany = 1;
/* 初始化代码 */
} module_init(initialization_function);
119
第19页,共23页。
模块卸载函数
static void __exit cleanup_function(void) {
/* 释放代码 */ } module_exit(cleanup_function);
–modeproble –r hello
第13页,共23页。
最简单的内核模块例子
#include <linux/module.h>
#include <linux/init.h>
#include<linux/kernel>
MODULE_LICENSE("GPL");
static int __init hello_init(void)
8
第8页,共23页。
8.1 设备驱动编程基础—设备驱动
4.设备驱动程序与整个软硬件系统的关系
9
第9页,共23页。
8.1 设备驱动编程基础—内核模块编程
1.Linux的内核模块
• Linux内核采用可加载内核模块化设计
(Loadable Kernel Module,LKM) 内核模块:是一些可以让操作系统内核在需要时载入和 执行的代码。是一种目标对象文件,通常由一组函数和数 据结构组成。 内核的一个模块可以以两种方式被编译和加载。
} static void __exit hello_exit(void)
{
printk("Goodbye world\n");
}
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION(“A simple module program”);
MODULE_VERSION(“V1.0”);
4.内核模块的程序结构 一个Linux内核模块主要由以下几个部分组成。
– 模块加载函数(必须) – 模块卸载函数(必须) – 模块许可证声明(必须) – 模块参数(可选) – 模块导出符号(可选) – 模块作者等信息声明(可选)
118
第18页,共23页。
模块加载函数
static int __init initialization_function(void) {
6 第6页,共23页。
举例:linux设备识别
• 在linux中任何设备都是文件。所有设备的设备文件节点都 在/dev目录下。 #:ls –al /dev
第7页,共23页。
8.1 设备驱动编程基础—设备驱动
3.设备驱动程序的特点 • 内核代码 • 内核接口 • 内核机制和服务 • 可装载 • 可设置 • 动态性
gcc编译后加上-DMODULE -DLINUX 参数 例如:gcc -DMODULE -DLINUX -I
/usr/src/linux-2.4.20/include -c -o hello.o hello.c 注意:-I选项跟着Linux内核源代码中Include目录
的路径。
第17页,共23页。
8.1 设备驱动编程基础—内核模块编程
220
第20页,共23页。
模块参数
module_param(参数名,参数类型,参数读/写权限访问 许可掩码)宏为模块声明一个参数
支持的参数类型
byte, short, ushort, int, uint, long, ulong, bool, charp,invbool array (module_param_array(name, type, nump, perm))
– – Load the module specified and modules it depends
第12页,共23页。
举例:模块相关命令
–lsmod –insmod hello.o
–rmmod hello
–modprobe
• /lib/modules/linux版本号/modules.dep • /etc/modprobe.conf
MODULE_AUTHOR(“wdh");
module_init(hello_init);
module_exit(hello_exit);
第23页,共23页。
参数在模块加载时传递 #insmod hello.o test=2
221
第21页,共23页。
导出符号与模块声明与描述
导出符号
EXPORT_SYMBOL(符号名); EXPORT_SYMBOL_GPL(符号名);
模块声明与描述
MODULE_AUTHOR(author); MODULE_DESCRIPTION(description); MODULE_VERSION(version_string); MODULE_DEVICE_TABLE(table_info); MODULE_ALIAS(alternate_name);
{ printk(“Hello kernel….\n");
return 0;
}
static void __exit hello_exit(void) {
printk(“bye bye….\n"); }
module_init(hello_init);
module_exit(hello_exit);
第14页,共23页。
嵌入式应用程序设计设备驱动 演示文稿
第1页,共23页。
优选嵌入式应用程序设计设备 驱动
第2页,共23页。
知识点回顾
• TCP/IP模型 • 套接字 • TCP 套接字编程 • UDP 套接字编程
第3页,共23页。
本次课内容 • 设备驱动的基本概念 • Linux内核与驱动的关系 • Linux内核模块结构 • 内核模块命令
生成makefile文件
• Makefile文件
obj-m := hello.o
al/linux-2.4.20/ M=$(shell pwd) modules clean:
make -C /usr/src/linux-2.4.20/ M=$(shell pwd) modules clean
5
第5页,共23页。
8.1 设备驱动编程基础—设备驱动
2.Linux系统的设备分类 • 字符设备通常指以字节为单位顺序读写的设
备, 如并口设备、虚拟控制台等。 • 块设备通常指以块为单位随机读写的设备,
如IDE硬盘、SCSI硬盘、光驱等。 • 网络设备通常是指通过网络能够与其他主机
进行数据通信的设备,如网卡等。
4 第4页,共23页。
8.1 设备驱动编程基础—设备驱动
1.设备驱动概念 是处理和操作硬件控制器的软件。驱动程序是内核的一 部分,是操作系统内核与硬件设备的直接接口,驱动程 序屏蔽了硬件的细节,完成以下功能:
对设备初始化和释放;
对设备进行管理,包括实时参数设置,以及提供对设备的操作接口; 读取应用程序传送给设备文件的数据或者回送应用程序请求的数据; 检测和处理设备出现的错误。
– 直接编译进Linux内核,随同Linux启动时加载; – 编译成一个可加载和删除的模块。
110
第10页,共23页。
8.1 设备驱动编程基础—内核模块编程
2.Linux内核模块与应用程序的区别
C语言程序
运行
入口 出口 编译 连接 运行
调试
用户空间
main() main() gcc –c ld 直接运行
例如: static char *str_param = "Linux Module Program";
static int num_param = 4000; module_param(num_param, int, S_IRUGO);
module_param(str_param, charp, S_IRUGO);
$ sudo insmod hello.o $ dmesg | tail -1 Hello kernel…
$ lsmod | grep hello
hello 1216 0
$ sudo rmmod hello $ dmesg | tail -1 bye bye….
第16页,共23页。
不需要编写Makefile的方法
gdb
Linux内核模块
内核空间
module_init()指定; module_exit()指定; Makefile insmod insmod
kdbug, kdb, kgdb等
第11页,共23页。
8.1 设备驱动编程基础—内核模块编程
3.内核模块相关命令
• insmod module.o
– Load the module
– 注意,只有超级用户才能使用这个命令
• rmmod module
– Unload the module • lsmod
– List all modules loaded into the kernel
–这个命令和cat /proc/modules等价 • modprobe [-r] <module name>
编译装载过程
$ ls
hello.c Makefile
$ make make -C /usr/src/linux-2.4.20/ M=/wu/char_8 modules
$ ls
hello.c hello.mod.c hello.mode.o hello.o make.log Makefile modules.order
module_param(howmany, int, 0444);
module_param(whom, charp, S_IRUGO); static int __init hello_init(void)
{ int i; for (i = 0; i < howmany; i++)
printk( “(%d) Hello, %s\n”, i, whom); return 0;
222
第22页,共23页。
举例:带参数的内核模块
#include <linux/module.h>
#include <linux/init.h>
#include <linux/moduleparam.h>
static char *whom = "world";
static int howmany = 1;
/* 初始化代码 */
} module_init(initialization_function);
119
第19页,共23页。
模块卸载函数
static void __exit cleanup_function(void) {
/* 释放代码 */ } module_exit(cleanup_function);
–modeproble –r hello
第13页,共23页。
最简单的内核模块例子
#include <linux/module.h>
#include <linux/init.h>
#include<linux/kernel>
MODULE_LICENSE("GPL");
static int __init hello_init(void)
8
第8页,共23页。
8.1 设备驱动编程基础—设备驱动
4.设备驱动程序与整个软硬件系统的关系
9
第9页,共23页。
8.1 设备驱动编程基础—内核模块编程
1.Linux的内核模块
• Linux内核采用可加载内核模块化设计
(Loadable Kernel Module,LKM) 内核模块:是一些可以让操作系统内核在需要时载入和 执行的代码。是一种目标对象文件,通常由一组函数和数 据结构组成。 内核的一个模块可以以两种方式被编译和加载。
} static void __exit hello_exit(void)
{
printk("Goodbye world\n");
}
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION(“A simple module program”);
MODULE_VERSION(“V1.0”);
4.内核模块的程序结构 一个Linux内核模块主要由以下几个部分组成。
– 模块加载函数(必须) – 模块卸载函数(必须) – 模块许可证声明(必须) – 模块参数(可选) – 模块导出符号(可选) – 模块作者等信息声明(可选)
118
第18页,共23页。
模块加载函数
static int __init initialization_function(void) {
6 第6页,共23页。
举例:linux设备识别
• 在linux中任何设备都是文件。所有设备的设备文件节点都 在/dev目录下。 #:ls –al /dev
第7页,共23页。
8.1 设备驱动编程基础—设备驱动
3.设备驱动程序的特点 • 内核代码 • 内核接口 • 内核机制和服务 • 可装载 • 可设置 • 动态性
gcc编译后加上-DMODULE -DLINUX 参数 例如:gcc -DMODULE -DLINUX -I
/usr/src/linux-2.4.20/include -c -o hello.o hello.c 注意:-I选项跟着Linux内核源代码中Include目录
的路径。
第17页,共23页。
8.1 设备驱动编程基础—内核模块编程
220
第20页,共23页。
模块参数
module_param(参数名,参数类型,参数读/写权限访问 许可掩码)宏为模块声明一个参数
支持的参数类型
byte, short, ushort, int, uint, long, ulong, bool, charp,invbool array (module_param_array(name, type, nump, perm))
– – Load the module specified and modules it depends
第12页,共23页。
举例:模块相关命令
–lsmod –insmod hello.o
–rmmod hello
–modprobe
• /lib/modules/linux版本号/modules.dep • /etc/modprobe.conf
MODULE_AUTHOR(“wdh");
module_init(hello_init);
module_exit(hello_exit);
第23页,共23页。
参数在模块加载时传递 #insmod hello.o test=2
221
第21页,共23页。
导出符号与模块声明与描述
导出符号
EXPORT_SYMBOL(符号名); EXPORT_SYMBOL_GPL(符号名);
模块声明与描述
MODULE_AUTHOR(author); MODULE_DESCRIPTION(description); MODULE_VERSION(version_string); MODULE_DEVICE_TABLE(table_info); MODULE_ALIAS(alternate_name);
{ printk(“Hello kernel….\n");
return 0;
}
static void __exit hello_exit(void) {
printk(“bye bye….\n"); }
module_init(hello_init);
module_exit(hello_exit);
第14页,共23页。
嵌入式应用程序设计设备驱动 演示文稿
第1页,共23页。
优选嵌入式应用程序设计设备 驱动
第2页,共23页。
知识点回顾
• TCP/IP模型 • 套接字 • TCP 套接字编程 • UDP 套接字编程
第3页,共23页。
本次课内容 • 设备驱动的基本概念 • Linux内核与驱动的关系 • Linux内核模块结构 • 内核模块命令
生成makefile文件
• Makefile文件
obj-m := hello.o
al/linux-2.4.20/ M=$(shell pwd) modules clean:
make -C /usr/src/linux-2.4.20/ M=$(shell pwd) modules clean
5
第5页,共23页。
8.1 设备驱动编程基础—设备驱动
2.Linux系统的设备分类 • 字符设备通常指以字节为单位顺序读写的设
备, 如并口设备、虚拟控制台等。 • 块设备通常指以块为单位随机读写的设备,
如IDE硬盘、SCSI硬盘、光驱等。 • 网络设备通常是指通过网络能够与其他主机
进行数据通信的设备,如网卡等。
4 第4页,共23页。
8.1 设备驱动编程基础—设备驱动
1.设备驱动概念 是处理和操作硬件控制器的软件。驱动程序是内核的一 部分,是操作系统内核与硬件设备的直接接口,驱动程 序屏蔽了硬件的细节,完成以下功能:
对设备初始化和释放;
对设备进行管理,包括实时参数设置,以及提供对设备的操作接口; 读取应用程序传送给设备文件的数据或者回送应用程序请求的数据; 检测和处理设备出现的错误。
– 直接编译进Linux内核,随同Linux启动时加载; – 编译成一个可加载和删除的模块。
110
第10页,共23页。
8.1 设备驱动编程基础—内核模块编程
2.Linux内核模块与应用程序的区别
C语言程序
运行
入口 出口 编译 连接 运行
调试
用户空间
main() main() gcc –c ld 直接运行
例如: static char *str_param = "Linux Module Program";
static int num_param = 4000; module_param(num_param, int, S_IRUGO);
module_param(str_param, charp, S_IRUGO);
$ sudo insmod hello.o $ dmesg | tail -1 Hello kernel…
$ lsmod | grep hello
hello 1216 0
$ sudo rmmod hello $ dmesg | tail -1 bye bye….
第16页,共23页。
不需要编写Makefile的方法
gdb
Linux内核模块
内核空间
module_init()指定; module_exit()指定; Makefile insmod insmod
kdbug, kdb, kgdb等
第11页,共23页。
8.1 设备驱动编程基础—内核模块编程
3.内核模块相关命令
• insmod module.o
– Load the module
– 注意,只有超级用户才能使用这个命令
• rmmod module
– Unload the module • lsmod
– List all modules loaded into the kernel
–这个命令和cat /proc/modules等价 • modprobe [-r] <module name>