Android探索与驱动开发学与思(10)

打印内核的调试信息printk:

printk与printf区别:

printk 函数该函数的用法与printf函数类似,具不过printk函数运行内核空间,printk函数运行在用户空间。也就是说,像Linux驱动这样的Linux内核程序只能使用prink函数输出调试信息。

其次应该防止printk函数可以很方便地将消息写入日志文件或控制台,但是大量使用printk函数频繁操作日志文件或控制台设备文件会严重影响Linux驱动的性能,因此这就要求Linux驱动只在开发阶段使用printk函数输出消息,在正式发布Linux驱动时将可能影响性能的printk函数去掉。

然后通过虚拟文件系统进行数据交互。

必要性:在linux文件系统中,/proc经常被用来作为内核空间进行数据交互的工具。/proc是虚拟文件系统,也就是说,/proc并不是真正的文件系统,而是内存映射。所有读写/proc的操作军事对内存读写的操作。所以读写/proc文件系统的速度远比读写/dev要快。因此,/proc文件系统也可作为linux驱动与用户空间程序交互的工具。

很多信息就是通过/proc文件系统由内核空间的程序向外届提供的。例如:当前系统内存资源就是通过/proc/meminfo文件读取的,读者可以使用如下命令:查看/proc/meminfo文件的内容:Cat /proc/meminfo.我们可以通过执行free命令看看显示的信息是否和meminfo文件中的部分内容相匹配。

在linux驱动程序中可以使用内核函数在/proc目录中创建和删除虚拟文件,也可以建立和删除虚拟目录。

1. create_proc_entry 创建proc 文件 
struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,struct proc_dir_entry *parent);

name: 要创建的文件名称;

mode: 该文件的保护掩码;

parent: 确定文件所在目录,如果置NULL ,则位置为/proc 下。

2. proc_mkdir 创建目录

/* 该函数在父目录parent 下创建一个目录name* */

struct proc_dir_entry * proc_mkdir (const char *name,struct proc_dir_entry *parent);

@name : 要创建的目录名

@parent : 这个目录的父目录

3.remove_proc_entry 删除文件或目录

/* 这个函数从proc 文件系统中删除一个文件或目录。

* 注意:1 .是通过参数name ,而不是通过创建时返回的指针来删除的。

* 2 .该函数不会递归删除目录下的文件。

* 3 .data 变量保存了分配的内存,要先释放对应内存,再删除该文件。

* */

void remove_proc_entry (const char *name,struct proc_dir_entry *parent);

@name : 要删除的文件或目录名

@parent : 所在的父目录

4.create_proc_read_entry 创建只读proc 文件

struct proc_dir_entry * create_proc_read_entry (const char

*name,mode_t mode,struct proc_dir_entry *parent,read_proc_t*

read_proc,void *data);

@name : 要创建的文件名

@mode : 要创建的文件的属性 默认0755

@parent : 这个文件的父目录

@read_proc : 当用户读这个文件时,内核调用的函数

@data : 传给read_proc 的参数

注意:删除虚拟文件目录之前,要先删除目录中的虚拟文件。

执行build.sh脚本文件,会将proc_demo驱动安装在Ubuntu Linux、开发板或Android虚拟机上。然后执行下面的命令查看/proc/proc_demo目录中的内容。

Ls –al /proc/proc_demo/bin2dec

Cat /proc/proc_demo/bin2dec

Cat /proc_demo/readonly

用gdb调试用户空间程序、用gdbserver远程调试用户空间程序、用kgdb远程调试内核程序。

总结:Proc-makedir

Name:虚拟目录名称

Parent:虚拟目录父目录的proc-dir-entry结构体指针

Creat-proc-entry

Name:虚拟文件名称

Mode:虚拟文件的访问权限

Parent:虚拟文件父目录的proc-dir-entry结构体指针

Cereat-proc-read-entry

Name:虚拟文件系统

Mode:虚拟文件的访问权限

Base:虚拟文件目录的

pro-dir-entry:结构体指针

Read-proc-:处理读动作的函数指针

Data:用于虚拟文件系统的数据

Remove-proce-entry:

Name:要删除的虚拟文件的名称

Parent:虚拟文件父目录

Proc-dir-entry:结构体指针

本章中我学到了:

1.打印内核的调试信息printk。

2.然后通过虚拟文件系统进行数据交互。

时间: 2024-10-08 10:22:14

Android探索与驱动开发学与思(10)的相关文章

Android探索与驱动开发学与思(4)

涉及到源代码,及上一章所学的git下载的两套源代码,一套是Android源代码,全部下载将近4GB大小,其含金量可想而知.另一套是Android核心部分的linux内核源代码,解压之后几百MB. 首先我们学习下载.编译.和测试Android源代码. 1.配置Android源代码下载环境  (1)创建一个用于存放下载脚本文件(repo)的目录  (2)下载repo脚本文件  (3)创建用于存放Android源代码的目录  (4)初始化  (5)开始下载Android源代码Android源代码目录结

Android探索与驱动开发学与思(9)

为什么要在Android中加入HAL 1.统一硬件的调用接口.由于HAL有标准的调用接口,所以可以利用HAL屏蔽Linux驱动复杂.不统一的接口. 2.解决了GPL版权问题.由于Linux内核基于GPL协议,而Android基于Apache Licence 2.0协议.因此Google玩了个“穿越”,将原本位于Linux内核中的Linux驱动的敏感代码向上移了一个层次.这样这些敏感代码就摆脱了GPL协议的束缚.那写不想开源的Linux驱动作者也就没必要开源了. 3.针对一些特殊的要求.对于有些硬

Android探索与驱动开发学与思(8)

蜂鸣器是 S3C6410 开发板上带的一个硬件设备.可以通过向寄存器写入特定的值来控制蜂鸣器 发出尖叫声.PWM驱动的实现方式不同于 LED 驱动, PWM 驱动将由多个文件组成.这也是大多数 Linux 驱动的标准实现方式. 也就是说-个复杂的驱动不太可能将所有的代码都放在一个文件中. 本节讲介绍把linux驱动分成多个文件的方式.这些文件中的数据结构.函数的代码也可以被多个不同的驱动使用,所以这也是代码重用 的重要方法. Linux驱动代码重用: 编译是由多个文件组成的 Linu x 驱动

Android手机嵌入式驱动开发课程教程

本文介绍两种Golang的开发环境一种基于notepad++.另一种基于liteide. 1.下载Golang语言的pkg:http://golangtc.com/download 直接点击安装,一路next. 2.程序员必备神器notepad++开发Golang环境很简单 一次点击:插件->Plugin Manger->Show Plugin Manger,安装插件GOnpp,重启notepad++. 新建文件命名为hello.go用notepad++打开,拷贝如下代码: package m

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

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

Android字符设备驱动开发基于高通msm8916【原创 】

本人才疏浅学,写一篇文档总结自己在msm8916平台上移植自己编写的简单的字符设备驱动开发的整个流程.这个小项目的主要功能是开发一个简单的APP,APP通过JNI去调用位于kernel的字符设备驱动. APP的设计,开发平台Android Studio 主要的文件是下面的三个文件: MainActivity.java文件的内容如下: 1 package com.example.administrator.myled; 2 3 import android.nfc.Tag; 4 import an

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