Android深度探索与HAL驱动开发(卷1)-- 第七章随笔

应用程序、库、内核、驱动程序的关系  

  从上到下,一个软件系统可以分为:应用程序、库、操作系统(内核)、驱动程序。开发人员可以专注于自己熟悉的部分,对于相邻层,只需要了解它的接口,无需关注它的实现细节。以点亮LED为例,这4层软件的协作关系如下:

  1、应用程序使用库提供的open函数打开代表LED的设备文件。

  2、库数据open函数传入的参数执行“swi”指令,这条指令会引起CPU异常,进入内核。

  3、内核的异常处理函数根据这些参数找到相应的驱动程序,返回一个文件句柄给库,进而返回给应用程序。

  4、应用程序得到文件句柄后,使用库提供的write或ioclt函数发出的控制命令。

  5、库根据write或ioclt函数传入的参数执行“swi”指令,这条指令会引起异常,进入内核。

  6、内核的异常处理函数根据这些参数调用驱动程序的相关函数,点亮LED。

  7、库(比如glibc)给应用程序提供的open、read、write、ioctl、mmap等接口函数被称为系统调用,它们都是设置好相关寄存器后,执行某条指令引发异常进入内核。对于ARM架构的 CPU,这条指令为swi。除系统调用接口外,库还提供其他函数,比如字符串处理函数(strepy、strcmp等)、输入/输出函数(scanf、printf等)、数据库,还有应用程序的启动代码等。 在异常处理函数中,内核会根据传入的参数执行各种操作,比如根据设备文件名找到对应的驱动程序,调用驱动程序的相关函数等。

LED驱动的实现原理

  尽管Linux驱动直接与硬件打交道,但并不是Linux驱动直接向硬件中的内存写数据,而是与本机的I/O内存(I/O Memory,位于内核空间)进行交互。所谓I/O内存是通过各种借口(PCI、USB、蓝牙、以太网口等)连接到主机(PC、手机)的硬件(网卡、声卡、摄像头等)

  在主机内存中的映射。 例如,在Ubuntu Linux上运行的驱动只需要访问运行Ubuntu Linux的主机中的I/O内存即可,然后Linux内核会利用I/O内存中的数据硬件交互。

  Linux内核提供了多个与I/O内存交互的函数,如ioread16,ioread32,iowrite16,iowrite32等。Linux内核的内存管理模块负责同步I/O内存与硬件中的数据。原理如图:

  每一个连接Linux的硬件在I/O内存中都会有映射首地址。在使用ioread32、iowrite32等函数读写I/O内存是需要指定这些首地址。开发板上的LED也有其映射首地址。

时间: 2024-08-05 19:36:27

Android深度探索与HAL驱动开发(卷1)-- 第七章随笔的相关文章

Android深度探索与HAL驱动开发(卷1)-- 第一章随笔

本文主要从 Android版本与对应的linux内核版本关系 和 Android系统架构 两部分来讨论. 1.Android版本与Linux内核的关系 (1)Android最初使用Linux2.6作为其内核,随着Android与Linux内核的发展,不同版本的Android使用的linux内核版本差异较大,所以不同Android版本驱动可能并不通用. 下表显示了目前所有Android版本与linux内核版本的联系. Code name Android Version number Linux K

Android深度探索与HAL驱动开发(卷1)-- 第九章随笔

第9章 硬件抽象层:HAL Hal(Hardware Abstract Layer,硬件抽象层)是建立在Linux驱动之上的一套程序库.这套程序库并不属于Linux内核,而是属于Linux内核层之上的应用层. 编写支持HAL的Linux驱动程序的步骤: 第一步:编写Linux驱动 第二步:编写HAL Library 第三步:编写 Service Library 编写HAL 模块的步骤和原理如下: 第一步:定义结构体和宏 第二步:编写HAL模块的open函数 第三步:定义hw_module_met

Android深度探索与HAL驱动开发(卷1)-- 第二章随笔

