0

Linux カーネルの学習を始めたばかりで、プラットフォーム デバイスのカーネル コードを読むときに混乱しました。どうして device を platform_device 構造体の最初のメンバーとして配置するのではなく、to_platform_device(),shift を構造体の開始に使用するのでしょうか?

struct platform_device {
    const char  * name;
    int     id;
    struct device   dev;
    u32     num_resources;
    struct resource * resource;

    const struct platform_device_id *id_entry;

    /* MFD cell pointer */
    struct mfd_cell *mfd_cell;

    /* arch specific additions */
    struct pdev_archdata    archdata;
};

#define to_platform_device(x) container_of((x), struct platform_device, dev)
4

2 に答える 2

1

/Documentation/driver-api/driver-model/overview.rst から:

構造体デバイス dev は必ずしも pci_dev 構造体の先頭で定義されているとは限らないことにも注意してください。これは、バス ドライバーとグローバル ドライバーを切り替えるときに何をしているのかを人々に考えさせ、2 つの間の無意味で不適切なキャストを思いとどまらせるためです。

于 2021-01-28T13:26:14.100 に答える
0

携帯性はほとんど。構造体の定義は制御できず、Linux カーネルの後続のバージョンで変更される可能性があります。また、開発者が最初であることに依存している場合、デバイスはカーネルの更新されたバージョンで突然壊れます。

container_of は定数式であるため、コンパイル時に計算され、オーバーヘッドはありません。

于 2013-07-07T05:47:33.403 に答える