LINUX设备驱动开发详解----第一篇随笔

1,软件的设计宗旨呢,是高内聚,低耦合。其意思是一个驱动程序里面,尽量是自己把事情都干完,别跟其他模块或驱动牵扯太多。不然出问题的时候,就不好排查,当然这样也利于移植,只要搞清楚了驱动程序里面的代码,那换个平台,也变得轻松。

2,驱动是沟通硬件和应用的桥梁。无操作系统下的驱动一般是由一个h文件和c文件组成。h文件里面是一些结构体的定义以及提供给外部调用的函数声明,c文件就是这些函数的具体实现。无操作系统的软件结构是这样的:一个无限循环里,对设备中断的检测或轮询,并处理。    应用工程师在写代码的时候,直接面对的就是驱动接口。

3,带操作系统的驱动。ok,我们会发现,带操作系统的情况下,驱动变得复杂了,不仅要完成对硬件的操作,还要与内核对接,融入内核。干啥呢?为啥搞麻烦了呢?记住了,上帝是公平的,在驱动这边麻烦点,添加了各种设备注册等函数,就是为了在应用上的便利。使得应用看待驱动都是一个样。比如:不管你是I2C,SPI或是简单的GPIO驱动,它fopen /dev/xxx,都是打开了这个驱动,write就是往里面写东西。

4,驱动的分类:

  字符设备指那些必须以串行顺序依次进行访问的设备。

  块设备可以用任意顺序进行访问,为什么?经过了系统的快速缓冲。

  网络设备面向数据包的接收和发送设计,没有对应的文件系统节点。

  另一种分类方式:I2C驱动,USB驱动,PCI驱动。这些驱动可以纳入到上面三种方式,但是其应用复杂且广泛,因此linux系统给他们定义了独特的驱动体系结构。(比如:专属于I2C的一些注册,读写等方式)

5, 中央处理器架构:冯诺依曼和哈佛。冯诺依曼是将程序指令和数据存储器合并在一起的存储器,其程序指令和数据的宽度相同。哈佛结构将程序指令和数据分开存储,指令和数据的宽度可以有不同的数据宽度。

  从指令集角度来讲,可分为精简指令集(RISC)和复杂指令集(CISC)。精简指令强调尽可能的减少指令集,指令单周期执行,但是目标代码会更大。而复杂指令集强调的是指令的能力,其指令复杂,指令周期长,相应的目标代码减少。

6, NOR Flash的特点是可以芯片内执行(XIP, eXecute In Place),程序可以直接在NOR 内运行。而Nand Flash和CPU的接口必须由相应的控制电路进行转换,当然也可以通过地址线或GPIO产生Nand Flash接口的信号。NAND Flash以块方式进行访问,不支持芯片内执行。

  RAM存储在电容器中,所以掉电后,电容漏电数据丢失。

7,USB提供四种传输方式:控制传输、同步传输、中断传输以及批量传输。

 以太网隔离变压器的作用:信号传输,阻抗匹配,波形修复,抑制信号杂波和高电压隔离。

8,Linux内核的组成部分:1)进程调度;申请资源得不到满足时,休眠,然后等待资源释放后唤醒。2)内存管理;控制多个进程安全的共享主内存区域,完成为每个进程进行虚拟内存到物理内存的转换。3)虚拟文件;4)网络接口;5)进程间通信

9,container_of(ptr, type, member)   ptr是具体的指针,type是一个结构体,member是结构体里面的形参的名字。它的作用就是知道了type结构体里面member的指针是ptr,然后获取该type结构体的指针。

10,copy_to_user, copy_from_user实现内核空间和用户空间数据的交互:

copy_to_user在每次拷贝时需要检测指针的合法性,也就是用户空间的指针所指向的地址的确是一段该进程本身的地址,而不是指向了不属于它的地方,而且每次都会拷贝一次数据,频繁访问内存,由于虚拟地址连续,物理地址不一定会连续,从而造成CPU的CACHE频繁失效,从而使速度降低。

在read和write的系统函数中,注意return的值,一般是传递的字节数。

11,Linux驱动的分析方法是点面结合,将对函数和数据结构的理解放在整体架构的背景之中。

时间: 2024-08-02 02:48:51

LINUX设备驱动开发详解----第一篇随笔的相关文章

《Linux设备驱动开发详解:基于最新的Linux 4.0内核》china-pub预售

<Linux设备驱动开发详解:基于最新的Linux 4.0内核>china-pub今日上线进入预售阶段: http://product.china-pub.com/4733972 推荐序一 技术日新月异,产业斗转星移,滚滚红尘,消逝的事物太多,新事物的诞生也更迅猛.众多新生事物如灿烂烟花,转瞬即逝.当我们仰望星空时,在浩如烟海的专业名词中寻找,赫然发现,Linux的生命力之旺盛顽强,斗志之昂扬雄壮,令人称奇.它正以摧枯拉朽之势迅速占领包括服务器.云计算.消费电子.工业控制.仪器仪表.导航娱乐等

《Linux设备驱动开发详解:基于最新的Linux 4.0内核》china-pub 预售

