Android深度探索与驱动开发(三)

Relay 的原理Relay 提供了一种机制,使得内核空间的程序能够通过用户定义的 Relay 通道(channel)将  大量数据高效地传输到用户空间。一个 Relay 通道由一组和 CPU 一一对应的内核缓冲区组成。这 些缓冲区又被称为 Relay 缓冲区(buffer),其中的每一个在用户空间都用一个常规文件来表示, 叫做 Relay 文件(file)。内核空间的用户可以利用 Relay 提供的 API 接口来写入数据,这些数据 会被自动写入当前的 CPU ID 对应的那个 Relay 缓冲区;同时,这些缓冲区从用户空间看来,是 一组普通文件,可以直接使用 read()进行读取,也可以使用 mmap()进行映射。Relay 并不关心数 据的格式和内容,这些完全依赖于使用 Relay 的用户程序。Relay 的目的是提供一个足够简单的 接口,从而使得基本操作尽可能高效。  Relay 实现了对数据读和写的分离,使得大量突发性数据写入的时候,不需要受限于用户空 间相对较慢的读取速度,从而大大提高了效率。Relay 作为写入和读取的桥梁,也就是将内核用 户写入的数据缓存并转发给用户空间的程序。这种转发机制正是 Relay 这个名称的由来。

open():允许用户打开一个已经存在的通道缓冲区。

mmap():使通道缓冲区被映射到位于用户空间的调用者的地址空间。要特别注意的是,  我们不能仅对局部区域进行映射。也就是说,必须映射整个缓冲区文件,其大小是 CPU   的个数和单个 CPU 缓冲区大小的乘积。

read():读取通道缓冲区的内容。这些数据一旦被读出,就意味着它们被用户空间的程序  消费掉了,不能被之后的读操作看到。

sendfile():将数据从通道缓冲区传输到一个输出文件描述符。其中可能的填充字符会被自  动去掉,不会被用户看到。

poll():支持 POLLIN/POLLRDNORM/POLLERR 信号。每次子缓冲区的边界被越过时,  等待着的用户空间程序会得到通知。

close():将通道缓冲区的引用数减 1。当引用数减为 0 时,表明没有进程或者内核用户需  要打开它,从而这个通道缓冲区被释放。

relay_open():创建一个 Relay 通道,包括创建每个 CPU 对应的 Relay 缓冲区。

relay_close():关闭一个 Relay 通道,包括释放所有的 Relay 缓冲区,在此之前会调用  relay_switch()来处理这些 Relay 缓冲区以保证已读取但是未满的数据不会丢失。

relay_write():将数据写入到当前 CPU 对应的 Relay 缓冲区内。由于它使用了 local_irqsave() 保护,因此也可以在中断上下文中使用。

relay_reserve(): Relay 通道中保留一块连续的区域来留给未来的写入操作。在通常用于那  些希望直接写入到 Relay 缓冲区的用户。考虑到性能或者其他因素,这些用户不希望先把 数据写到一个临时缓冲区中,然后再通过 relay_write()进行写入。

时间: 2024-11-10 01:09:57

Android深度探索与驱动开发(三)的相关文章

Android深度探索与驱动开发(五)

