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 に答える