0

嗨,我正在浏览 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

4

1 回答 1

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);
于 2013-07-29T18:39:28.023 回答