嗨,我正在浏览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
答案 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);