Linux驱动设计——阻塞和同步】的更多相关文章

阻塞和非阻塞是设备访问的两种基本方式,阻塞和非阻塞驱动程序使用时,经常会用到等待队列. 阻塞和非阻塞 阻塞操作是指在执行设备操作时,若不能获得资源,则挂起进程直到满足可操作的条件后再进行操作.被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足.而非阻塞操作的进程在不能进行设备操作时,并不挂起,它或者放弃,或者不停地查询,直至可以进行操作为止. 对于同步调用来说,许多时候当前线程还是激活的,只是逻辑上当前函数没有返回而已. 阻塞的进程被唤醒的最大可能是通过中断,因为硬件资源获…
中断和时钟技术可以提升驱动程序的效率 中断 中断在Linux中的实现 通常情况下,一个驱动程序只需要申请中断,并添加中断处理函数就可以了,中断的到达和中断函数的调用都是内核实现框架完成的.所以程序员只要保证申请了正确的中断号及编写了正确的中断处理函数即可. 中断的宏观分类 1.硬中断 由系统硬件产生的中断.系统硬件通常引起外部事件.外部事件事件具有随机性和突发性,因此硬件中断也具有随机性和突发性. 2.软中断 软中断是执行中断指令时产生的.软中断不用外设施加中断请求信号,因此软中断的发生不是随机…
链接:https://www.zhihu.com/question/19732473/answer/20851256 1.同步与异步同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回.但是一旦调用返回,就得到返回值了.换句话说,就是由*调用者*主动等待这个*调用*的结果. 而异步则是相反,*调用*在发出之后,这个调用就直接返回了,所…
并发的概念:多个执行单元同时.并行被执行. 共享资源:硬件资源(IO/外设等),软件上的全局变量.静态变量等. 四种并发控制机制(对共享资源互斥的访问):原子操作.自旋锁(spinlock).信号量(semaphore)和完成量(completion).中断屏蔽也可以作为一种并发控制机制. 发生竞态情况: 对称多处理器(SMP)的多个CPU之间的竞态 单CPU内进程间的竞态 中断(硬中断.软中断.Tasklet.底半部)与进程之间的竞态 中断屏蔽 可以解决中断与进程之间.内核抢占进程之间的并发.…
Linux内核理论基础 组成Linux内核的5个子系统:进程调度(SCHED)/内存管理(MM)/虚拟文件系统(VFS)/网络接口(NET)/进程间通信(IPC). 进程调度(SCHED) 在设备驱动编程中,当请求的资源不能得到满足时,驱动一般会调度其他进程执行,并使本进程进入睡眠状态,直到它请求的资源被释放,才会被唤醒而进入就绪态.睡眠分成可被打断的睡眠和不可被打断的睡眠,两者的区别在于可被打断的睡眠在收到信号的时候会醒. 内存管理(MM) 内存管理的主要作用是控制多个进程安全地共享主内存区域…
Linux字符设别驱动结构 cdev结构体 struct cdev { struct kobject kobj; struct module *owner; const struct file_operations *ops; struct list_head list; dev_t dev; unsigned int count; }; dev_t成员定义了32位的设备号,其中12位为主设备号( 获取主设备号MAJOR(dev_t dev) ),20位为次设备号( 获取次设备号 MINOR(d…
名词解释 内存空间与IO空间 内存空间是计算机系统里面非系统内存区域的地址空间,现在的通用X86体系提供32位地址,寻址4G字节的内存空间,但一般的计算机只安装256M字节或者更少的内存,剩下的高位内存就被用于PCI或者AGP及系统桥设备的使用上面,主机可以像访问系统内存一样访问这些高端内存,这样对于扩展的设备有更大的空间. Linux用户空间与内核空间 IO空间是X86系统上面的专用空间,现在的IO空间大小是64K字节,从0x0000到0xffff,可以供设备使用,比如南桥很多的设备就是挂在I…
request_irq函数定义 /*include <linux/interrupt.h>*/ int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id) 使用: 将中断号irq与中断处理函数handler对应 返回值:成功返回0,失败返回非0. 参数: irq:指定要分配的中断号,中断号的定义在“include/mach/…
杂项设备 linux里面的misc杂项设备是主设备号为10的驱动设备,misc设备其实也就是特殊的字符设备,可自动生成设备节点. 定义头文件<linux/miscdevice.h>   杂项设备的结构体: struct miscdevice{ int minor; //杂项设备的此设备号(如果设置为MISC_DYNAMIC_MINOR,表示系统自动分配未使用的minor) const char *name; const stuct file_operations *fops;//驱动主题函数入…
参考博客与书籍: <Linux设备驱动开发详解> <Linux设备驱动程序> http://blog.chinaunix.net/uid-24219701-id-2884942.html 对于驱动程序设计来说,核心问题之一就是如何完成调试.当前常用的驱动调试技术可分为: 1. 打印调试 printk 重定向控制台消息 消息记录 开启和关闭消息速度限制 打印设备编号 2. 调试器调试 gdb kdb内核调试器 kgdb补丁 3. 查询调试 使用/proc文件系统 ioctl方法 4.…
本节对内外存访问做详细的介绍. 驱动程序加载成功的一个关键因素,就是内核能够为驱动程序分配足够的内存空间.这些空间一部分用于驱动程序必要的数据结构,另一部分用于数据的交换.同时,内核也应该具有访问外部设备端口的能力.一般来说,外部设备被连接到内存空间或者I/O空间中. 内存分配 内核态的内存分配函数 kmalloc() 此函数在物理内存中为程序分配一个连续的存储空间.这个存储空间的数据不会被清零,也就是保存内存中原有的数据. kmalloc()函数能够分配32字节.64字节.128字节.....…
1.warning: passing argument 2 of 'request_irq' from incompatible pointer type http://blog.sina.com.cn/s/blog_7321be1101012gek.html 今天在些key的driver的时候...写完了编译出现一个warmming如下:warning: passing argument 2 of 'request_irq' from incompatible pointer type 我的r…
cdev结构体和它的初始化注册函数原型 struct cdev {   struct kobject kobj;          // 每个 cdev 都是一个 kobject   struct module *owner;       // 指向实现驱动的模块   const struct file_operations *ops;   // 操纵这个字符设备文件的方法   struct list_head list;       // 与 cdev 对应的字符设备文件的 inode->i_…
硬件平台 Kintex ®-7 family of FPGAs Intel X86 软件平台 Linux 4.15.0-36-generic #39~16.04.1-Ubuntu Xilinx xapp1052 运行界面…
开始准备看Java NIO的,这篇文章:http://xly1981.iteye.com/blog/1735862 里面提到了这篇文章 http://xmuzyq.iteye.com/blog/783218 同步.异步.阻塞.非阻塞.reactive.proactive等讲的不错. 在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式, 其中Reactor模式用于同步I/O, 而Proactor运用于异步I/O操作. 什么是同步和异步 同步和异步是针对应用程序和内核的…
聊聊Linux用户态驱动设计   序言 设备驱动可以运行在内核态,也可以运行在用户态,用户态驱动的利弊网上有很多的讨论,而且有些还上升到政治性上,这里不再多做讨论.不管用户态驱动还是内核态驱动,他们都有各自的缺点.内核态驱动的问题是:系统调用开销大:学习曲线陡峭:接口稳定性差:调试困难:bug致命:编程语言选择受限:而用户态驱动面临的挑战是:如何中断处理:如何DMA:如何管理设备的依赖关系:无法使用内核服务等.对此,<User-Space Device Drivers in Linux: A F…
一.概念 应用程序使用API接口,如open.read等来最终操作驱动,有两种结果--成功和失败.成功,很好处理,直接返回想要的结果:但是,失败,是继续等待,还是返回失败类型呢?  如果继续等待,将进程休眠,那么这类驱动设计就是阻塞式的:如果不等待,返回失败的类型(原因),那么这类驱动的设计就是非阻塞式的. 在应用程序打开驱动文件的时候,可以通过参数向驱动传递使用驱动的方式(阻塞或者非阻塞),通过flags这个参数来传递.当flags中包含“O_NONBLOCK”,就是非阻塞,否则就是阻塞式的.…
Linux五种IO模型 同步和异步 这两个概念与消息的通知机制有关. 同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.比如,调用readfrom系统调用时,必须等待IO操作完成才返回. 异步 异步的概念和同步相对.当一个异步过程调用发出后,调用者不能立刻得到结果.实际处理这个调用的部件在完成后,通过状态.通知和回调来通知调用者.比如:调用aio_read系统调用时,不必等IO操作完成就直接返回,调用结果通过信号来通知调用者. 阻塞与非阻塞 阻塞与非阻塞与等待消息通知…
内核同步 同步介绍 同步的概念 临界区:也称为临界段,就是訪问和操作共享数据的代码段. 竞争条件: 2个或2个以上线程在临界区里同一时候运行的时候,就构成了竞争条件. 所谓同步.事实上防止在临界区中形成竞争条件. 假设临界区里是原子操作(即整个操作完毕前不会被打断),那么自然就不会出竞争条件.但在实际应用中.临界区中的代码往往不会那么简单,所以为了保持同步,引入了锁机制.但又会产生一些关于锁的问题. 死锁产生的条件:要有一个或多个运行线程和一个或多个资源,每一个线程都在等待当中的一个资源.但全部…
描述和API 阻塞IO和非阻塞IO的应用编程时的处理机制是不同的,如果是非阻塞IO在访问资源未就绪时就直接返回-EAGAIN,反之阻塞IO则会使当前用户进程睡眠直到资源可用.从应用场景来说两种方式分别适应不同的使用场景.而驱动开发不可避免的需要支持两种访问方式.如果不是采用现成的子框架而自己实现文件操作底层接口部分时就需要自己实现这一机制.文件的访问方式除了在打开文件时指定外还可以在打开以后通过fcnt和ioctl进行修改和获取. 阻塞IO 在实现过程依赖两个重要的数据结构等待队列头(wait_…
socket阻塞与非阻塞,同步与异步 作者:huangguisu 转自:http://blog.csdn.net/hguisu/article/details/7453390 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端:  同步:       所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事.…
除了自己实现之外,还有个c语言写的基于事件的开源网络库:libevent http://www.cnblogs.com/Anker/p/3265058.html 最简单的select示例: #include <stdio.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #define STDIN 0 // file descriptor for standard inpu…
转自:https://www.cnblogs.com/welhzh/p/4950341.html 除了自己实现之外,还有个c语言写的基于事件的开源网络库:libevent http://www.cnblogs.com/Anker/p/3265058.html 最简单的select示例: #include <stdio.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #de…
linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, 驱动开发中设计到的硬件: * 数字电路知识 * ARM硬件知识 * 熟练使用万用表和示波器 * 看懂芯片手册和原理图 4, linux内核源代码目录结构: * arch/: arch子目录包括了所有和体系结构相关的核心代码.它的每一个子目录都代表一种支持的体系结构,例如i386就是关于intel c…
linux内核原理面试必问(由易到难) 简单型 1:linux中内核空间及用户空间的区别?用户空间与内核通信方式有哪些? 2:linux中内存划分及如何使用?虚拟地址及物理地址的概念及彼此之间的转化,高端内存概念? 3:linux中中断的实现机制,tasklet与workqueue的区别及底层实现区别?为什么要区分上半部和下半部? 4:linux中断的响应执行流程?中断的申请及何时执行(何时执行中断处理函数)? 5:linux中的同步机制?spinlock与信号量的区别? 6:linux中RCU…
1.字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上层应用程序打开使用的文件? 答:mknod命令结合设备的主设备号和次设备号,可创建一个设备文件. 评:这只是其中一种方式,也叫手动创建设备文件.还有UDEV/MDEV自动创建设备文件的方式,UDEV/MDEV是运行在用户态的程序,可以动态管理设备文件,包括创建和删除设备文件,运行在用户态意味着系统要运行之后.那么在系统启动期间还有devfs创建了设备文件.一共有三种方式可以创建设备文件. 2.写一个中断服务需要注意哪些?…
1. Linux设备中字符设备与块设备有什么主要的区别?请分别列举一些实际的设备说出它们是属于哪一类设备. 字符设备:字符设备是个能够像字节流(类似文件)一样被访问的设备,由字符设备驱动程序来实现这种特性.字符设备驱动程序通常至少实现open,close,read和write系统调用.字符终端.串口.鼠标.键盘.摄像头.声卡和显卡等就是典型的字符设备. 块设备:和字符设备类似,块设备也是通过/dev目录下的文件系统节点来访问.块设备上能够容纳文件系统,如:u盘,SD卡,磁盘等. 字符设备和块设备…
1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端:  同步: 所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步: 异步的概念和同步相对.当c端一个异步过程调用发出后,调用者不能立刻得到结…
socket阻塞与非阻塞,同步与异步 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步:      所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:      异步的概念和同步相对.当一个异步过程调用发出后,…
1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端:  同步: 所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步: 异步的概念和同步相对.当c端一个异步过程调用发出后,调用者不能立刻得到结…