Linux驱动
shop_ping
这个作者很懒,什么都没留下…
展开
-
Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现
而随着内核的不断演进,大牛们已经对这种低分辨率定时器的精度不再满足,而且,硬件也在不断地发展,系统中的定时器硬件的精度也越来越高,这也给高分辨率定时器的出现创造了条件。内核从2.6.16开始加入了高精度定时器架构。在实现方式上,内核的高分辨率定时器的实现代码几乎没有借用低分辨率定时器的数据结构和代码,内核文档给出的解释主要有以下几点:低分辨率定时器的代码和jiffies的关系太过紧转载 2013-11-18 10:46:25 · 1536 阅读 · 0 评论 -
Linux驱动学习6(ioctl的实现)
一、ioctl功能简介open、write函数的功能无非就是为了进行用户空间和内核空间的数据交换,而ioctl呢?大部分驱动除了需要具备读写设备的能力之外,还需要对设备具有控制能力,比如要求设备报告错误信息,弹出介质,设置波特率等。这些操作通常是通过ioctl来实现的。用户空间和内核空间实现ioctl的方法原创 2013-11-28 14:33:15 · 4100 阅读 · 2 评论 -
Linux驱动学习7(阻塞IO的实现)
一、首先定义了一个等待任务头,如下两种定义方式:1)静态定义并初始化,一个函数执行完两个操作,一步到位!DECLARE_WAIT_QUEUE_HEAD(name) //使用:定义并初始化一个叫name的等待队列。2)分开两步执行。2.1)定义wait_queue_head_t test_queue;2.2)初始化init_waitqueue_head(&test_qu原创 2013-11-28 19:55:53 · 1321 阅读 · 0 评论 -
Linux驱动学习11(内核中jiffies的回绕问题)
============================================作者:yuanluluhttp://blog.csdn.net/yuanlulu版权没有,但是转载请保留此段声明============================================1。网上遇到的一个问题。先贴出来问题,再说解决方法。看“linux转载 2013-12-03 16:01:56 · 1070 阅读 · 0 评论 -
Linux驱动学习9(同步/异步与阻塞/非阻塞的区别 )
很多人对阻塞,非阻塞,同步,异步,并发,竞态的概念不是很清晰,今天我把我理解的用一个模型来说明一下这些概念。 首先建立一个模型: 我们去银行办理业务,屌丝的做法是:1、银行未准备好,则一直排队,直到前面的人告诉你可以办理了,则你去处理业务 2、一到银行,看银行未准备好,要么转身就走转载 2013-12-03 14:34:27 · 1015 阅读 · 0 评论 -
Linux驱动学习8(非阻塞IO的实现--select/poll方法)
一、基本知识介绍1、在用户程序中,select()和poll()也是与设备阻塞与非阻塞访问息息相关的论题。使 用非阻塞I/O 的应用程序通常会使用select()和poll()系统调用查询是否可对设备进行阻塞的访问。select()和poll()系统调用最终会引发设备驱动中的poll()函数被执行, 在2.5.45 内核中还引入了epoll(),即扩展的poll()。 2、sele原创 2013-12-03 14:16:31 · 1768 阅读 · 0 评论 -
Linux驱动学习10(异步通知 )
一、基本概念1、步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上“中断”的概念,比较准确的称谓是“信号驱动的异步 I/O”。2、信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底原创 2013-12-03 15:06:23 · 1224 阅读 · 0 评论 -
关于2.6.32内核bus_id的问题
这个问题困扰了我好久,对于内核的不熟悉,一开始是出现了使用空指针的问题,部分错误提示如下Unable to handle kernel NULL pointer dereference at virtual address 00000000 pgd = c3ab4000转载 2013-12-10 11:47:15 · 1037 阅读 · 0 评论 -
Linux驱动学习12(初步认识内存管理)
一、MMU的基本知识1.内存管理单元简称mmu,她负责虚拟地址到真实物理地址的转换,并且提供了硬件机制以检查内存访问权限,同时对Cache缓存进行控制。2.现代计算机多进程操作系统通过mmu使得各个进程用户都拥有独立的地址空间,从一个进程来看。都拥有4G(32位cpu)的地址空间,其中0-3G 属于用户空间,3-4G 属于内核空间。3.各个进程得以正常运行的原因就是mmu提原创 2013-12-04 16:58:22 · 1386 阅读 · 0 评论 -
从用户空间的open到内核空间的open
提供一个从系统调用open到内核中该文件实际的open方法的调用流程分析,基本上列出来从open系统调用到mem_pool_open过程中调用的函数。在这个过程中很多调用以及函数实现的细节还并不是很清楚。希望能够起到抛砖引玉的作用,大家一起交流,把这个调用流程丰富起来。int open(const char *pathname, int flags, mode_t mode);原创 2013-11-26 16:19:38 · 2131 阅读 · 2 评论 -
进程上下文和中断上下文的区别
[原文:http://blog.chinaunix.net/u3/93613/showart_1907687.html]进程上下文和中断上下文是操作系统中很重要的两个概念,这两个概念在操作系统课程中不断被提及,是最经常接触、看上去很懂但又说不清楚到底怎么回事的两个概念。造成这种局面的原因,可能是原来接触到的操作系统课程的教学总停留在一种浅层次的理论层面上,没有深入去研究。处理器转载 2013-11-25 11:59:11 · 1085 阅读 · 0 评论 -
库函数调用和系统调用的区别
http://blog.csdn.net/clearriver/archive/2009/05/05/4152780.aspxUnix操作系统设计上的陈述:理解库函数的区别和系统调用,首先要里理解Unix的kernel mode和user mode。考虑下面的函数段:int main(){ int fd = create("filename",0666); ex转载 2013-11-25 11:45:56 · 1366 阅读 · 0 评论 -
atomic_inc 原子操作
atomic_inc(&v)对变量v用锁定总线的单指令进行不可分解的"原子"级增量操作,避免v的值由于中断或多处理器同时操作造成不确定状态。原子操作 所谓原子操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也就说,它的最小的执行单位,不可能有比它更小的执行单位,因此这里的原子实际是使用了物理学里的物质微粒的概念。 原子操作需要硬件的支持,因此是架构相转载 2013-11-18 14:52:44 · 2080 阅读 · 0 评论 -
ubuntu 驱动程序的输出
之前弄了很久,就是为了一个简单的驱动程序hello,world。 现在终于弄明白了,原来是终端设备与控制台的原因。不懂终端或控制台概念的可以参考:http://tonykorn97.itpub.net/post/6414/258009 这篇文章,当然也可以看别的,只要大概弄清除他们是什么东东就可以了,这里我就不重复了。首先说明我电脑的环境:ubuntu 2.6.31.20转载 2013-11-21 15:26:22 · 1157 阅读 · 0 评论 -
Linux 驱动 Printk 在终端没有输出
下面是控制台日志级别的一些简要的介绍 控制台相应的日志级别定义如下: #define MINIMUM_CONSOLE_LOGLEVEL 1 /*可以使用的最小日志级别*/ #define DEFAULT_CONSOLE_LOGLEVEL 7 /*比KERN_DEBUG 更重要的消息都被打印*/ int console_printk[4] = { DEFAULT_CO转载 2013-11-21 15:35:19 · 2160 阅读 · 0 评论 -
register_chrdev_region和alloc_chrdev_region
主设备号、次设备号分配并注册主次设备号 设备号是在驱动module中分配并注册的,也就是说,驱动module拥有这个设备号(我的理解),而/dev目录下的设备文件是根据这个设备号创建的,因此,当访问/dev目录下的设备文件时,驱动module就知道,自己该出场服务了(当然是由内核通知)。 在Linux内核看来,主设备号标识设备对应的驱动程序,告诉Linux内核使用哪一个驱动转载 2013-11-21 19:41:46 · 1017 阅读 · 0 评论 -
linux驱动学习2(kpd驱动初步分析)
一、kpd_pdrv_probe函数的分析: /*1. 输入设备实例 kpd_input_dev */全局变量:static struct input_dev *kpd_input_dev; static int kpd_pdrv_probe(struct platform_device *pdev){ int i, r; u16 new_state[KPD_NUM原创 2013-11-18 15:37:54 · 7111 阅读 · 0 评论 -
Linux驱动学习3(个人对kobject的一点研究)
在LINUX中最让人不解的大概就是/sys下面的内容了下面首先让我们来创建一个简单的platform设备,并从这个设备的视角进行深入,在此篇文章的深入过程中,我们只看kobeject的模型我所使用的内核版本号为2.6.26,操作系统的内核版本号为2.6.27-7,暂未发现2.6.27-7与2.6.26的重大不同首先写一个简单的模块#include #include转载 2013-11-19 10:55:11 · 2005 阅读 · 0 评论 -
Linux驱动学习4(字符设备驱动初步学习)
一、字符设备驱动程序基础:1、主设备号和次设备号(二者一起为设备号):一个字符设备或块设备都有一个主设备号和一个次设备号。主设备号用来标识与设备文件相连的驱动程序,用来反映设备类型。次设备号被驱动程序用来辨别操作的是哪个设备,用来区分同类型的设备。linux内核中,设备号用dev_t来描述。2.在 linux 2.6.28中定义如下:typedef u_long d原创 2013-11-22 19:09:17 · 1273 阅读 · 0 评论 -
Linux驱动学习1(框架梳理)
一、内核执行流程内核初始化设备驱动的过程:第一个C函数从main.c (kernel\init)开始,暂且不论汇编文件start_kernel()->rest_init()->do_basic_setup()->do_initcalls()函数do_initcalls如下:static void __init do_initcalls(void){initcal原创 2013-11-18 09:20:55 · 1768 阅读 · 0 评论 -
Linux驱动学习13(初步认识ioremap)
几乎每一种外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器、状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址。根据CPU体系结构的不同,CPU对IO端口的编址方式有两种: (1)I/O映射方式(I/O-mapped) 典型地,如X86处理器为外设专门实现了一个单独的地址空间,称为"I/O地址空间"或者"I/O端口空间",CPU通过专门的I/O指令(如X86的转载 2013-12-26 14:48:49 · 1342 阅读 · 0 评论