0

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

编译失败。请帮忙

4

2 回答 2

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
于 2013-05-17T19:59:57.893 回答
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.
于 2013-10-01T13:44:28.313 回答