嵌入式操作系统(Linu进程及设备驱动程序).ppt
《嵌入式操作系统(Linu进程及设备驱动程序).ppt》由会员分享,可在线阅读,更多相关《嵌入式操作系统(Linu进程及设备驱动程序).ppt(65页珍藏版)》请在三一办公上搜索。
1、Linux进程间通信及驱动程序,软件学院 张亮,西安电子科技大学软件学院,2,通信目的,进程间的数据传递,A向B传送,进程间的数据共享,一个修改后,别的可以看到,通知事件:一个进程要向一个或者一组进程发送消息,表明某种事件的产生,资源共享:多个进程要共享同样的资源,需要加锁和同步,进程控制:需要控制另外一个进程的执行(知道他的状态信息),西安电子科技大学软件学院,3,通信方法,信号,管道,消息,信号量,共享内存,套接字,自定义,西安电子科技大学软件学院,4,通信方法 信号,最古老的进程间通信方式之一,内核为进程产生信号,以表示不同的事件,这些事件就是信号源,异常:进程运行过程产生的异常,其他进
2、程:一个进程可以向另一一个或者一组进程发送信号,终端中断:Ctrl-C,报警:计时器到期,其他:通知。例如IO就绪,西安电子科技大学软件学院,5,通信方法 信号处理,内核对信号的5种缺省动作,异常终止,将进程的地址空间内容、寄存器内容保存到一个core文件中,终止进程,退出:不产生core文件,终止进程,忽略:不处理该信号,停止:挂起该进程,继续:如果该进程被挂起,则恢复进程运行,否则,忽略该信号,西安电子科技大学软件学院,6,通信方法 信号处理,信号的特定处理动作,忽略,但是SIGKILL、SIGSTOP不能被忽略,阻塞信号:进程可以选择阻塞某些信号,先将到来的信号记录下来,等到以后解除阻塞
3、后再处理,进程处理该信号:注册处理程序,信号对照含义?,SIGHUP、SIGINT、SIGQUIT、SIGFPE、SIGKILL、SIGALRM、SIGTERM、SIGHLD、SIGSTOP,西安电子科技大学软件学院,7,通信方法 信号处理,系统调用,Signal、sigaction,定时器相关:alarm,settimer,西安电子科技大学软件学院,8,通信方法 管道,特点,单向的、先进先出、无结构、固定大小的字节流,一个读、一个写,管道大小的定义:PIPE_BUF,在include/linux/limits.h中,一般大小为4096,西安电子科技大学软件学院,9,通信方法 管道调用,系统调
4、用,Pipe(),读、写操作,输入参数int filedes2返回值中filedes0为读句柄filedes1为写句柄,西安电子科技大学软件学院,10,通信方法 消息,使用消息队列标识符进行标识,Msgget创建一个新队列或者打开一个已经存在的队列,Msgsnd向队列末端添加一条新消息,Msgrcv从队列中取消息,注:取消息不一定是按照先进先出原则,也可以按照消息类型字段获取(msgrcv方式决定),西安电子科技大学软件学院,11,通信方法-信号量,用于保护临界资源,以及进程间同步,初始化函数sem_init(),注意参数,等待信号量可用sem_wait/sem_trywait,释放信号量se
5、m_post,西安电子科技大学软件学院,12,通信方法-共享内存,进程间数据通信方法,直接读写内存,不需要任何数据拷贝,管道、消息机制都需要在内核、用户空间进行数据拷贝(系统调用过多),Shm_get用于创建或者获取标识符,Shm_at用于获取对应的地址,Shm_dt用于删除,西安电子科技大学软件学院,13,通信方法-套接字,进程间数据通信方法,事件形式,RAW_SOCKET,发送、接收都一致,西安电子科技大学软件学院,14,什么是设备驱动程序,设备驱动程序就是外部设备的软件抽象,或者说是软件表现,是系统看到的设备,是虚拟的设备。,一个外设的性能在很大程度上取决于驱动程序的性能。驱动程序之于外
6、部设备,犹如操作系统之于硬件环境。,西安电子科技大学软件学院,15,驱动程序有什么用,Linux下的设备驱动程序都是一个个独立的“黑盒子”,使某个特定的硬件响应一个定义良好的内部编程接口,同时完全隐藏了设备的工作细节。,用户对设备的操作通过一组标准化的系统调用来完成。驱动程序就是将这些调用映射到作用于实际硬件的设备特定的操作上(写寄存器命令)。,西安电子科技大学软件学院,16,系统调用接口,设备1,设备2,设备3,驱动1,驱动2,驱动3,用户程序,用户空间,内核空间,内核子系统,其它模块,其它模块,硬件,驱动程序在内核中的位置,西安电子科技大学软件学院,17,模块化的驱动程序,为了使系统更有效
7、的运行,Linux支持内核的动态扩展,即在系统运行时给内核增加新的功能(模块)。,驱动程序就是几个可以模块化的功能之一。这也是Linux下驱动程序与Windows下驱动程序的最大区别。,西安电子科技大学软件学院,18,什么是模块,模块是一段没有链接的目标代码(.o)可由insmod程序动态的链接到正在运行的内核链接后,它就成了内核的一部分,直到用rmmod程序解除链接。和用户函数库的动态链接有些相似;但函数的功能在链接前就已明确,而模块连接时才注册自己的功能。,西安电子科技大学软件学院,19,系统内核,西安电子科技大学软件学院,20,驱动程序,系统内核,西安电子科技大学软件学院,21,驱动程序
8、,将驱动程序加入到内核中,系统内核,西安电子科技大学软件学院,22,西安电子科技大学软件学院,23,核心模块与应用程序的对比,西安电子科技大学软件学院,24,简单驱动程序举例子-2.4,#ifndef MODULE#define MODULE#endif#ifndef _KERNEL_#define _KERNEL_#endif#include#include int init_module(void)printk(KERN_ALERT“Hello World!n”);return 0;,西安电子科技大学软件学院,25,void cleanup_module(void)printk(KERN_
9、ALERT“Goodbye!n”);MODULE_LICENSE(“GPL”)/为了避免”no license”警告-MakeFile文件 MODULECFLAGS:=-I/usr/src/linux-2.4/include DMODULE D_KERNEL_ hello.o:hello.c gcc$(MODULECFLAGS)c hello.c.PHONY:clean clean:rm f hello.o,简单驱动程序举例子-2.4,注意之处1:2.4内核中,MODULE和_KERNEL_宏必须定义,无论是在编译选项时还是在源文件代码中。保险期间:两边都写,同时使用ifdef宏加了保护,不会
10、出现重复定义2:如果在printk打印时候不使用KERN_ALERT宏,则linux/kernel.h可以不包括3:头文件linux/module.h必须添加4:初始化必须是init_module,退出函数必须是cleanup_module,西安电子科技大学软件学院,26,简单驱动程序举例子-2.4,西安电子科技大学软件学院,27,简单驱动程序举例子-2.6,#include#include#include MODULE_LICENSE(Dual BSD/GPL);static char*whom=world;module_param(whom,charp,0);static int howm
11、any=1;module_param(howmany,int,0);static int hello_init(void)int i;for(i=0;ihowmany;i+)printk(KERN_ALERT(%d)Hello,%s!n,i,whom);return 0;,西安电子科技大学软件学院,28,简单驱动程序举例子-2.6,static void hello_exit(void)printk(KERN_ALERT Goodbye!n);module_init(hello_init);module_exit(hello_exit);-Makefile文件:obj-m+=hello.oal
12、l:make-C/lib/modules/$(shell uname-r)/build M=$(PWD)modulesclean:make-C/lib/modules/$(shell uname-r)/build M=$(PWD)clean,2.6加载insmod hello.ko howmany=5 whom=islab注意事项初始化和退出函数可以写成任何名字,使用module_init以及module_exit宏调用一下即可,本质和2.4的init,cleanup一致参数传递的注意事项信息查看在cat/var/log/messages,西安电子科技大学软件学院,29,简单驱动程序举例子-2
13、.6,2.6内核模块参数传递,内核提供了一个简单框架,允许驱动程序声明参数,并且用户在系统启动或者模块装载时候为参数指定相应的值。-必须包含linux/moduleparam.h文件,西安电子科技大学软件学院,30,模块参数定义方式module_param(int_name,type,perm);module_param_named(ext_name,int_name,type,perm);module_param_string(ext_name,string,len,perm);module_param_array(int_name,type,nump,perm);module_param_
14、array_named(ext_name,int_name,type,nump,perm);使用宏MODULE_PARM_DESC()对定义的参数进行说明,各个参数含义int_name:当参数中没有ext_name的时候,此参数即是用户看到的参数名,又是模块内接受参数的变量,西安电子科技大学软件学院,31,2.6内核模块参数传递,len:当参数是string的时候,表示字符串string数组的大小,type:表示参数的数据类型,可以为byte,short,ushort,int,uint,long,ulong,charp,bool,invbool,perm:指定了在sysfs中相应文件的访问权限
15、。(一般不考虑),ext_name:用户看到的参数名,对外的参数名,nump:指向一个整数,其值表示有多少个参数存放在数组中,module_param_array_named(ext_name,int_name,type,nump,perm);,模块参数传递举例,西安电子科技大学软件学院,32,#include#include#include#define MAX_ARRAY 6static int int_var=0;static const char*str_var=default;static int int_array6;int narr;module_param(int_var,in
16、t,0);MODULE_PARM_DESC(int_var,A integer variable);module_param(str_var,charp,0);MODULE_PARM_DESC(str_var,A string variable);module_param_array(int_array,int,模块参数传递举例,西安电子科技大学软件学院,33,static int _init hello_init(void)int i;printk(KERN_ALERT Hello,my LKM.n);printk(KERN_ALERT int_var%d.n,int_var);printk
17、(KERN_ALERT str_var%s.n,str_var);for(i=0;i narr;i+)printk(int_array%d=%dn,i,int_arrayi);return 0;static void _exit hello_exit(void)printk(KERN_ALERT Bye,my LKM.n);module_init(hello_init);module_exit(hello_exit);加载命令:insmod hello_param.ko int_var=100 str_var=hello int_array=100,200,西安电子科技大学软件学院,34,设备
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 操作系统 Linu 进程 设备 驱动程序
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-6569768.html