Linux カーネルの基礎 - コンテナーの原理と実際の応用

リリース: 2023-07-31 15:46:13
転載
1083 人が閲覧しました

container_of は Linux カーネルでよく見られ、実際のドライバー作成でも広く使用されています。

container_of priority

##Function: 構造体の メンバーを介した変数address は、 構造体の最初のアドレス を検索します。

は次のように定義されます:

/**
 * container_of - cast a member of a structure out to the containing structure
 * @ptr:    the pointer to the member.
 * @type:   the type of the container struct this is embedded in.
 * @member: the name of the member within the struct.
 *
 */
#define container_of(ptr, type, member) ({          \
    const typeof( ((type *)0)->member ) *__mptr = (ptr); \
    (type *)( (char *)__mptr - offsetof(type,member) );})
ログイン後にコピー

  • ptr: 構造体メンバ変数へのポインタ
  • type: 構造体の型
  • member: 構造体のメンバ変数名
つまり

既知の構造体 type のメンバー member のアドレス ptr がわかっており、構造体 type の開始アドレス 解決されます。

計算式は次のとおりです。 type の開始アドレス = ptr -size (size はメンバーのサイズです)

図を使用して、ptrtypemember の関係を示します:

Linux カーネルの基礎 - コンテナーの原理と実際の応用
  • 原理の簡単な説明:

container_of の利点は、0 を次のように使用することです。メンバ変数 メンバのベースアドレスはです。

中間変数 __mptr が定義されており、「__」は内部使用を表し、「m」は middle を表します。

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
ログイン後にコピー

typeof( ((type *)0)->member )是获取member的类型,__mptr = (ptr)判断ptrmember是否为同一类型,offsetof计算成员member的大小size

驱动中的实际例子

例如内核的pwm驱动,通过成员变量chip,找到结构体bcm2835_pwm

struct bcm2835_pwm {
 struct pwm_chip chip;
 struct device *dev;
 void __iomem *base;
 struct clk *clk;
};

static inline struct bcm2835_pwm *to_bcm2835_pwm(struct pwm_chip *chip_ptr)
{
 return container_of(chip_ptr, struct bcm2835_pwm, chip);
}
ログイン後にコピー

使用container_of通常都会定义一个函数,并且命名为to_xxx或者to_find_xxx,代表要找xxx这个结构体,传参则传入成员变量指针,另外函数也会声明为inline

以上がLinux カーネルの基礎 - コンテナーの原理と実際の応用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:嵌入式Linux充电站
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!