<Linux设备驱动开发详解:基于最新的Linux 4.0内核>china-pub今日上线进入预售阶段: http://product.china-pub.com/4733972 推荐序一 技术日新月异,产业斗转星移,滚滚红尘,消逝的事物太多,新事物的诞生也更迅猛.众多新生事物如灿烂烟花,转瞬即逝.当我们仰望星空时,在浩如烟海的专业名词中寻找,赫然发现,Linux的生命力之旺盛顽强,斗志之昂扬雄壮,令人称奇.它正以摧枯拉朽之势迅速占领包括服务器.云计算.消费电子.工业控制.仪器仪表.导航娱乐等

《Linux设备驱动开发详解(基于最新4.0内核)》前言

Linux从未停歇脚步.Linus Torvalds,世界上最伟大的程序员之一,Linux内核的创始人,Git的缔造者,仍然在没日没夜的合并补丁,升级内核.做技术,从来没有终南捷径,拼的就是坐冷板凳的傻劲. 这是一个连阅读都被碎片化的时代,在这样一个时代,人们趋向于激进.浮躁.内心的不安宁使我们极难静下心来研究什么.我见过许许多多的Linux工程师,他们的简历书写着"精通"Linux内核,有多年的工作经验,而他们的"精通"却只是把某个寄存器从0改成1,从1改成0的不

《Linux设备驱动开发详解(第3版)》海量更新总结

本博实时更新<Linux设备驱动开发详解(第3版)>的最新进展. 2015.2.26 几乎完成初稿. [F]是修正或升级:[N]是新增知识点:[D]是删除的内容 第1章 <Linux设备驱动概述及开发环境构建>[D]删除关于LDD6410开发板的介绍[F]更新新的Ubuntu虚拟机[N]添加关于QEMU模拟vexpress板的描述 第2章 <驱动设计的硬件基础> [N]增加关于SoC的介绍:[N]增加关于eFuse的内容:[D]删除ISA总线的内容了:[N]增加关于SP

《Linux设备驱动开发详解(第3版)》进展同步更新

本博实时更新<Linux设备驱动开发详解(第3版)>的最新进展. 2014.6.30 目前初步完成4-9章,相对于第2版,这几章主要的变更. [F]是修正或升级:[N]是新增知识点:[D]是删除的内容 第4章 <Linux内核模块>[F]改正关于模块使用非GPL license的问题:[F]修正关于__exit修饰函数的内存管理 第5章 <Linux文件系统与设备文件>[F]修正关于文件系统与块设备驱动关系图:[N]增加应用到驱动的file操作调用图:[N]增加通过ne

《linux设备驱动开发详解》笔记——14 linux网络设备驱动

14.1 网络设备驱动结构 网络协议接口层:硬件无关,标准收发函数dev_queue_xmit()和netif_rx();  注意,netif_rx是将接收到的数据给上层,有时也在驱动收到数据以后调用. 网络设备接口层,net_device,统一接口名称,使上层独立于具体硬件. 设备驱动功能层,实现net_device的各成员 物理层 在整个以太网架构里,有两个数据结构非常重要,即sk_buff和net_device,后面两节有说明. 还有一些与内核交互的函数,需要掌握,如netif_start

linux设备驱动开发详解 笔记

  在目录的 Makefile 中关于 RTC_DRV_S3C 的编译脚本为: obj -$(CONFIG_RTC_DRV_S3C) += rtc-s3c.o 上述脚本意味着如果 RTC_DRV_S3C 配置选项被选择为"Y" 或"M",即 obj-$(CONFIG_RTC_ DRV_S3C)等同于 obj-y 或 obj-m 时,则编译 rtc-s3c.c,选" Y" 的情况直接会将生成的目标代码 直接连接到内核,为" M"

《linux设备驱动开发详解》笔记——8阻塞与非阻塞IO

8.1 阻塞与非阻塞IO 8.1.0 概述 阻塞:访问设备时,若不能获取资源,则进程挂起,进入睡眠状态:也就是进入等待队列 非阻塞:不能获取资源时,不睡眠,要么退出.要么一直查询:直接退出且无资源时,返回-EAGAIN 阻塞进程的唤醒:必须有地方能够唤醒处于睡眠状态的阻塞进程,否则就真睡不醒了.一般是在中断中. 阻塞与非阻塞可以在open时设置,也可以通过fcntl和ioctl重新设置 8.1.1 等待队列 linux驱动中,可以用等待队列wait queue实现阻塞.等待队列与linux进程调

linux 字符设备驱动开发详解

一.设备的分类及特点 1.字符设备 字符设备是面向数据流的设备,没有请求缓冲区,对设备的存取只能按顺序按字节的存取而不能随机访问.    Linux下的大多设备都是字符设备.应用程序是通过字符设备节点来访问字符设备的.通常至少需要实现 open, close, read, 和 write 等系统调用.    设备节点一般都由mknod命令都创建在/dev目录下,包含了设备的类型.主/次设备号以及设备的访问权限控制等,如:crw-rw----  1 root  root 4, 64 Feb 18