关键点:
1.常用安装卸载命令
2.安装卸载涉及的常用符号:
3.常用调试手段
一.安装卸载命令
1.lsmod
命令格式:lsmod
shell@sc2410_box:/ $ lsmod
vcodec_service 33766 0 - Live 0x00000000
2.insmod
命令格式:insmod hello.ko
shell@s3c2410_box:/mnt/internal_sd # dmesg
......
<4>[152488.613448] +hello_mod_init()!
<4>[152488.614482] -hello_mod_init()!
shell@sc2410_box:/ $ lsmod
hello 3685 0 - Live 0x00000000
vcodec_service 33766 0 - Live 0x00000000
从上面的命令我们发现2点:
1.内核维护了一个模块安装链表
2.该链表的形式为FIFO
3.modinfo
命令格式:modinfo hello.ko
作用:描述了模块的依赖项,模块的作者等信息
4.rmmod
命令格式:rmmod hello
Notes:注意不是rmmod hello.ko
shell@s3c2410_box:/mnt/internal_sd # rmmod hello
shell@s3c2410_box:/mnt/internal_sd # lsmod
vcodec_service 33766 0 - Live 0x00000000
shell@s3c2410_box:/mnt/internal_sd # dmesg
<1>[152991.100502] +hello_mod_exit!
<1>[152991.101328] -hello_mod_exit!
二.常用符号:
1.module_init(hello_init)
指明模块的入口函数,当模块被加载到内核时会自动调用hello_init函数,初始化成功返回0,出错则返回对应出错码,出错码定义与linux/error.h
2.module_exit(hello_exit)
指明模块的退出函数,当模块被加载到内核时会自动调用hello_exit函数,其完成与hello_init相反的功能,模块初始化申请的各类资源均需要再次做对应释放
3.MODULE_LICENSE(license)
遵循的协议,一般指明为GPL
4.MODULE_AUTHOR(author)
表示作者
5.MODULE_DESCRIPTION(description)
具体信息,一般用来描述模块的使用场景,功能等
6.MODULE_VERSION(version)
版本信息
7.__init
示例用法:__init hello_init()
说明:为宏定义,给内核的暗示,给定的函数值用于模块初始化操作,所有该标记的函数均放于init.text段,模块加载后会丢弃该初始化函数以将内用他用
8.__exit
示例用法:__exit hello_exit()
说明:为宏定义,给内核的暗示,给定的函数值用于模块初始化操作,所有该标记的函数均放于init.text段,模块卸载后会丢弃该初始化函数以将内用他用
三.常用调试手段
printf:C库函数,用于linux应用层打印调试,不支持调整打印,只能打开或者关闭
printk:内核打印函数,
常用格式:printk("info\n");
printf(KERN_INFO "error\n");其中KERN_INFO "error\n"中间为空格
#define KERN_EMERG 0 /*紧急事件消息,系统崩溃之前提示,表示系统不可用*/
#define KERN_ALERT 1 /*报告消息,表示必须立即采取措施*/
#define KERN_CRIT 2 /*临界条件,通常涉及严重的硬件或软件操作失败*/
#define KERN_ERR 3 /*错误条件,驱动程序常用KERN_ERR来报告硬件的错误*/
#define KERN_WARNING 4 /*警告条件,对可能出现问题的情况进行警告*/
#define KERN_NOTICE 5 /*正常但又重要的条件,用于提醒*/
#define KERN_INFO 6 /*提示信息,如驱动程序启动时,打印硬件信息*/
#define KERN_DEBUG 7 /*调试级别的消息*/
查看当前控制台的打印级别
cat /proc/sys/kernel/printk
4 4 1 7
上面四个值分别表示当前控制台日志级别、未明确指定日志级别的默认消息日志级别、最小(最高)允许设置的控制台日志级别、引导时默认的日志级别。
本例其中第一个“4”表示当前控制台显示的最低打印级别,只有级别比他高的(不包含等于)信息才能在控制台上打印出来,既 0-3级别的信息
修改打印级别
如修改为所有pritnk信息都显示,则当前控制台的打印级别应设置为8
echo "8 4 1 7" >/proc/sys/kernel/printk
另外所有printk的打印信息都会被存储到一个log文件中(包括不够打印级别的信息),可以使用dmesg 命令来查看所有log。log文件位置linux一般位于/var/log下,android一般位于/data/local/log下。