ホームページ  >  記事  >  運用・保守  >  Linux カーネルの基礎 - コンテナーの原理と実際の応用

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

嵌入式Linux充电站
嵌入式Linux充电站転載
2023-07-31 15:46:131083ブラウズ

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 までご連絡ください。