- 博客(28)
- 资源 (56)
- 收藏
- 关注
原创 linux select&poll
还有一个与设备阻塞与非阻塞访问息息相关的论题,即select和poll,select和poll的本质一样,前者在BSD Unix中引入,后者在System V中引入。poll和select用于查询设备的状态,以便用户程序获知是否能对设备进行非阻塞的访问,它们都需要设备驱动程序中的poll函数支持。 驱动程序中poll函数中最主要用到的一个API是poll_wait,其原型如下:v
2012-01-31 15:39:40 2433
转载 Linux驱动编程 step-by-step
第三次看了LDD3了(虽然现在已经是kernel3.0但从这本书商还是能学到很多) 每次都有一些收获 现在终于能够写一写代码了驱动程序的作用:简单来说 驱动程序就是使计算机与设备通信的特殊的代码,在作单片机时候(无OS)我们自己定义接口及自定义的结构来操作相关硬件,而在有OS的模式下我们操作的硬件是去实现对应的接口(这些接口是已定义好的,我们需要实现这些接口)而无需自己定义接口,这样既能正
2012-01-19 16:55:54 1894
转载 Linux编程常用的函数
总共分为12部分分别是:进程、线程、消息队列、信号量集、共享内存、PGSQL编程、MYSQL编程、网络编程、文件访问、标准I/O、系统数据文件和信息、信号(一) 进程1. 进程ID为0的进程通常是调度进程,常常被称为交换进程进程ID为1的进程通常是init进程,在自举过程结束时由内核调用进程ID为2的进程页守护进程,负责支持虚拟存储系统的分页操作2.
2012-01-18 17:13:29 1317
原创 Linux基础编程-文件操作open,lseek,read,write,close
Linux基础编程-文件操作open,lseek,read,write,close Linux上面对文件的操作可以分为两种:1.Linux系统提供的API; 2.C标准的文件操作函数。前者依赖于Linux系统,后者是标准的C文件操作函数与操作系统无关。 文件操作方式主要是打开,读写和关闭这三种。在LinuxAPI之中主要是使用open函数,write,read,close。
2012-01-18 17:06:07 1026
原创 字符设备驱动学习(二) 设备接点的创建
驱动程序编写好后,还需要创建设备节点,有两种方式:一是通过mknod命令去手动创建,例如:mknod /dev/hello c 250 0,/dev/hello为设备节点名字,c代表字符设备,250和0代表它的主次设备号。二是使用udev或mdev来实现自动创建设备节点。使用mknod手动创建设备节点不够灵活,如果是动态分配的设备号怎么办,难道每次加载驱动后去查看/proc
2012-01-18 16:58:58 1191
原创 字符设备驱动学习(一)
一般的流程都是,呵呵,其实也不算是一般的流程了,只是手动加载字符设备驱动的一种方法吧,1. 先使用register_chrdev_region或alloc_chrdev_region来注册一个字符设备的设备号,大家都知道Linux是通过设备号来找到相应的驱动程序的,所以你要注册字符设备的时候,需要一个设备号或系统为你指定一个设备号。这两函数的差别就是register_chrdev_reg
2012-01-18 16:54:40 1184
原创 Linux多线程函数解析
Linux多线程函数用得比较多的是下面的3个pthread_create(),pthread_exit(),pthread_join();它们都是在头文件之中。编译时需要加静态库-lpthread 下面是函数的说明: pthread_create是UNIX环境创建线程函数 int pthread_create( pthread_t *restrict tidp,
2012-01-18 16:48:45 1065
原创 Linux编程中安装必要的man帮助文档
linux开发的过程中,比较痛苦的就是在linux没有找到一个好用的帮忙文档,像windows中有MS强大的MSDN,而刚开始入门又不似一些大牛能刷刷的直接找到定义的头文件,甚至源文件,,,所以痛苦的时光时常发生,今天网上看了一下,其实系统自带的man工具就有很强大的功能,只是我们需要安装各个库的帮忙文档而矣需要查找类似于pthread_create函数需要安装 pos
2012-01-18 16:45:52 1049
原创 misc杂项设备驱动
Linux里面的misc杂项设备是主设备号为10的驱动设备,它的注册跟使用比较的简单,所以比较适用于功能简单的设备。它有自己的设备结构体: struct miscdevice { int minor; const char *name; const struct file_operations *fops; struct list_head
2012-01-18 16:32:35 1594
原创 open系统调用在内核中的流程分析
真是蛮复杂的,我分三步走,力求讲得比较清楚。以字符设备为例,相对于块设备要简单些。基于2.6.26的内核一)驱动注册open函数都干了些什么?register_chrdev -> cdev_add -> kobj_mapfile: fs/char_dev.cint register_chrdev(unsigned int major, const c
2012-01-18 16:30:12 1782
原创 Linux系统调用列表
以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数。这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完全也是很罕见的。按照惯例,这个列表以man pages第2节,即系统调用节为蓝本。按照笔者的理解,对其作了大致的分类,同时也作了一些小小的修改,删去了几个仅供内核使用,不允许用户调用的系统调用
2012-01-18 16:26:33 730
原创 linux 信号量使用
信号量的数据类型为结构sem_t,它本质上是一个长整型的数。函数sem_init()用来初始化一个信号量。它的原型为: extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value)); sem为指向信号量结构的一个指针;pshared不为0时此信号量在进程间共享,否则只能为当前进程的所有线程共享
2012-01-18 14:45:22 1971
原创 Linux 信号说明列表
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR213) SIGPIPE 14) SI
2012-01-18 14:01:25 970
原创 Android & Linux的suspent和resume执行流程
<!--h1 {margin-top:0.13in; margin-bottom:0.13in; line-height:0.28in; page-break-inside:avoid}h1.western {font-family:"Times New Roman",serif; font-size:16pt}h1.cjk {font-family:"De
2012-01-18 10:46:35 13423
原创 Linux设备驱动之内存映射
1. 内存映射所谓的内存映射就是把物理内存映射到进程的地址空间之内,这些应用程序就可以直接使用输入输出的地址空间,从而提高读写的效率。Linux提供了mmap()函数,用来映射物理内存。在驱动程序中,应用程序以设备文件为对象,调用mmap()函数,内核进行内存映射的准备工作,生成vm_area_struct结构体,然后调用设备驱动程序中定义的mmap函数。 2. 映射的种类把同
2012-01-17 13:41:48 3754
原创 Linux内核模块时间同步函数汇总
在linux内核模块中能用到的函数比用户空间多,但是它的函数往往被用得很少。当然在内核中叶可以调用用户空间的函数只要直接调用系统调用的封装函数就行,如下:如调用long gettimeofday(struct timeval tv, struct timezone tz);函数可以直接调用封装体:_syscall1(long,gettimeofday, struct timeval,tv,
2012-01-17 10:17:42 3361
原创 tasklet使用
taskletTasklet的使用比较简单,只需要定义tasklet及其处理函数并将两者关联例子:Void my_tasklet_func(unsigned long)DECLARE_TASKLET(my_tasklet.my_tasklet_func,data)代码DECLARE_TASKLET实现了定义名称为my_tasklet的tasklet并将其与my_taskle
2012-01-16 10:42:04 5795
原创 Linux工作队列实现机制
<!--p {margin-bottom:0.08in}h1 {margin-top:0.13in; margin-bottom:0.13in; line-height:0.28in; page-break-inside:avoid}h1.western {font-family:"Times New Roman",serif; font-size:16pt
2012-01-16 10:07:15 7041
原创 linux内核定时器
struct list_head { struct list_head *next, *prev;} 定时器(内核定时器、动态定时器)由结构timer_list表示,定义在文件linux/timer.h中。struct timer_list { struct list_head entry; /* 定时器链表的入口 */
2012-01-16 09:47:58 1155
原创 Linux下面一个简单的虚拟platform驱动
在Linux之中,约定如果设备不属于任何的总线,则可以把它注册为虚拟的platform设备。下面就简单来学习一下一个简单的platform设备是怎么创建出来的。一般注册platform驱动的步骤是:1,platform_device_create注册一个设备2,platform_driver_create注册一个驱动。static struct platform_dri
2012-01-14 15:56:19 1394
转载 ARM linxu启动过程分析(四)
<!--p {margin-bottom:0.08in}-->1. Linux内核启动第三阶段start_kernel:内核从现在开始就进入C语言部分,内核启动第三阶段从init/main.c文件中的start_kernel()函数开始,到该函数结束。这一阶段对整个系统内存、cache、信号、设备等进行初始化,最后生成init进程后,调用cpu_idle()
2012-01-14 11:10:47 1288 1
转载 ARM linxu启动过程分析(三)
<!--p {margin-bottom:0.08in}-->1. Linux内核启动第二阶段:内核启动第二阶段主要完成的工作有,cpuID检查,machineID(也就是开发板ID)检查,创建初始化页表,设置C代码运行环境,跳转到内核第一个真正的C函数startkernel开始执行。这一阶段涉及到两个重要的结构体:一个是structproc_inf
2012-01-14 11:09:51 1250
转载 ARM linxu启动过程分析(二)
<!--p {margin-bottom:0.08in}-->*****解压缩内核,分三种情况,下面一一解释:说明:这一段分析中所提到的vmlinux指的是基本内核映像vmlinux/*检查当前地址间的相互关系,防止解压缩过程中出现地址重叠或者说地址冲突 * r4 = final kernel address //最终解压后的内核首地址 *
2012-01-14 11:08:35 1395
转载 Arm linxu启动过程分析(一)
<!--p {margin-bottom:0.08in}-->本文着重分析FS2410平台linux-2.6.14内核启动的详细过程,主要包括:zImage解压缩阶段、vmlinux启动汇编阶段、startkernel到创建第一个进程阶段三个部分,一般将其称为linux内核启动一、二、三阶段,本文也将采用这种表达方式。对于zImage之前的启动过程,本文不做表述,可
2012-01-14 11:06:00 1667
原创 Linux设备驱动----之一 cdev
内核中每个字符设备都对应一个 cdev 结构的变量,下面是它的定义:linux-2.6.22/include/linux/cdev.hstruct cdev { 13 struct kobject kobj; 14 struct module *owner; 15 const struct file_operations *ops
2012-01-13 11:27:56 1373
原创 Andoid init.c
在 Android中使用启动脚本init.rc,可以在系统的初始化过程中进行一些简单的初始化操作。这个脚本被直接安装到目标系统的根文件系统中,被 init可执行程序解析。 init.rc是在init启动后被执行的启动脚本,其语法主要包含了以下内容: Commands:命令 Actions: 动作 Triggers:触发条件
2012-01-12 14:51:10 1708
原创 字符设备 register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev()
1. 字符设备结构体 内核中所有已分配的字符设备编号都记录在一个名为 chrdevs 散列表里。该散列表中的每一个元素是一个 char_device_struct 结构,它的定义如下: static struct char_device_struct { struct char_device_struct *next; // 指向散列冲突链表中的下一个元
2012-01-12 10:11:19 16030
原创 等待队列 PK 工作队列
对这2个容易混淆的队列做简单概念上的区别,至于怎么用,资料一大堆,不多说,等需要的时候再去找吧 等待队列在内核中有很多用途,尤其适合用于中断处理,进程同步及定时。我们在这里只说,进程经常必须等待某些事件的发生。例如,等待一个磁盘操作的终止,等待释放系统资源,或者等待时间经过固定的间隔。 等待队列实现了在事件上的条件等待,希望等待特定事件的进程把自己放进合适的等待队列,并
2012-01-12 10:00:56 1230
Android核心分析
2011-12-25
ARM---Cortex-A8处理器
2022-09-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人