嵌入式操作系统(Linu进程及设备驱动程序).ppt

上传人:max****ui 文档编号:12724570 上传时间:2020-05-19 格式:PPT 页数:65 大小:809KB
返回 下载 相关 举报
嵌入式操作系统(Linu进程及设备驱动程序).ppt_第1页
第1页 / 共65页
嵌入式操作系统(Linu进程及设备驱动程序).ppt_第2页
第2页 / 共65页
嵌入式操作系统(Linu进程及设备驱动程序).ppt_第3页
第3页 / 共65页
点击查看更多>>
资源描述
Linux进程间通信及驱动程序,软件学院张亮liangzhang,西安电子科技大学软件学院,2,通信目的,进程间的数据传递,A向B传送,进程间的数据共享,一个修改后,别的可以看到,通知事件:一个进程要向一个或者一组进程发送消息,表明某种事件的产生,资源共享:多个进程要共享同样的资源,需要加锁和同步,进程控制:需要控制另外一个进程的执行(知道他的状态信息),西安电子科技大学软件学院,3,通信方法,信号,管道,消息,信号量,共享内存,套接字,自定义,西安电子科技大学软件学院,4,通信方法信号,最古老的进程间通信方式之一,内核为进程产生信号,以表示不同的事件,这些事件就是信号源,异常:进程运行过程产生的异常,其他进程:一个进程可以向另一一个或者一组进程发送信号,终端中断:Ctrl-C,报警:计时器到期,其他:通知。例如IO就绪,西安电子科技大学软件学院,5,通信方法信号处理,内核对信号的5种缺省动作,异常终止,将进程的地址空间内容、寄存器内容保存到一个core文件中,终止进程,退出:不产生core文件,终止进程,忽略:不处理该信号,停止:挂起该进程,继续:如果该进程被挂起,则恢复进程运行,否则,忽略该信号,西安电子科技大学软件学院,6,通信方法信号处理,信号的特定处理动作,忽略,但是SIGKILL、SIGSTOP不能被忽略,阻塞信号:进程可以选择阻塞某些信号,先将到来的信号记录下来,等到以后解除阻塞后再处理,进程处理该信号:注册处理程序,信号对照含义?,SIGHUP、SIGINT、SIGQUIT、SIGFPE、SIGKILL、SIGALRM、SIGTERM、SIGHLD、SIGSTOP,西安电子科技大学软件学院,7,通信方法信号处理,系统调用,Signal、sigaction,定时器相关:alarm,settimer,西安电子科技大学软件学院,8,通信方法管道,特点,单向的、先进先出、无结构、固定大小的字节流,一个读、一个写,管道大小的定义:PIPE_BUF,在include/linux/limits.h中,一般大小为4096,西安电子科技大学软件学院,9,通信方法管道调用,系统调用,Pipe(),读、写操作,输入参数intfiledes2返回值中filedes0为读句柄filedes1为写句柄,西安电子科技大学软件学院,10,通信方法消息,使用消息队列标识符进行标识,Msgget创建一个新队列或者打开一个已经存在的队列,Msgsnd向队列末端添加一条新消息,Msgrcv从队列中取消息,注:取消息不一定是按照先进先出原则,也可以按照消息类型字段获取(msgrcv方式决定),西安电子科技大学软件学院,11,通信方法-信号量,用于保护临界资源,以及进程间同步,初始化函数sem_init(),注意参数,等待信号量可用sem_wait/sem_trywait,释放信号量sem_post,西安电子科技大学软件学院,12,通信方法-共享内存,进程间数据通信方法,直接读写内存,不需要任何数据拷贝,管道、消息机制都需要在内核、用户空间进行数据拷贝(系统调用过多),Shm_get用于创建或者获取标识符,Shm_at用于获取对应的地址,Shm_dt用于删除,西安电子科技大学软件学院,13,通信方法-套接字,进程间数据通信方法,事件形式,RAW_SOCKET,发送、接收都一致,西安电子科技大学软件学院,14,什么是设备驱动程序,设备驱动程序就是外部设备的软件抽象,或者说是软件表现,是系统看到的设备,是虚拟的设备。,一个外设的性能在很大程度上取决于驱动程序的性能。驱动程序之于外部设备,犹如操作系统之于硬件环境。,西安电子科技大学软件学院,15,驱动程序有什么用,Linux下的设备驱动程序都是一个个独立的“黑盒子”,使某个特定的硬件响应一个定义良好的内部编程接口,同时完全隐藏了设备的工作细节。,用户对设备的操作通过一组标准化的系统调用来完成。驱动程序就是将这些调用映射到作用于实际硬件的设备特定的操作上(写寄存器命令)。,西安电子科技大学软件学院,16,系统调用接口,设备1,设备2,设备3,驱动1,驱动2,驱动3,用户程序,用户空间,内核空间,内核子系统,其它模块,其它模块,硬件,驱动程序在内核中的位置,西安电子科技大学软件学院,17,模块化的驱动程序,为了使系统更有效的运行,Linux支持内核的动态扩展,即在系统运行时给内核增加新的功能(模块)。,驱动程序就是几个可以模块化的功能之一。这也是Linux下驱动程序与Windows下驱动程序的最大区别。,西安电子科技大学软件学院,18,什么是模块,模块是一段没有链接的目标代码(.o)可由insmod程序动态的链接到正在运行的内核链接后,它就成了内核的一部分,直到用rmmod程序解除链接。和用户函数库的动态链接有些相似;但函数的功能在链接前就已明确,而模块连接时才注册自己的功能。,西安电子科技大学软件学院,19,系统内核,西安电子科技大学软件学院,20,驱动程序,系统内核,西安电子科技大学软件学院,21,驱动程序,将驱动程序加入到内核中,系统内核,西安电子科技大学软件学院,22,西安电子科技大学软件学院,23,核心模块与应用程序的对比,西安电子科技大学软件学院,24,简单驱动程序举例子-2.4,#ifndefMODULE#defineMODULE#endif#ifndef_KERNEL_#define_KERNEL_#endif#include#includeintinit_module(void)printk(KERN_ALERT“HelloWorld!n”);return0;,西安电子科技大学软件学院,25,voidcleanup_module(void)printk(KERN_ALERT“Goodbye!n”);MODULE_LICENSE(“GPL”)/为了避免”nolicense”警告-MakeFile文件MODULECFLAGS:=-I/usr/src/linux-2.4/includeDMODULED_KERNEL_hello.o:hello.cgcc$(MODULECFLAGS)chello.c.PHONY:cleanclean:rmfhello.o,简单驱动程序举例子-2.4,注意之处1:2.4内核中,MODULE和_KERNEL_宏必须定义,无论是在编译选项时还是在源文件代码中。保险期间:两边都写,同时使用ifdef宏加了保护,不会出现重复定义2:如果在printk打印时候不使用KERN_ALERT宏,则linux/kernel.h可以不包括3:头文件linux/module.h必须添加4:初始化必须是init_module,退出函数必须是cleanup_module,西安电子科技大学软件学院,26,简单驱动程序举例子-2.4,西安电子科技大学软件学院,27,简单驱动程序举例子-2.6,#include#include#includeMODULE_LICENSE(DualBSD/GPL);staticchar*whom=world;module_param(whom,charp,0);staticinthowmany=1;module_param(howmany,int,0);staticinthello_init(void)inti;for(i=0;imajor=MAJOR(inode-i_rdev);dev-minor=MINOR(inode-i_rdev);dev-read_buffer=kmalloc(sizeof(READ_BUF_SIZE),GFP_KERNEL);if(dev-read_buffer=NULL)printk(KERN_ALERTallocatereadbuffermemoryfailed.n);dev-write_buffer=kmalloc(sizeof(WRITE_BUF_SIZE),GFP_KERNEL);if(dev-read_buffer=NULL)printk(KERN_ALERTallocatewritebuffermemoryfailed.n);init_waitqueue_head(,55,西安电子科技大学软件学院,intmy_release(structinode*inode,structfile*filp)structMydevice*dev=filp-private_data;if(dev-read_buffer!=NULL)kfree(dev-read_buffer);if(dev-write_buffer!=NULL)kfree(dev-write_buffer);kfree(dev);printk(ThefunctionofMyreleasehasbeencalled!n);return0;,56,西安电子科技大学软件学院,ssize_tmy_read(structfile*filp,char*buf,size_tcount,loff_t*offp)char*pdata=kmalloc(sizeof(count),GFP_KERNEL);if(pdata=NULL)return(-ENOMEM);copy_to_user(buf,pdata,count);*offp+=count;printk(ThefunctionofMyreadhasbeencalled!n);returncount;,57,西安电子科技大学软件学院,ssize_tmy_write(structfile*filp,char*buf,size_tcount,loff_t*offp)char*pdata=kmalloc(sizeof(count),GFP_KERNEL);if(pdata=NULL)return(-ENOMEM);copy_from_user(pdata,buf,count);*offp+=count;printk(ThefunctionofMyreadhasbeencalled!n);returncount;,58,西安电子科技大学软件学院,intmy_ioctl(structinode*inode,structfile*filp,unsignedintcmd,unsignedlongarg)switch(cmd)case1:printk(Thisiscommand1!n);break;case2:printk(Thisiscommand2!n);break;case3:printk(Thisiscommand3!n);break;default:printk(Thereisnosuchcommand!n);return-1;return0;,59,西安电子科技大学软件学院,structfile_operationsfops=open:my_open,/*open函数*/release:my_release,/*write函数*/read:my_read,/*read函数*/write:my_write,/*write函数*/ioctl:my_ioctl,/*ioctl函数*/;用上面声明的各函数声明文件操作结构file_operations。,60,西安电子科技大学软件学院,intmy_init(void)intres=register_chrdev(DEV_MAJOR,DEV_NAME,61,西安电子科技大学软件学院,intmy_cleanup(void)unregister_chrdev(major,DEV_NAME);printk(Mydevicereleasesuccess!n);return0;module_init(my_init);module_exit(my_cleanup);MODULE_LICENSE(GPL);,62,西安电子科技大学软件学院,西安电子科技大学软件学院,63,傻瓜步骤,设计驱动程序1.1实现各个文件操作函数1.2声明函数指针数组1.3完成初始化函数,并向系统注册。完成清除函数。建立设备文件节点mknod/dev/testdevcxxx0设计测试应用程序,西安电子科技大学软件学院,64,傻瓜步骤,加载驱动程序insmodchar_dev.o运行应用程序进行测试卸载驱动程序rmmodchar_dev,西安电子科技大学软件学院,65,谢谢!,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!