Linux DMAインターフェースの知識ポイントの詳細な説明

Linux DMAインターフェースの知識ポイントの詳細な説明

1. 2種類のDMAマッピング

1.1. 一貫性のあるDMAマッピング

主に長期間使用されるエリアをマッピングするために使用されます。

CPU と DMA コントローラはキャッシュの影響を考慮する必要はありません。

ここでの一貫性は、実際にはコヒーレントの概念であり、保証することはできません。言い換えると、メモリの順序を保証するためにメモリバリアが必要です。

1.2 ストリーミングDMAマッピング

主に 1 回限りの DMA 転送に使用され、転送が完了すると解放されます。

2. DMAデバイスのアドレス範囲を指定する

include/linux/dma-mapping.h

// 一貫性のあるメモリマッピングのマッピング範囲 static inline int dma_set_coherent_mask(struct device *dev, u64 mask)
// ストリーミング メモリ マッピングのマッピング範囲 static inline int dma_set_mask(struct device *dev, u64 mask);

3.DMAマッピングインターフェース

3.1 コヒーレントDMAインターフェース

より大きなDMAバッファを割り当てる

// dev DMA コントローラー デバイス // size 割り当てられる DMA バッファー サイズ // dma_handle は DMA バッファーの物理アドレスを返します // flag 割り当てフラグ // 戻り値 DMA バッファーの仮想アドレス void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flag) 

// dev DMAコントローラデバイス // size 解放されたDMAバッファのサイズ // cpu_addr DMAバッファの仮想アドレス // dma_handle DMAバッファの物理アドレス void dma_free_coherent(struct device *dev, size_t size,
    void *cpu_addr、dma_addr_t dma_handle)

より小さい DMA バッファを割り当て、それを dma ポールから適用します。

/**
 * dma_pool_alloc - DMA ポーリングから一貫性のあるメモリのブロックを取得します * @pool: メモリ ブロックを生成する DMA プール
 * @mem_flags: GFP_* ビットマスク
 * @handle: メモリブロックのDMAアドレスを返します */
void *dma_pool_alloc(構造体dma_pool *pool, gfp_t mem_flags,
       dma_addr_t *ハンドル)

/**
 * dma_pool_free - メモリを解放して DMA プールに戻す
 * @pool: メモリブロックを生成するDMAプール
 * @vaddr: メモリブロックの仮想アドレス* @dma: メモリブロックの物理アドレス*/
void dma_pool_free(構造体 dma_pool *pool、void *vaddr、dma_addr_t dma)

3.2 ストリーミング DMA インターフェイス

// dev メモリをマップする必要があるデバイス // ptr マップされたバッファの仮想アドレス // size マップされたサイズ // dir 転送方向 // attr 属性 // 戻り値 dma 物理アドレス dma_addr_t dma_map_single_attrs(struct device *dev, void *ptr,
             size_t サイズ、
             列挙型 dma_data_direction ディレクトリ、
             符号なしロング属性)
// dev メモリをマップする必要があるデバイス // addr DMA領域の物理アドレス // size マッピングのサイズ // dir 転送方向 // attr 属性 void dma_unmap_single_attrs(struct device *dev, dma_addr_t addr,
           size_t サイズ、
           列挙型 dma_data_direction ディレクトリ、
           符号なしロング属性)

ページマッピング

dma_addr_t dma_map_page(構造体デバイス*dev、構造体ページ*ページ、
           size_t オフセット、size_t サイズ、
           列挙型 dma_data_direction dir)

void dma_unmap_page(構造体デバイス*dev、dma_addr_t addr、
         size_t サイズ、列挙型 dma_data_direction dir)

DMAマッピングエラーを返します

// DMAマッピングエラーを返す int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)

マッピング散布リスト

int dma_map_sg_attrs(構造体デバイス*dev、構造体スキャッターリスト*sg、
          int nents、enum dma_data_direction dir、
          符号なしロング属性)

void dma_unmap_sg_attrs(構造体デバイス*dev、構造体スキャッターリスト*sg、
           int nents、enum dma_data_direction dir、
           符号なしロング属性)

// マップ後の DMA アドレスと長さを返します sg_dma_address(struct scatterlist *sg)
sg_dma_len(構造体スキャッターリスト *sg)

