第三次月考

8

8.1 linux代码驱动的代码重用

编译是由多个文件组成的linux驱动,如果linux驱动复杂,就需要多个linux文件来存放不同的功能,这样有利于分类和管理。

8.2 linux驱动模块的依赖

代码重用分为静态和动态两种,这种方式是代码级的重用,最终生成可执行文件,接下来介绍另外一种代码共享的方式。

(1)将一个驱动模块调用另一个驱动模块,

(2)卸载symbol_consumer,卸载symbol_producer,

8.3强行卸载linux驱动

Linux驱动无法卸载的情况

情况一:初始化函数崩溃p

情况二:卸载函数被阻塞

8.4 蜂鸣器(pwm)驱动

8.4.1 蜂鸣器驱动的原理

pwm基本原理通过脉冲来控制蜂鸣器的打开和关闭

8.4.2 测试蜂鸣器的驱动

本节将实现一个完整的pwm驱动,通过I/O命令可以打开停止pwm

PWM由三个文件构成:pwm.c,pwm_fun.h,pwm_fun.c,pwm_fun.c是驱动主程序,pwm_fun.h引入了相应的头文件,以及定义了一些宏,pwm_fun.c则包含了打开和停止pwm的两个函数,从Makefile中可以看出,编译器首先将pwm.cpwm_fun.c文件编译成pwm.opwm_fun.o,然后再将两个.o文件连接成pwm_driver.o,最后生成pwm_driver.ko,然后执行build.sh脚本文件,然后就编译成功了。

输入如下命令:

./ioctl /dev/pwm_dev 1 0

./ioctl /dev/pwm_dev 0 0

通过本章简单的了解了pwm的知识点。

第9章 硬件抽象成:HAL

9.1 HAL是建立在linux程序上的一套程序库,

为什么要在Android中加入HAL,在linux驱动中一般有两种类型的代码:访问硬件寄存器的代码和业务逻辑代码。其目的在于:

统一硬件的调用接口。

解决了GPL版权问题。‘

针对一些特殊要求。

9.2 andriod hal架构

Andriod系统中使用程序库,条用位于内核空间的Linux驱动,然后Andriod应用程序。

9.3 LED增加HAL

将所有业务逻辑从LED驱动移植到HAL模块,而LED驱动模块只保留读写寄存器的工程能。

9.3.1 编写一款支持HALLINUX程序驱动程序的步骤

第一步:Linux驱动程序,编写linux驱动,从表明上看是废话,但如果要为linux添加HAL,而且要想尽量保护敏感数据,linux驱动的代码就要尽量简介,尽可能将业务逻辑放到HAL library.

第二步:编写HAL LibraryHAL Library就是普通的linux Library(*.so)文件,但这类文件有一个借口,通过HAL_MODULE_INFO_SYM变量实现,Service Library就是通过在这个接口中定义的ID定位HAL Library的。

第三步:编写Service L ibrary

尽管这步并不是必须的,但是新的HAL架构要求我们这样做。Service Library 也是Linux Library.Service LIbrary可以是一般的linux library .也可以是JNI L

10

一 调试前的准备

在调试一个bug之前,我们所要做的准备工作有:

有一个被确认的bug

包含这个bug的内核版本号,需要分析出这个bug在哪一个版本被引入,这个对于解决问题有极大的帮助。可以采用二分查找法来逐步锁定bug引入版本号。

对内核代码理解越深刻越好,同时还需要一点点运气。

bug可以复现。如果能够找到复现规律,那么离找到问题的原因就不远了。

最小化系统。把可能产生bug的因素逐一排除掉。

二 内核中的bug

内核中的bug也是多种多样的。它们的产生有无数的原因,同时表象也变化多端。从隐藏在源代码中的错误到展现在目击者面前的bug,其发作往往是一系列连锁反应的事件才可能出发的。虽然内核调试有一定的困难,但是通过你的努力和理解,说不定你会喜欢上这样的挑战。

三 内核调试配置选项

学习编写驱动程序要构建安装自己的内核(标准主线内核)。最重要的原因之一是:内核开发者已经建立了多项用于调试的功能。但是由于这些功能会造成额外的输出,并导致能下降,因此发行版厂商通常会禁止发行版内核中的调试功能。

四 引发bug并打印信息

1 一些内核调用可以用来方便标记bug,提供断言并输出信息。最常用的两个是BUG()BUG_ON()

2 dump_stack(),有些时候,只需要在终端上打印一下栈的回溯信息来帮助你调试。这时可以使用dump_stack()

printk()

内核提供的格式化打印函数。

六 内存调试工具

1 MEMWATCH   2 YAMD   3 Electric Fence

strace

strace 命令是一种强大的工具,它能够显示所有由用户空间程序发出的系统调用。

OOPS

OOPS(也称 Panic)消息包含系统错误的细节

KGDB

kgdb提供了一种使用 gdb调试 Linux 内核的机制。使用KGDB可以象调试普通的应用程序那样,在内核中进行设置断点、检查变量值、单步跟踪程序运行等操作。

原文地址:https://www.cnblogs.com/wangliping/p/5638398.html