开发板是开发和学习嵌入式技术的主要硬件设备, 尽管可以在 PC 上开发 Linux 驱动, 然后重 新编译成 ARM 架构的 Linux 驱动模块.但最终都是要在开发板上进行测试的.这主要是因为 ARM 架构的开发板可基于 X86 架构的 PC 在 CPU 指令以及二进制格式上都有所不同. 而且如果 Linux 驱动需要访问硬件(如 LCD. Wi-町.蓝牙等〉,并且这些硬件很难在 PC 上进行模拟, 那么就要在 带有这些硬件的开发板上进行调试和测试. 开发板从技术上说与我们经常用的手机类似,

Android深度探索与驱动开发(六)

Linux驱动的工作和访问方式是Linux的亮点之一,同时受到了业界的广泛好评. Linux系统 将每一个驱动都映射成一个文件.这些文件称为设备文件或驱动文件,都保存在/dev目录中.这种 设计理念使得与Linux驱动进行交互就像与普通文件进行交互一样容易.当然,也比访问LinuxAPI 更容易. 由于大多数Linux驱动都有与其对应的设备文件, 因此与Linux驱动交换数据就变成了与 设备文件交换数据.例如,向Linux打印机驱动发送一个打印命令,可以直接使用C语言函数open打开设备文件,

Android深度探索与驱动开发(八)

蜂鸣器是 S3C6410 开发板上带的一个硬件设备.可以通过向寄存器写入特定的值来控制蜂鸣器 发出尖叫声.一个完整的蜂呜器驱动(可以打开和关闭蜂鸣 器). PW时驱动的实现方式不同于 LED 驱动, PWM 驱动将由多个文件组成.这也是大多数 Linux 驱动的标准实现方式. 也就是说-个复杂的驱动不太可能将所有的代码都放在一个文件中.最好将 相关的代码放在相应的文件中.在编译 Linux 驱动时将这些文件进行联合编译.这些文件中的数据结构.函数的代码也可以被多个不同的驱动使用, 所 以这也是代

Android深度探索与驱动开发(四)

Linux 网络设备驱动程序由 4 部分组成,分别是网络设备媒介层.网络设备驱动层.网络设 备接口层及网络协议接口层.网络设备媒介层包括各种物理网络设备和传输媒介.对于网络设备 接口层,Linux 系统用 Net_device 结构表示网络设备接口.Net_device 结构保存所有与硬件有关 的接口信息,各协议软件主要通过 Net_device 结构来完成与硬件的交互.网络设备驱动层主要包 括网络设备的初始化.数据包的发送和接收.网络协议接口层提供网络接口驱动程序的抽象接口.初始化(initi

Android深度探索与驱动开发(七)

任何现代的操作系统主机中插入硬件时都会检测到该硬件.例如,将一个打印机通过 USB 口连接到 PC上,如果操作系统是 Windows , 会在右下角状态栏显示已发现新设备信息.这说明操作系统已经探测到有硬件已连接到 PC 上然后系统会尝试安装驱动.如果驱动 F注意 :未安装成功,就会弹出对话框要求用户指定驱动程序的路径. 在这一过程中,操作 系统虽然可以检测到硬件设备连接的信号,但此时并不能使用该硬件设备,这是因 为还需要安装与硬件交互的驱动程序. 从这一点可以看出,硬件被检查到只说明在 内核空

Android深度探索-卷1第三章心得体会

第三章整章介绍了git,git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.通过配置git后可以很方便的找到需要的资源,更多的是代码和包,可以在本地建立版本库,为了方便和尽可能多的获得资源,我觉得还是在网上的好,(所有网上,懂么)这就需要理解git的用法和功能听说git很复杂,书上也是用一个例子来演示了如何创建版本库.提交源代码.创建分支.向远程服务器上传源代码,从远程服务器获取源码.在上传自己的代码时,如果你不想让别人看见,你的缴费,不然就是开源的,就像我们

Android深度探索读书笔记 第三章

第三章主要介绍的是Git,首先是安装git可以使用这些命令(#apt-get inatall git    #apt-get inatall git-doc git-svn git-email git-gui gitl)来安装git,其中Git包含了大部分git命令是必须安装的软件包.其次是查看git文档:在Linux下可以直接使用man命令查看指定命令的帮助文档.如要查询git-checkout命令的帮助文档,可以使用#man git-checkout 接着是源代码的提交与获取:1创建版本库 

Android深度探索-卷1 第三章

Git使用入门 Linux 内核代码及许多著名的项目(如Aniroid Eclipes,KDE,QT,Ruby on Rails等)都使用了Linux 之父Linus编写的Git进行源代码管理.Linux 以一个文件系统专家和内核设计者的视角对  Git进行了设计.其独特的设计让Git拥有非凡的性能和最为优化的存储能力,Git在各个方面都优于其他同类的源代码管理软件. 安装Git ubuntu linux10.10或更新的版本命令为: #apt—get install git #apt—get

Android深度探索HAL与驱动开发 第三章

Android深度探索HAL与驱动开发 第三章 Git使用入门 读书笔记 Git是对源代码进行管理的软件. 一.安装Git # apt-get install git # apt-get install git-doc git-emall git-gui gitk 用以下命令控制Git: # apt-get install git-core # apt-get install git-doc git-svn git-email git-gui gitk 二.查看Git文档 查看git-check