同期操作

void dma_sync_single_for_cpu(構造体デバイス*dev、dma_addr_t addr、
size_t サイズ、
列挙型 dma_data_direction dir)

void dma_sync_single_for_device(構造体デバイス*dev,
dma_addr_t アドレス、size_t サイズ、
列挙型 dma_data_direction dir)

空所
dma_sync_sg_for_cpu(構造体デバイス*dev、構造体スキャッターリスト*sg、
int nelems、enum dma_data_direction dir)

空所
dma_sync_sg_for_device(構造体デバイス*dev、構造体スキャッターリスト*sg、
int nelems、enum dma_data_direction dir)

以上が今回ご紹介した関連知識の全てです。追加事項がありましたら、123WORDPRESS.COM 編集部までご連絡ください。

以下もご興味があるかもしれません:
  • Linux システムで Centos7 を使って ElasticSearch ミドルウェアと共通インターフェースを構築するデモ
  • Linux で利用可能なネットワーク インターフェイスを表示する方法
  • LinuxシステムはPythonを使用してネットワークインターフェースを監視し、ネットワークの入出力を取得します。
  • Linux での BSD ソケット開発の基礎入門
  • Linux オペレーティングシステムでの BSD ソケット開発の基礎入門
  • Linux /etc/network/interfaces 設定インターフェース方法

<<:  mysql5.5.28 のインストール チュートリアルは非常に詳細です。

>>:  MySQL 文字列連結と null 値の設定のためのインスタンス メソッド

推薦する

リンクされた画像をダウンロードしてアップロードするJavaScriptの実装

写真をアップロードするので、まずはダウンロード可能な画像リソースかどうかを判断する必要があります。正...

HTMLフォーム送信方法のケーススタディ

フォームの送信方法をまとめると次のようになります。 1. 送信ボタンを使用して送信します。送信ボタン...

MySQL パーティション フィールド列に別のインデックスを作成する必要がありますか?

序文パーティション フィールドは主キーの一部でなければならないことは誰もが知っています。では、複合主...

Facebookの情報アーキテクチャの分析

<br />原文: http://uicom.net/blog/?p=762 Faceb...

Docker ログが多すぎてディスクがいっぱいになる場合の対処方法

複数の Docker コンテナがデプロイされたサーバーがあり、各 Docker コンテナが stde...

MySQLのトランザクションとデータ一貫性処理の問題を分析する

この記事では、セキュリティ、使用方法、同時処理などを通じて、MySQL トランザクションとデータの一...

Docker バインディング固定 IP/クロスホストコンテナ相互アクセス操作

序文これまでは、パイプワークで割り当てた静的 IP は一時的なものであり、再起動すると無効になってい...

Linux で文字列を整理するためのヒント

Linuxの操作では、ファイル内の文字列を置換したりカウントしたりすることが多いです。ここでまとめを...

SQL Server での exists と except の使用法の概要

目次1. 存在する1.1 説明1.2 例1.3 交差/2017-07-21 2. 除く2.1 説明2...

メタビューポートタグ(モバイルブラウジングズームコントロール)の使用方法

OP が現在のファームウェアで Web ページを開くと、常に 50% にズームアウトされてから表示さ...

Swiper.jsプラグインを使用すると、カルーセル画像を非常に簡単に実装できます。

Swiper は、携帯電話やタブレットなどのモバイル端末向けに設計された、純粋な JavaScri...

Vueはデジタル千単位区切り形式をグローバルに実装します

この記事の例では、Vue がデジタル 3 桁区切り形式をグローバルに実装するための具体的なコードを参...

CSS3 アドバンス LESS で星空アニメーションを実装するサンプルコード

この記事では、星空アニメーションを実現するための高度な CSS3 LESS のサンプルコードを次のよ...

選択ドロップダウンメニューのテキストを左右にスクロールするように設定する

marquee タグを使用してフォントのスクロールを設定したいです。コードは次のように記述しましたが...

Reactは動的ポップアップウィンドウコンポーネントを実装します

UI コンポーネントを作成するときに、アニメーションを考慮しなければ、アニメーションを実現するのは非...