Android软件开发是指创建新的Android操作系统的过程.通常是使用Android软件开发工具包(SDK)利用Java语言进行开发. Android SDK Android软件开发工具包(SDK)包括一套全面的开发工具.这些措施包括调试器,库文件,一个基于QEMU的手机模拟器,文档,示例代码和教程.目前支持的开发平台,包括可运行Linux的计算机,Mac OS X 10.5.8以上版本,和Windows XP或更高版本.截至2015年3月, Android 自带的SDK本身不可再用,但软件

Android深度探索与HAL驱动开发(卷1)-- 第十章随笔

第10章 嵌入式Linux的调试技术 通过虚拟文件系统(/proc)进行数据交互 在编写代码时应了解一下几点: 1.creat_proc_read_entry 函数在内部是通过调用creat_proc_entry 函数实现的.所谓只读就是通过 creat_proc_read_entry 函数可以指定处理文件读动作的函数,并且通过mode参数设置文件的只读属性(0944).如果想把只读文件改成读写文件,只需要设置处理文件写动作的函数,并且将文件属性改成0666. 2.Linux文件的读写由属性决定

Android深度探索与HAL驱动开发(卷1)-- 第四章随笔

Linux内核源代码目录含义 arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录.和32位PC相关的代码存放在i386目录下,其中比较重要的包括kernel(内核核心部分).mm(内存管理).math-emu(浮点单元仿真).lib(硬件相关工具函数).boot(引导程序).pci(PCI总线)和power(CPU相关状态).    block:部分块设备驱动程序.    crypto:常用加密和散列算法(如AES.SHA等),还有一些压缩和CRC校验算法.    Document

Android深度探索与HAL驱动开发(卷1)-- 第六章随笔

内核空间与用户空间 介绍 Linux系统将自身划分为两部分,一部分为核心软件,即是kernel,也称作内核空间,另一部分为普通应用程序,这部分称为用户空间. Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G.Linux内核将这4G字节的空间分为两部分.将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为"内核空间".而将较低的3G字节(从虚拟地址 0x00000000到0xBFFFFFFF),供各

Android深度探索与HAL驱动开发(卷1)-- 第五章随笔

RISC(reduced instruction set computer)精简指令集计算机 简介 精简指令集,是计算机中央处理器的一种设计模式,也被称为RISC(Reduced Instruction Set Computer的缩写).[1] 这种设计思路对指令数目和寻址方式都做了精简,使其实现更容易,指令并行执行程度更好,编译器的效率更高.常用的精简指令集微处理器包括DECAlpha.ARC.ARM.AVR.MIPS.PA-RISC.PowerArchitecture(包括PowerPC)和

Android深度探索(卷1)HAL与驱动开发学习笔记(2)

Android深度探索(卷1)HAL与驱动开发学习笔记(2) 第二章搭建Android开发环境 书中介绍了两种JDK的安装方法, 方法一: 从官网下载JDK并进行配置,解压后在终端打开profile文件来设置PATH环境变量(# soure /etc/profile),打开profile文件后输入下面的内容 export PATH=.:developer/jdk6/bin:$PATH 保存profile文件以后,有两种方法可以重新加载profile文件. 1.# sourse  /etc/pro

Android深度探索(卷1)HAL与驱动开发 心得体会 第十章 嵌入式Linux的调用技术

Android深度探索(卷1)HAL与驱动开发 心得体会 第十章  嵌入式Linux的调用技术 对于复杂的Linux驱动以及HAL等程序库,需要使用各种方法对其进行调试.例如,设置断点,逐步跟踪代码.输出调试信息等.虽然嵌入式Linux在调试方面并没有Visual Studio.Delphi.Eclipse这些可视化工具方便,但是学习一些这方面的技术无疑更有助于开发强大而稳定的Linux内核模块. 对于嵌入式Linux内核模块,可执行程序.代码库的调试可能更要复杂些.因为在大多数时候需要至少两台