2

私はカーネル ドライバー プログラミングに不慣れで、いくつかの側面を理解したいと考えています。

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) にすべきではありませんか?
4

1 に答える 1

2

1) はい、カーネルがこの構造体に入力し、それをprobe関数に渡して初期化を実行します。

2) 要するに、devm_一連の関数のすべてが、返されたリソースのライフサイクルを実際のデバイスのライフサイクルに結び付けます。したがって、返されたリソースは、指定されたデバイスがプローブされていないときに自動的にクリーンアップされます。

3) おそらく、そうでしょう。sizeof演算子は の定義に従いますがi2c、これは実際には基本的に と同じsizeof(struct ocores_i2c)です。

于 2016-06-18T21:06:49.710 に答える