Какая структура stati c в коде ядра linux используется для - PullRequest
1 голос
/ 08 мая 2020

Привет, я слежу за книгой по разработке драйверов устройств 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,};?

1 Ответ

0 голосов
/ 08 мая 2020
static struct something x = {
    .field_one = 123,
    .field_two = 456
};

Это синтаксис инициализации struct, стандартный для C99 ( см. Здесь ). В этом примере создается переменная типа struct something с именем x, с полями field_one и field_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, et c). Они не являются частью стандарта C и часто даже не являются расширениями G CC. В основном это подсказки для использования Sparse , Linux kernel semanti c checker.

Есть ли какой-либо стандарт или правило для наименования переменной, макроса, типа , ... в ядре?

Дополнительные сведения см. на странице документации Linux стиль кодирования ядра . Я бы посоветовал вам прочитать все это, прежде чем пытаться программировать какое-либо ядро. Чем больше страниц документации вы прочитаете, тем лучше.

А какие стандарты C должны соответствовать при написании кода в linux драйвере?

Использовать что-нибудь, что C99 или старше, и все будет в порядке. Код ядра Linux не соответствует единому стандарту C, а различные части кода даже не соответствуют стандарту, но используют расширения G CC. См. здесь для получения дополнительной информации.

Обычно вы не выбираете стандарт при компиляции, ядро ​​Makefile делает это за вас, и по умолчанию оно должно быть C90.


В любом случае это много вопросов. Если у вас есть вопрос specifici c, я бы посоветовал вам задать его отдельно, чтобы люди могли дать вам сфокусированный и более развернутый ответ, поскольку не рекомендуется c задавать слишком широкий или слишком много вопросов.

...