linux内核驱动程序,解引用指针和printk

时间:2013-05-17 19:54:20

标签: linux kernel driver

这是一个测试设备驱动程序代码。 我有内核空间数据,它是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));

编译失败。 请帮忙

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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.