在linux内核代码中用什么静态结构来表示?

问题描述 投票:1回答:1

你好,我是按照《Linux设备驱动程序开发》这本书,在Linux中写一个驱动程序。在一个例子中,代码如下。

struct my_gpios {
    int reset_gpio;
    int led_gpio;
};
static struct my_gpiosneeded_gpios = {
    .reset_gpio = 47;
    .led_gpio = 41;
};

static struct resource needed_resources[] = {
    [0] = { /* The first memory region */
    .start = JZ4740_UDC_BASE_ADDR,
    .end = JZ4740_UDC_BASE_ADDR + 0x10000 - 1,
    .flags = IORESOURCE_MEM,
    .name = "mem1",
},
    [1] = {
    .start = JZ4740_UDC_BASE_ADDR2,Platform Device Drivers
    [ 126 ]
    .end = JZ4740_UDC_BASE_ADDR2 + 0x10000 -1,
    .flags = IORESOURCE_MEM,
    .name = "mem2",
},
};
static struct platform_devicemy_device = {
    .name = "my-platform-device",
    .id = 0,
    .dev = {
    .platform_data = &needed_gpios,
},
    .resource = needed_resources,
    .num_resources = ARRY_SIZE(needed_resources),
};
platform_device_register(&my_device);

我不明白其中的语法 static struct_gpiosneeded_gpios = {} 意思和为什么要点 .reset_gpio. 句法的含义是什么呢?static struct [] = {[0]={}, [1]={}}?

请你给我一个参考链接或关键字或例子,关于 static struct {.a = VALUE, .b = VALUE,};?

c linux struct syntax linux-kernel
1个回答
0
投票
static struct something x = {
    .field_one = 123,
    .field_two = 456
};

这是一个 struct 初始化语法,从C99开始的标准语法(见此). 这个例子创建了一个类型为 struct something 名为 x,领域为 field_onefield_two 初始化为指定的值,其他任何字段初始化为 0. 该 static 关键字是一个存储持续时间指定符(见此).


static struct something x[] = {[0]={ ... }, [1]={ ... }};

这是这两者的混合。struct 初始化和数组初始化语法,同样是C99的标准语法(见此). 这个例子创建了一个数组 x 类型的变量的 struct something,索引处的那个 0 的内容进行初始化。{...} 初始化器,同样的道理也适用于索引处的那个 1. 由于最大的指定指数是 1阵列大小为 2.


我不明白为什么他们命名的类型是。u32 或者说 __raw.

u32 类型只是 uint32_t.

我不确定你到底在哪里看到 __raw,因为我似乎没有在内核源码中找到类似的东西。在任何情况下,Linux内核作为一系列编译时注解,用于不同用途的变量(__user, __rcu等)。) 这些都不是C标准的一部分,甚至经常不是GCC的扩展。它们大多是由 稀疏,Linux 内核语义检查器。

内核中的变量、宏、类型......的命名有什么标准或规则吗?

请参考 Linux内核编码风格 文档页面获取更多信息。我建议你在尝试进行任何内核编程之前,先把它全部读完。你读的文档越多越好。

当我在linux驱动中写代码时,我必须遵守什么C标准?

使用任何C99或更老的标准就可以了。Linux内核代码并没有遵守一个C标准,代码的各个部分甚至不符合标准,而是使用GCC扩展。请看 此处 以获得更多信息。

编译时一般不会选择标准,内核的 Makefile 为你做的,它应该默认为C90。


无论如何,这些问题很多。如果你有一个 特定 问题我建议你分开来问,这样大家才能给你一个重点的、更广泛的回答,因为问得太宽泛或太多都是偏题。

© www.soinside.com 2019 - 2024. All rights reserved.