LinuxでDMAデバイス用のデバイスドライバーを作成しています。Linuxデバイスドライバーの第15章では、次のように述べています。
この種の制限があるデバイスの場合、メモリは、GFP_DMAフラグをkmallocまたはget_free_pages呼び出しに追加することにより、DMAゾーンから割り当てる必要があります。このフラグが存在する場合、24ビットでアドレス指定できるメモリのみが割り当てられます。または、汎用DMAレイヤー(後で説明します)を使用して、デバイスの制限を回避するバッファーを割り当てることができます。
私はkmalloc
このように呼んでいます:
physical_pointer0 = kmalloc(number_of_bytes, GFP_DMA);
次のように結果を出力します。
printk(KERN_INFO "pinmem:pinmen_write kmalloc succeeded. pointer is %p, buffer size is %d\n", physical_pointer0, (unsigned)number_of_bytes);
そして、これは私が見るものです:
Sep 9 00:29:45 nfellman_lnx kernel: [ 112.161744] pinmem:pinmen_write kmalloc succeeded. pointer is ffff880000180000, buffer size is 320800
0xffff880000180000
GFP_DMAを使用した場合、24ビットに収まらないへのポインタを取得するにはどうすればよいですか?
これは私のメモリブロックの物理アドレスではない可能性がありますか?そうでない場合(つまり、私は完全に誤解していることを意味しkmalloc
ます)、どうすればその物理アドレスを取得できますか?
私はOpenSuse12で働いています。