Chinaunix首页 | 论坛 | 博客
  • 博客访问: 239827
  • 博文数量: 37
  • 博客积分: 719
  • 博客等级: 上士
  • 技术积分: 325
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-04 10:04
文章分类

全部博文(37)

文章存档

2014年(2)

2013年(5)

2012年(11)

2011年(13)

2010年(3)

2009年(3)

分类: LINUX

2012-09-21 17:17:48

1.关于kernel log
 
  a)在 /proc/sys/kernel/printk下定义默认终端打印级别
          eg:
             cat /proc/sys/kernel/printk 

           4 4 1 7 

            显示4个数值(可由 echo 修改),分别表示当前控制台日志级别、未明确指定日志级别的默认

消息日志级别、最小(最高)允许设置的控制台日志级别、引导时默认的日志级别。当 printk() 中的消息日志级别小于当前控制台日志级别时,printk 的信息就会在控制台上显示。

 

    b)设置log缓冲区大小

     在Kconfig中可以设置:

       

CONFIG_LOG_BUF_SHIFT

config LOG_BUF_SHIFT

        int "Kernel log buffer size (16 => 64KB, 17 => 128KB)"

        range 12 21

        default 17

        help

          Select kernel log buffer size as a power of 2.

          Examples:

                     17 => 128 KB

                     16 => 64 KB

                     15 => 32 KB

                     14 => 16 KB

                     13 =>  8 KB

                     12 =>  4 KB

 

   c)使用log缓冲区

     

          通过System.map查到__log_buf的虚拟地址,我的

        __log_buf的地址是0xc05be6c0,

 

        通常做手机的用的是usb口,没有串口,所以:

        eg:在高通平台linux起不来,可以使用tract导出__log_buf这一段内存地址,从而看到kernel log

 

2)sysrq

     常使用的魔术键:

     echo  1>/proc/sys/kernel/sysrq 打开sysrq功能

 

     echo 't' >/proc/sysrq-trigger   打印进程栈,调试时很有用

 

     echo 'c' >/proc/sysrq-trigger  常常用来测试dump模式

 

3)只读proc

     struct proc_dir_entry *create_proc_read_entry(const char *name,mode_t mode, struct proc_dir_entry *base, read_proc_t *read_proc, void *data); 
     name 是要创建的文件名子, mod 是文件的保护掩码(缺省系统范围时可以作为 0 传递), base 指出要创建的文件的目录( 如果 base 是 NULL, 文件在 /proc 根下创建 ), read_proc 是实现文件的 read_proc 函数, data 被内核忽略( 但是传递给 read_proc). 这就是 scull 使用的调用, 来使它的 /proc 函数可用做 /proc/scullmem:

create_proc_read_entry("scullmem", 0 /* default mode */, NULL /* parent dir */, scull_read_procmem, NULL /* client data */);

创建了一个名为 scullmem 的文件, 直接在 /proc 下, 带有缺省的, 全局可读的保护.

4)seq_file proc接口,适用于大数据输出

    创建了一个名为 scullseq 的文件, 直接在 /proc 下, 全局可读.

5)sys接口
   在/sys/devices/virtual/scull/下为scull0-3创建sys接口。
   下面的
    scull_qset
    scull_quantum
    这两个文件可以读取和设置scull_qset和scull_quantum的值。
    debug文件可以动态打开关闭log开关。
 
    主要函数:
    int __must_check device_create_file(struct device *device,
                                        const struct device_attribute *entry);
    真的驱动都用上面这个函数为设备创建sys文件。
   
    念书的时候用下面这个,这个不好和设备关联,还会显得sys目录有点凌乱(搞不清父节点):
    int __must_check sysfs_create_file(struct kobject *kobj,
                                   const struct attribute *attr);
   
代码修改:
1)增加proc和sys接口
2)sys接口可以设置scull_qset和scull_quantum的值
3)动态设置debug值,控制log打印
附件代码:
 
阅读(3436) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~