c结构中私有变量的解释

时间:2013-07-29 18:27:47

标签: c struct linux-kernel

嗨,我正在浏览Linux内核代码,我在结构中遇到了以下行

unsigned long private[0] ____cacheline_aligned;

它在struct mmc_host中定义。它使用如下:

host = mmc_priv(mmc);

static inline void *mmc_priv(struct mmc_host *host)
{        
     return (void *)host->private;
}

我无法找到它初始化的位置,因为它不在mmc_alloc_host()函数中。

请参阅以下指向代码的链接。它被定义为struct mmc_host中的最后一个变量。

http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/mmc/host.h

1 个答案:

答案 0 :(得分:2)

这是一个零元素数组,在ISO C中是非法的,但可能是struct hack的实现。这取决于gcc扩展名。

____cacheline_aligned是宏或gcc扩展名。

创建struct mmc_host对象的代码可能会为此数组的元素分配额外的空间;会员名private可让您访问这些元素。

实际上mcc_alloc_host函数需要一个额外的参数(适当地称为extra),它指定要分配的额外字节数;那些额外的字节组成了private数组:

struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
{
...
host = kzalloc(sizeof(struct mmc_host) + extra, GFP_KERNEL);
if (!host)
        return NULL;

对此函数的调用可能如下所示:

struct mmc_host *ptr = mmc_alloc(N * sizeof (unsigned long), some_pointer);