2016-06-18 100 views
2

私はカーネルドライバのプログラミングには新しく、いくつかの側面を理解したいと思います。以下のコードでdevm_kzallocのパラメータと用法を説明してください

http://lxr.free-electrons.com/source/drivers/i2c/busses/i2c-ocores.c?v=3.19

static int ocores_i2c_probe(struct platform_device *pdev) 
{ 
    struct ocores_i2c *i2c; 
    i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL); 
} 
  1. からPDEVは、プラットフォームのデバイスへのポインタです。 pdevが指している構造体の内容は、プラットフォームデバイスが初期化され、ドライバコアがその情報をこのプローブ関数に渡すときにすでに作成されています。 ??これはドライバコアが使用するドライバのプローブ中に特定したpci_devを渡しているpci dev構造体と同じですか?私の理解は正しいのですか?
  2. devm_kzallocのパラメータが不明です。 「デバイスがメモリを割り当てる」とは、763行目の意味ですか。http://lxr.free-electrons.com/source/drivers/base/devres.c?v=3.19#L774?最後にstruct ocores_i2cというサイズのカーネルにメモリを割り当てるだけで済みます。最初のパラメータは後で自動的に解放するためのトラッキングメカニズムとして使用されていますか(devresカーネルのドキュメントを読むことに基づいています)?
  3. devm_kzallocの戻り値は、カーネル内のocores_i2cサイズの新しく割り当てられたメモリへのポインタです。これが当てはまる場合、devm_kzallocの2番目のパラメータはsizeof(* i2c)の代わりにsizeof(struct ocores_i2c)にしてはいけませんか?

答えて

2

1)はい、カーネルがこの構造体を記入して、probe関数に渡して初期化を実行します。つまり、devm_ファンクションスイートはすべて、返されたリソースのライフサイクルを実際のデバイスのライフサイクルに結びつけます。したがって、返されたリソースは、指定されたデバイスがプローブされていないときに自動的にクリーンアップされます。

3)sizeof演算子はi2cの定義に従いますが、これは実際には​​と基本的に同じです。

+0

回答を拡大することをお勧めします。 1.トピックのスターターは、*デバイスの作成*と*ドライバーのアタッチメント*が発生したときの違いとその違いを理解する必要があります。 2.実際の 'struct device * dev'ポインタは、リソースの* storage *へのポインタとして使用されます。 devres APIのコードを見る方が良いでしょう。あなたが構造体を変更した場合にはより柔軟なので(おそらく入力する文字数が少なくて済みます)、おそらくそうではありません。それにもかかわらず、両方の方法は短所を持っている。 – 0andriy

+0

1&2:コンフォメーションをありがとう。私は他のドライバーの数を調べ、sizeof(* i2c)とsizeof(struct ocores_i2c)が同じ/類似していると結論付けました。 sizeof(* i2c)が好まれる理由を理解すると便利です(入力する文字数が少ないことは別として)。 Andy、あなたがあなたの構造体を変更すると言うと、それは完全に異なる構造体に変更するか、構造体に余分なメンバーを追加するだけですか?後で私たちはまだsizeof(struct i2c)を使うことができますか? – dee

+0

私はドライバの実行を終了し、値を印刷しました。 'sizeof(* i2c)= 976 sizeof(i2c)= 8'。うまくいけば、 'sizeof(* i2c)'はポインタの後に 'struct ocores_i2c'のサイズを表示するのに対して、これは – dee

関連する問題