3

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

0xffff880000180000GFP_DMAを使用した場合、24ビットに収まらないへのポインタを取得するにはどうすればよいですか?

これは私のメモリブロックの物理アドレスではない可能性がありますか?そうでない場合(つまり、私は完全に誤解していることを意味しkmallocます)、どうすればその物理アドレスを取得できますか?


私はOpenSuse12で働いています。

4

1 に答える 1

3

これに対する答えkmallocは、実際には物理ポインターを返すのではなく、 で物理ポインターに変換する必要がある線形ポインターを返すようvirt_to_physです。

ここで回答を提供してくれたAlex Brownに感謝します。

于 2012-09-10T06:57:35.377 に答える