第三次月考
第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.c和pwm_fun.c文件编译成pwm.o和pwm_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 编写一款支持HAL的LINUX程序驱动程序的步骤
第一步:Linux驱动程序,编写linux驱动,从表明上看是废话,但如果要为linux添加HAL,而且要想尽量保护敏感数据,linux驱动的代码就要尽量简介,尽可能将业务逻辑放到HAL library.
第二步:编写HAL Library,HAL 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可以象调试普通的应用程序那样,在内核中进行设置断点、检查变量值、单步跟踪程序运行等操作。