linux驱动说开去(二)--模块安装、调试

关键点:

    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下。

            
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值