【问题标题】:The purpose of wrapping a pointer in struct in C在 C 中将指针包装在 struct 中的目的
【发布时间】:2025-12-08 23:50:02
【问题描述】:

在Linux内核代码中(最高3.1.*)我看到了这样的结构定义:

struct skb_frag_struct {
    struct page *page;
    /* ... */

在较新的内核版本中,这已演变为:

struct skb_frag_struct {
    struct {
        struct page *p;
    } page;
    /* ... */

在这种特殊情况下,为了什么目的可以进行这种包装?为什么在一般情况下可能需要它?

【问题讨论】:

    标签: c pointers struct linux-kernel skb


    【解决方案1】:

    使用 Git Blame 视图有助于理解代码更改:

    https://github.com/torvalds/linux/blame/a978a5b8d83f795e107a2ff759b28643739be70e/include/linux/skbuff.h

    您可以在commit where the change was made的描述中看到它所说的:

    net:在 skb 片段页面周围添加不​​透明结构

    我已经从 skb frag 析构函数补丁中分离了这一点,因为它有助于强制执行 片段 API 的使用。

    所以看起来这样做只是为了捕获代码中对指针进行原始访问的悬空引用,并强制使用更高级别的 API。它不应该增加任何运行时成本。

    顺便说一句:上次我自己这样做时,我有一个愚蠢的想法,即将结构的名称拆分为struct { struct page *ge; } pa;...这样特权代码可以读取作为 fragstruct.page.ge 而不是 fragstruct.page.p。但除了愚蠢之外,为外部结构使用相同名称的一个优势是有助于引导旧用法,并带有明显的错误。 尽管您的困惑指出,在这种情况下,p 成员上的评论 // don't access directly, use fragment API 可能是合适的。

    【讨论】:

    • 打败我! :-)