将指针包装在C中的结构中的目的

z0l*_*pka 9 c struct pointers linux-kernel skb

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

struct skb_frag_struct {
    struct page *page;
    /* ... */
Run Code Online (Sandbox Code Playgroud)

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

struct skb_frag_struct {
    struct {
        struct page *p;
    } page;
    /* ... */
Run Code Online (Sandbox Code Playgroud)

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

Hos*_*ork 7

理解代码更改以使用Git Blame视图会有所帮助:

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

您可以在提交更改提交说明中看到它的内容:

net:在skb frag页面周围添加opaque结构

我已将此位从skb frag析构函数补丁中分离出来,因为它有助于强制使用片段API.

因此,似乎只是为了捕获代码中的悬空引用,这些引用正在对指针进行原始访问,并强制使用更高级别的API.它不应该添加任何运行时成本.

struct { struct page *ge; } pa;顺便说一下:上次我自己做的时候有一种愚蠢的想法,就是将结构名称拆分成类似的东西......这样特权代码可以读作fragstruct.pa.ge而不是fragstruct .page.p.但除此之外是愚蠢的,使用相同名称的外部结构的一个优点是帮助指导旧的用法有明显的错误.虽然你的困惑指出,但在这种情况下// don't access directly, use fragment API,对该p成员的评论可能是合适的.