《Android深度探索》读书笔记10

看了本书第十章,我学习到了:

1.printk函数:运行在内核空间,linux驱动只能用printk来打印内核调试信息。函数原型:asmlikage int printk(const char *fmt)。第一个参数表示格式字符串,后面是可变参数,第一个参数若为KERN_DEBUG和KERN_WARNING,值分别为<7>、<4>,数字表示输出的日志级别,默认为KERN_WARNING。该函数既可以将日志信息写入到日志文件,也可将日志信息写到控制台。Printk文件输出日志信息的输出方向。

查询日志信息:#dmesg 或#cat /var/log/syslog或 #cat /var/log/messages(低版本)或#cat /proc/kmsg(开发板没syslog、messages文件)

日志文件很多过滤显示内容:#dmesg | gerp printk或#cat /var/log/syslog | grep printk或#tail –n 10 /var/log/syslog

2.大量使用printk函数会影响linux驱动性能,解决方法是利用c语言编译指令(#if、#else、#endif)注释。

3./proc虚拟文件系统:是内存映射,对/proc的操作都是对内存的读写,用来进行内核空间与用户空间进行数据交互,与设备文件系统/dev类似,读写速度比/dev快。

查看当前系统内存资源:#cat /proc/meminfo

/proc设置动作处理函数:通过函数指针proc_dir_entry.read_proc、proc_dir_entry.read_write

proc_dir_entry结构体代表一个虚拟文件或目录,proc_mkdir,create_proc_entry, create_proc_read_entry,remove_proc_entry函数都包含了proc_dir_entry结构体的参数。

4.create_proc_read_entry是内部通过调用create_proc_entry函数实现的,通过mode参数设置文件的读写的属性,如0666即-rw-rw-rw-读写,0444即-r—r—r—只读。

5.删除虚拟目录之前需要先删除虚拟目录中的虚拟文件。

6.用gdb调试用户空间的程序:

编译:#gcc –static –g –o gdb_debug /root/drivers/debug/gdb_debug.c

调试:gdb gdb_debug

调试命令:

list:显示上次调用list命令输出最后一行后面的10行。list - : 显示上次调用list命令输出最后一行前面的10行。list n :显示第n行附近的10行。

break n:将指定行设为断点。tbreak n:将指定行设为断点,断点仅使用一次,使用完自动清除。

clear n:清除指定行的断点。

run:其后可跟命令行参数回传给正调试的程序。

cont/contiunue:跳过当前断点继续执行。

next:跳过这一程序继续执行下面语句(step over)。 nexti:单步执行语句,跟踪到子程序内部(step into)。

print var_name:查看变量值。

7.用gdbserver远程调试用户空间程序:

①   在安卓模拟器上调试:

将gdb_debug上传到安卓模拟器,进入模拟器终端,进入data/local目录,执行:#gdbserver :(本机端口) ./gdb_debug 监听程序

再开启另一个linux终端,执行#adb –s emulator-5554 forwardtcp:(端口号) tcp:(端口号 将外部模拟器的端口数据包转发到模拟器内部端口。

在linux终端执行:#arm-none-linux-gnueabi-gdb gdb_debug 进入gdb控制台连接安卓模拟器:#(gdb) target remote localhost :(端口号)

 ②在开发板上调试:(可通过端口映射——IP连接方式;串口连接)

一、IP连接:

在开发板端执行:#gdbserver localhost:(端口号) ./gbd_debug

在linux端gdb控制台执行:#(gdb) target rremote (开发板ip地址) ./gdb_debug 连接开发板的gdbserver

二、串口连接:

在开发板执行:#gdbserver /dev/(开发板上串口的设备文件) ./gdb_debug

Linux端gdb控制台执行:#(gdb) target remote /dev/ttyUSB0 连接开发板的gdbsserver

8.kgdb最好的内核调试工具,提供类似printk函数的日志输出功能,允许开发人员直接在PC上通过GDB链接目标设备。

9.Kgdb包含两部分:kgdb内核和一套连接接口。这些接口目前支持串口tty设备连接和以太网连接。串口连接需要内核参数kgdboc指定要连接的串口tty设备,以太网连接通过内核参数kgdboe指定ip和端口号。Kgdb支持多处理架构,单独为每个支持的处理器架构实现了kgdb内核。

10.kgdb远程调试内核程序:

①     配置linux内核:#make menuconfig 进入linux配置菜单——“Kernel hacking”——“KGDB:kernel debugger”

②     配置内核参数:在开发板启动过程中回车进入Uboot模式,使用setenv命令设置Linux内核启动参数,最后saveenv命令保存reset命令重启Linux内核。

③     主机调试linux内核:#gdb ./vmlinux

时间: 2024-10-10 07:43:17

《Android深度探索》读书笔记10的相关文章

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

HAL是建立在linux驱动之上的一套程序库,这套程序库属于linux内核层之上的应用层.编写一款支持HAL的linux驱动程序:1.在为linux驱动添加HAL,要想尽量保护敏感数据.Linux驱动的代码就要尽量简洁,尽可能将业务逻辑放到HAL library中.2.HA类就是普通的linux Library文件 ,但这类库文件有一个接口.通过HAL_MODULE_INFO_SYM变量实现.3.service Library也是Linux Library,也就是说service Library

android深度探索读书笔记

第八章 让开发板发出声音:蜂鸣器驱动 蜂鸣器是S3C6410 开发板上带的个硬件设备.可以通过向寄存器写入特定的值来控制蜂鸣器发出尖叫声.介绍蜂鸣器的实现原犁,并实现完整的蜂呜器驱动,可以打开和关闭蜂鸣器时驱动的实现方式不同于LED PWM 驱动将由多个文件组成.这也是大多Linux 驱动的标准实现方式也就是说个复杂的驱动不太可能将所有的代码都放在个文件中.最好将关的代码放在相应文件中.在编译 Linux 驱动时将这些文件进行联合编译.本节将介绍把Linux 驱动分成多个文件的方式.这些文件中的

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

第一章首先介绍android系统架构(android是一个非常优秀的嵌入式操作系统),总共分为四层:第一层Linux内核,由于android是基于Linux内核的,所以android跟其他Linux系统没什么差异.这一层这一层主要包括Linux的驱动程序以及内存管理.进程管理.电源管理等.第二层编写的代码库,也包括Dalivk虚拟机的运行时.第三层android SDK 层.第四层应用程序(相当于android的UI).而这一层主要靠第三层中的Android SDK API 完成各种功能.其次介

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

第二章介绍的是搭建android底层的开发环境 ,主要包括android应用程序开发环境.android NDK开发环境和交叉编译环境的搭建.首先介绍的是开发测试和调试Linux驱动.HAl程序需要的工具:JDK6或以上版本:Eclipse3.4或以上版本:ADT:CDT:androidSDK:Android NDk:交叉编译环境:Linux内核源代码:android源代码:用于调试的串口工具 minicom.接着介绍的是JDK的安装:首先从官方网站(http://www.oracle.com/

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

对于复杂的linux驱动及HAL等程序库,需要使用各种方法对其进行调试.首先接介绍使用printk函数,该函数与printf函数类似,printk函数运行在内核空间,printf函数运行在用户空间.Printk函数的原型:asmlinkage int printk(const char *fmt, ...)第一个参数表示个格式字符串,后面是可变参数,也就是说,printk函数至少要有1个参数,如果格式字符串包含有占位符,后面必须跟与占位符相等数量的参数,以便一一对应传入 printk函数.使用p

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

代码的重用分为静态重用跟动态重用.静态重用:采用标准的c程序的方式,将要重用的代码放在其他的文件中,如果要使用相应的某些功能,include相应头文件即可.动态重用:也就是一个linux驱动可以使用另外一个linux驱动中的资源.还有另外一种代码共享的方式:,模块依赖,也称为导出符号.在一个驱动模块里使用另外一个驱动模块里的被导出的符号(常量.变量.函数等).编译是由多个文件组成的linux驱动,如果linux驱动代码不多,可以将所有的代码放在一个文件中,如果linux驱动代码比较复杂,就需要使

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)HAL与驱动开发 第一章&#160;Android系统移植与驱动开发概述 读书笔记

Android深度探索(卷1)HAL与驱动开发 第一章 Android系统移植与驱动开发概述 读书笔记 本章是 Android系统移植与驱动开发概述性的具体讲解.首先,Android被分为了四层架构.在最底层的是Linux内核 .然后分别是C/C++代码库.Android SDK A和应用程序.而Android的移植又分为系统移植和应用移植.系统移植要实现Android操作系统在其他硬件平台上运行起来,其中的关键是Linux的内核.内核必须要完成对平台上运行的各个硬件的识别.所以这就需要Linu

Android深度探索(卷1)HAL与驱动开发 第二章 搭建Android开发环境 读书笔记

Android深度探索(卷1)HAL与驱动开发 第二章 搭建Android开发环境 读书笔记   本章主要讲解在Ubuntu Linux 下搭建Android开发环境. 1.JDK:从官网下载压缩包,并将其解压缩. Gedit etc/profile 并设置PATH环境变量,记得PATH. 2.搭建Android应用程序开发环境. 安装Android SDK 安装Eclipse 安装ADT 配置ADT 建立AVD 这个步骤是安装Android SDK,步骤与操作与在Windows操作系统下的安装

Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记

Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记     本章学习了使用git下载两套源代码并搭建两个开发环境.分别为Android源代码和Linux内核源代码.Android源代码中包含了HAL(即硬件抽象层) 的代码,并学习了如何搭建这两种开发环境. Android 的移植的本质就是Linux内核的移植,Linux内核的移植主要是Linux驱动的移植.而开发和测试Linux驱动就需要安装以上两个开发环境. 搭建两套环境的具体步骤如下: 一.下载编译和测试A