08 2011 档案
摘要:在第五章并发与竞态中,介绍了一个当进程需要的资源被其他进程占用,而不得不等待该资源的情形。这里,要说的则是即便进程得到资源之后,由于资源本身的一些问题而不能预期的完成功能,必须休眠一段时间,直到它的要求得到满足。两种情形的区别是显而易见的,不过在使用上,实在是有点相似。其实最近学的一些东西都是这样,信号量,自旋锁....不管他们的内在区别的话,使用时无外乎就是初始化,然后在一个地方申请,另一个地方反馈。先对休眠有一个基础的认识先。就是说,进程确实是在运行,需要的东西也有给它了,但是,给它的东西却不满足它的要求,于是乎它还是做不了事。怎么办呢,就只有让它等了,当前进程也就休眠了。进入休眠的时候会
阅读全文
摘要:第三章介绍了一个简单的字符设备驱动程序,它是一块内存当做设备的。当时的scull还很简单(只是介绍了openreleasereadwrite四个函数),这一章将进入讲述字符设备驱动程序的一些高级操作。ioctl函数,从函数名来看的话,iocontrol,看上去是用来操作IO的。更通俗的讲,对于硬件控制的代码应该置于此处。对于当前的scull来说,最常用的对硬件的操作也就是修改当前的量子大小(quantun)和当前的数组大小(qset)了。在用户空间调用的ioctl函数原型如下:1 int ioctl(int fd, unsigned long cmd, ...); 三个点的参数看上去有点新奇.
阅读全文
摘要:上一回主要介绍了使用信号量好处理竞态问题。有时候,驱动会碰见这种问题,就是一个线程在运行时,需要等待另外一个线程完成某个动作才能继续。这种情况跟竞态还是有点区别的,说不太清楚。当然这种情形可以用信号量来达到效果,但是这种方法有很多的缺点(对于这种特殊的情况来说)。于是内核就提供了一个全新的接口来专门处理这种情况。Completion(定义在<linux/completion.h>中),正如它的名字,它的作用在于让一个线程告诉另一个线程它完成了某项工作。跟信号量得使用一样,它可以通俗的理解为三个主要部分:初始化,申请和释放。初始化的代码:1 DECLARE_COMPLETION(my
阅读全文
摘要:第三章介绍了一个以内存为设备的字符设备驱动。需要注意的是,第三章介绍的只是这个驱动的最基本的四个函数,open release read和write 有了这四个函数,这个驱动也就可以使用了。不过,从书本附带的源码中得到的scull工程的代码可远远不止这四个函数,它的很多代码时为了后面章节的扩展。同时,由于内核版本跟作者所使用的内核版本不一致,在编译这个scull的时候会出现很多的问题,http://www.linuxidc.com/Linux/2011-06/37818.htm这篇文章介绍了在编译是可能遇到的问题以及解决方法,必须得感谢这篇文章的作者,我终于成功地把scull编译出来了。 第.
阅读全文
摘要:在设备驱动简介时,就提到过要编写特定硬件的设备,首先要相当的了解这个设备。scull的设备就是一片内存,了解scull的设备就得知道scull的内存使用了。 如图所示: 事实上,可以把scull的内存直接理解为一个3维数组了(类似)。第一维的单元是Scull_device结构,Scull_device结构的代码如下:1 struct scull_qset {2 void **data;3 struct scull_qset *next;4 }; data指向一个指针数组,这个里面的指针指向Quantum,Quantum就处在第二维了,而Quantum中的一个个字节,就是第三维了(这个是我个人.
阅读全文

浙公网安备 33010602011771号