c - c struct中私有(private)变量的解释

标签 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

最佳答案

这是一个零元素数组,这在 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);

关于c - c struct中私有(private)变量的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17931491/

相关文章:

c# - 为什么结构比类慢?

c - 下一个结构项,不完整类型

linux - exec 不替换当前进程,posix_spawn 内核实现

c - 如果我只是使用 wait() 一次等待 1 个 child 完成,我是否需要对 SIGCHLD 处理程序执行任何操作?

c++ - 当函数必须访问其他成员时,如何将 lambda 函数分配给结构成员?

c++ - c语言实现密码安全的程序?

c - 构建静态库并在编译时将其链接到内核模块

linux - perf 工具能否提供在 VM 中调用的系统调用列表?

c - 内联 (x86) 汇编如何影响程序流程?

c - 接收 AT 命令