您的位置:首页 > 移动开发 > Android开发

Android深度探索 卷1 HAL与驱动开发 读书笔记1

2017-12-18 13:57 721 查看
1.__init __exit可以提高驱动执行效率。

2.导出符号

EXPORT_SYMBOL()

EXPORT_SYMBOL_GPL()仅用于支持GPL协议的代码中

比如:

consumer.c需要producter.c中的函数和变量,则需要在consumer.c最后使用导出宏导出(可以使静态的),
在product.c中使用extern引入前面被导出的(不能加static)
在Makefile中这样编译:

         obj-m := consumer.o
obj-m += producter.o
另外如果多个模块编译成一个模块可以这样

obj-m := pwm_driver.o

pwm_driver-objs := pwm.o pwm_fun.o  

3.cat /proc/kallsyms配合grep查看导出符号信息

   depmod可以分析模块之间的依赖关系

   probemod根据依赖装载模块

4.卸载模块异常解决办法

通过修改驱动名称可以再次插入,但是这个模块被多个程序使用时就不适合这个。
(只适用于X86架构)初始化函数崩溃,没有再使用却提示 in use;或者卸载函数被阻塞,执行不到exit函数,这两种情况均可使用下面的方法
使用cat   /proc/kallsyms  |  grep _this_module  | grep <模块名(不加.ko)>找到这个模块结构体的首地址,可以看出这个地址在内核空间,因此需要编写另外一个
驱动卸载现在的驱动
force_kill_driver.c

#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <asm-generic/local.h>
#include <asm/uaccess.h>
#include <linux/miscdevice.h>

static cahr* module_address = "";
void force(void)
{
}
int __init force_kill_driver_init(void)
{
if(strcmp(module_addresss, "") != 0)
{
char *temp;
long address = simple_strtol(module_address, &temp, 16);
struct module *mod = (struct module*)address;
mod->state = MODULE_STATE_LIVE;
mod->refptr = NULL;
mod->exit = force;
}
return 0;
}

void _exit force_kill_driver_exit(void)
{

}
module_init(force_kill_driver_init);
module_exit(force_kill_driver_exit);

module_param(module_address, charp, S_IRUGO | S_IWUSR);
MODULE_LICENSE("GPL");

build.sh脚本

source /root/drivers/common.sh

make -C $UBUNTU_KERNEL_PATH M=$PWD

read -p "Please input module name :" module_name

temp=$(lsmod | grep "^""$module_name"" ")

if["$temp" == ""];then
echo "module <"$module_name"> does not exit!"
exit
fi

module_line=$(cat /proc/kallsyms | grep _this_module | grep $module_name)
if["$module_line" != ""]; then
echo $module_line
read -p "kill?(y/n)" yn
if["$yn" == "y"]; then
module_address=$(echo $module_line | cut -d'' -f1)
testing=$(lsmod | grep "force_kill_driver")
if["$testing" != ""]; then
rmmod force_kill_driver
fi

insmod $PWD /force_kill_driver.ko module_address="$module_address"
remmod $module_name
echo "<"$module_name"> is killed!"
fi
fi
sh build.sh即可
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: