2013-05-17 80 views
0

这是一个测试设备驱动程序代码。 我有内核空间数据,这是dptr->数据。 Afte我将它复制给用户。我想打印它。linue内核驱动程序,取消引用指针和printk

但我的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)); 

编译失败。 请帮忙

回答

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 
0

看看在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.