- 博客(16)
- 资源 (4)
- 收藏
- 关注
原创 linux设备驱动下的工作队列(workqueue)
从表面和使用来看,工作队列类似与tasklet,它们都允许内核代码请求某个函数在将来的时间被调用。但实际上它们有一些非常重要的区别:1、 tasklet在软件中断上下文中运行,因此所有的tasklet代码都必须是原子的。而工作队列函数在一个特殊内核进程的上下文总运行,所以具有更好的灵活性。更主要的是工作队列函数可以休眠。2、 tasklet始终运行在被初始提交的同一处理器上
2012-03-29 18:50:19 3561
原创 linux设备驱动下的tasklet
在设备驱动的中断处理中经常会用到tasklet,在前面稍微看了下linux的软中断后,tasklet就很容易理解了。Tasklet也要用到软中断,而tasklet的用法和定时器的用法很相似。 同样的在main.c中, start_kernel-->softirq_init 先给出tasklet的结构体定义:str
2012-03-29 18:47:30 1557
原创 linux的动态定时器--时间轮
定时器—有时也称为动态定时器或内核定时器—是管理内核时间的基础。定时器是一种软件功能,即允许在将来的某个时刻,函数在给定的时间间隔用完时被调用。注意的是定时器并不会周期运行,它在超时后就自行销毁,这也是定时器被称为动态定时器的一个原因。动态定时器不断地创建和销毁,而且它的运行次数也不受限制。 定时器在内核代码中属于一个基础组件。要想完全弄清楚linux2.6中内核定时器的实现,得......
2012-03-29 00:33:27 8094
原创 linux的软中断
本来没想到写这个的,但在研究linux的动态定时器时,发现动态定时器是用到软中断机制的,所以对软中断做一个浅显的了解: 在分析过程中,愈加的觉得kernel是一个整体,想单单搞懂驱动是有难度的,因为kernel是个整体。你要懂驱动,就要对驱动模型,就要对文件系统、内存管理和进程调度等等有一定了解。 下面来分析soft irq:在kernel/softirq.c中:
2012-03-28 23:07:14 3140
原创 简单hash就是数组加链表
简单的hash就是用数组加链表的组合来实现,这种hash很简单,但hash的思想在那。 贴出代码:hash.h:#ifndef _HASH_H_#define _HASH_H_typedef struct _ListNode{ struct _ListNode *prev; struct _ListNode *next; void *data;}L
2012-03-26 21:56:41 3897
原创 暗时间----有感而发
首先给出《暗时间》一文的链接:http://mindhacks.cn/2009/12/20/dark-time/ 该文的作者在我看来是一个牛人,同样作为一个写blog的程序员,我的blog都是技术的一些点滴,他已经上升为方法论或者说思维方法的高度。虽然还没到哲学的高度,但他的高度值得我学习奋斗相当长的时间了。 当年看了他的一篇文章后毅然从南京来到了深圳,从事嵌入式linu
2012-03-22 19:01:35 1156
原创 linux设备驱动--异步通知
<!--@page {margin:2cm}p {margin-bottom:0.21cm}--> 异步通知意味着设备可以通知应用程序自身可被访问,实现了异步IO。 在ldd3中给出了设备驱动实现异步信号的详细操作顺序:1.当发出F_SETOWN,什么都没发生,除了一个值被赋值给filp->f_owner.2.当
2012-03-21 21:56:21 1043
原创 berkeleyDB的安装
下载的版本是berkeyleyDB.5.3,安装过程很简单: #../dist/configure #make #make install安装的默认目录是:/usr/local/BerkeleyDB.5.3网上抄了个程序:#include #include #include #include //only this head
2012-03-20 20:13:32 1993
原创 linux设备驱动--非阻塞IO与select,poll调用 (续2)
<!--@page {margin:2cm}p {margin-bottom:0.21cm}--> 在续1中了解中bitmap在select的用法后,下面就开始分析select Select系统调用的调用过程: Sys_select-->core_sys_select-->do_select-->f_op->
2012-03-19 20:35:44 1388
原创 linux设备驱动--非阻塞IO与select,poll调用 (续1)
<!--@page {margin:2cm}p {margin-bottom:0.21cm}--> 在《linux设备驱动--非阻塞IO与select,poll调用》中给出了驱动中poll函数的一般写法,很简单明了。但是为什么这么写,还是要稍微追究一下的。<!--@page {margin:2cm}p {margin
2012-03-19 20:22:56 1418
原创 linux设备驱动--阻塞IO(续)
<!--@page {margin:2cm}p {margin-bottom:0.21cm}-->在《linux设备驱动--阻塞IO》中对阻塞IO的实现做了一个模板式的概述,也给出了内核中等待队列的系列函数接口的使用。但是阻塞IO到底是如何实现的,总觉得还有层窗户纸没戳破,这个让我有点不爽。 于是再多花点时间戳个小窟窿看看,但是仅仅
2012-03-16 22:42:41 1498
原创 linux设备驱动--非阻塞IO与select,poll调用
在linux应用编程中,经常要用到select和poll调用。select和poll的功能本质是一样的,都允许进程决定是否可以对一个或多个打开的文件做非阻塞的读或写。 举几个工作中用到的select或poll例子:1、编解码中,监听几个编解码通道的;2、对于主CPU,监听挂载的几个dsp;3、socket编程等等。 对于驱动程序而言,上面的系统调用通过驱动程序
2012-03-13 23:26:32 2241
原创 linux设备驱动--阻塞IO
阻塞与非阻塞IO与进程的调度密切相关,但是深入的进程调度的算法还不到时间去研究,因为个人的方针是先以设备模型和文件系统为突破口,循序渐进。 这个并不妨碍目前对设备驱动中的阻塞与非阻塞IO的理解。 阻塞操作是指在执行设备操作时,若不能获得资源,则挂起进程直到满足可操作的条件后再进行操作。被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足。
2012-03-12 23:06:28 2110
原创 linux设备驱动--并发与竞态之信号量
信号量(semaphore)是用于保护临界区的一种常用手段。与自旋锁相同,只有得到信号量的进程才能执行临界区代码。但不同的是,当获取不到信号量时,进程不会“自旋”而是进入休眠等待状态。 To use semaphores,kernel code must include . 信号量的初始化: 直接创建信号量: void
2012-03-10 23:58:57 1100
原创 linux设备驱动--并发与竞态之自旋锁
自旋锁(spin lock)是一种典型的对临界资源进行互斥访问的手段。与信号量不同,自旋锁可在不能休眠的代码中使用,比如中断处理例程。(自旋锁api的一些衍生都是与中断相关的)在正确使用的情况下,自旋锁通常可以提供比信号量更高的性能。 自旋锁相关的主要操作如下:This initialization may be done at compile time as follo
2012-03-10 20:04:07 1469
原创 linux设备驱动--并发与竞态之原子操作
原子操作指的是在执行过程中不会被别的代码路径所中断的操作。 linux下面有两类原子操作,一类是整形原子操作,一类是位原子操作。 原子操作目前仅仅做个测试验证学习,至于原子操作在哪些场合适合用到,还需要今后更多的驱动以及内核代码的fuck。 整形原子操作的函数说明:void atomic_set(atomic_t *v, int i);atom
2012-03-10 00:15:03 2280
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人