摘要:
Eclipse+CDT+gdb调试android ndk程序先介绍一下开发环境,在这个环境下,up主保证是没有问题的。ubuntu 11.10eclipse 3.7(indego) for javajdk 6android sdk 2.2andrid ndk r7当然,在windows环境下通过cygwin等工具也是可以实现gdb调试的,我也确实实现过。但是性能实在太低,卡的根本没法用。Linux下直接用gdb调试本地方法是很流畅的。再确定安装并配置好开发环境之后,就可以开始了。首先得确定自己能够正常的运行一个ndk工程,连运行都成问题的话,也就谈不上什么调试了。新建一个android项目,选 阅读全文
摘要:
struct utsname systemInfo; uname(&systemInfo); NSString *deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; 通过,如上方式即可获取到设备的型号信息,具体对应关系如下,截止2013,2,5。 iphone 5,1 iphone5(移动,联通) iphone 5,2 iphone5(移动,电信,联通) iphone 4,1 iphone4S iphone 3,1 ... 阅读全文
摘要:
在第五章并发与竞态中,介绍了一个当进程需要的资源被其他进程占用,而不得不等待该资源的情形。这里,要说的则是即便进程得到资源之后,由于资源本身的一些问题而不能预期的完成功能,必须休眠一段时间,直到它的要求得到满足。两种情形的区别是显而易见的,不过在使用上,实在是有点相似。其实最近学的一些东西都是这样,信号量,自旋锁....不管他们的内在区别的话,使用时无外乎就是初始化,然后在一个地方申请,另一个地方反馈。先对休眠有一个基础的认识先。就是说,进程确实是在运行,需要的东西也有给它了,但是,给它的东西却不满足它的要求,于是乎它还是做不了事。怎么办呢,就只有让它等了,当前进程也就休眠了。进入休眠的时候会 阅读全文
摘要:
第三章介绍了一个简单的字符设备驱动程序,它是一块内存当做设备的。当时的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中的一个个字节,就是第三维了(这个是我个人. 阅读全文
摘要:
也许我们可以这么理解,在上一篇介绍的三个数据结构中。file和inode代表着我们要操作的目标,而file_operation提供了对目标的操作。更重要的是,file_operation中的函数都是固定的,每一个函数在什么时候被调用都是内核规定的(事件机制??)。我们要做的事情就是把我们的代码写到对应的位置就是了。这样,就要了解每一个函数的具体作用,以及它究竟在何时会被内核调用了。 open函数的原型如下:1 int (*open)(struct inode *inode, struct file *filp); 其实,file_operation中的大部分函数的参数都会有inode 和fi. 阅读全文
摘要:
上一篇讲到了注册设备编号,显然,注册设备编号只是编写驱动代码的第一个步骤。为了完成以后的一些步骤,先介绍三个重要的内核数据结构。 file_operation囊括了所有设备操作到设备号的链接。在linux中驱动以文件的方式存在,而file_operation则是对文件(这里是是字符设备)的所有操作的集合。由于file_operation的成员太多,而当前scull项目仅仅用到了其中的几个。 scull项目的file_operation初始化如下:1 struct file_operations scull_fops = {2 .owner = THIS_MODULE,3 .llseek = . 阅读全文
摘要:
进入第三章了,这一章的目标是写一个完成的字符设备驱动。书中以一个scull项目为例,开始介绍字符设备驱动。值得一提的是,scull不依赖于特定的硬件设备,其实对于scull来说,它的设施就是一片内存空间。作者让内存来充当这个驱动的硬件设备。就这一章来说,内存模拟了四个“设备”:scull0 to scull3。这四个设备是全局静态的。虽然他们是由内存组成的,我们把他们当做实际的设备就好了,因为它们用起来跟实际的设备其实也没有什么区别。 对于像我这种初学者来说,很多概念都是新的,值得仔细研究。 主设备号和次设备号。 Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/de. 阅读全文