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
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即可
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即可
相关文章推荐
- Android深度探索:HAL与驱动开发学习笔记--中断
- Android深度探索:HAL与驱动开发学习笔记--内存管理(学习重点)
- Android深度探索:HAL与驱动开发学习笔记--并发控制之顺序锁
- Android深度探索:HAL与驱动开发学习笔记--等待队列
- Android深度探索:HAL与驱动开发学习笔记--并发控制总结
- Android深度探索:HAL与驱动开发学习笔记--工作队列
- Android深度探索:HAL与驱动开发学习笔记--并发控制之信号量&完成量
- Android深度探索:HAL与驱动开发学习笔记--时间管理
- Android深度探索:HAL与驱动开发学习笔记--并发控制之互斥锁
- Android深度探索:HAL与驱动开发学习笔记--并发控制之自旋锁
- Android深度探索(卷1)HAL与驱动开发 虚拟环境的安装
- 读书笔记-Android开发艺术探索-第12章-Bitmap的加载和Cache
- 【读书笔记】深度探索 HAL与驱动开发
- Android深度探索(卷2)系统应用源代码分析与ROM定制 读书笔记1
- Android开发艺术探索(研读笔记)——02-Activity的启动模式
- Android开发艺术探索(研读笔记)——03-Android中的IPC机制(一)
- Android开发艺术探索笔记_第二章 IPC机制
- Android开发艺术探索学习笔记(六)
- Android开发艺术探索笔记 第一章
- 利用Window和WindowManager实现悬浮窗效果——Android开发艺术探索笔记