【问题标题】:linue kernel driver, dereference pointer and printklinux内核驱动、解引用指针和printk
【发布时间】:2013-05-17 19:54:19
【问题描述】:

这是一个测试设备驱动程序代码。 我有内核空间数据,即 dptr->data。 在我将它复制给用户之后。我想把它打印出来。

但我的 printk 似乎打印出了地址。

if (copy_to_user(buf, dptr->data[s_pos] + q_pos, count)) {

for(i=0;i<count;i++){
    printk(KERN_NOTICE "data:%p\n ",(dptr->data[s_pos]+q_pos+i));
}

如果我把它改成

printk(KERN_NOTICE "data:%p\n ",(void*)*(dptr->data[s_pos]+q_pos+i));

编译失败。 请帮忙

【问题讨论】:

    标签: linux kernel driver


    【解决方案1】:

    *p是指针的格式说明符,即地址。

    如果您想打印数据,您需要一个适合您要打印的数据类型的格式说明符 - 例如%x,尽管这取决于数据类型。

    要获取数据,您必须取消引用指针。您正在尝试将指针转换为 (void *) 并取消引用该指针,但根据定义无法取消引用 void 指针。因此,您需要转换为适当的数据类型。

    例如:

    printk(KERN_NOTICE "data:%x\n ",
           *((u8*)(dptr->data[s_pos]+q_pos+i)); //print as byte
    
    printk(KERN_NOTICE "data:%x\n ",
           *((u32*)(dptr->data[s_pos]+q_pos+i)); //print as 32-bit word
    

    【讨论】:

      【解决方案2】:

      查看printk-formats.txt 内核文档:

      If variable is of Type,             use printk format specifier:
      ---------------------------------------------------------
                  int                     %d or %x
                  unsigned int            %u or %x
                  long                    %ld or %lx
                  unsigned long           %lu or %lx
                  long long               %lld or %llx
                  unsigned long long      %llu or %llx
                  size_t                  %zu or %zx
                  ssize_t                 %zd or %zx
      
      Raw pointer value SHOULD be printed with %p.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-05
        • 1970-01-01
        • 2010-09-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多