Какие альтернативы __attribute__ существуют в 64-битных ядрах? - PullRequest
1 голос
/ 02 апреля 2010

Есть ли альтернатива конкретному расширению gcc, не относящемуся к ISO, __attribute__ в 64-битных ядрах?

Я заметил три типа: атрибуты функции, атрибуты типа и атрибуты переменной.

например.Я хотел бы избегать использования __attribute__((__packed__)) для структур, передаваемых по сети, хотя некоторые коды, основанные на gcc, действительно используют его.

Любые предложения или указания о том, как полностью избежать __attribute__ использование в системах C / код ядра?

спасибо Saifi.

Ответы [ 2 ]

1 голос
/ 02 апреля 2010

Любые предложения или указатели о том, как полностью избежать использования атрибута в системах C / коде ядра?

Вы можете создавать свои сетевые пакеты по частям, копируя каждый элемент данных в правильное место в буфере char*.

Плюсы: у вас нет проблем с выравниванием, и, как правило, он переносим, ​​особенно если вы используете целочисленные типы с точной шириной из <stdint.h>

Минусы: это утомительно и потенциально подвержено ошибкам

0 голосов
/ 02 апреля 2010

Я предполагаю, основываясь на ваших комментариях, что вы хотите изменить свой код, а не все ядро ​​Linux (и т. Д.).

Не уверен насчет атрибутов функций и т. Д., Но специально для упакованных атрибутов я сделал следующее без проблем.

По сути, вместо того, чтобы полагаться на компилятор для упаковки, вы можете использовать поля ручных полей вместе с утверждениями времени компиляции.

struct foo {
   u32 field1;
   u16 field2;
   u16 pad; // manual padding
   // continue for other fields that the compiler would automatically pad for you with attribute packed
   u32 field3;
};

Чтобы проверить свою структуру, вы можете использовать assert во время компиляции, что-то вроде этого:

#define CASSERT(cond, name) typedef cassert__##name[cond ? 1 : -1]

CASSERT(offsetof(foo, field1) == 0, field1_wrong);
CASSERT(offsetof(foo, field2) == 4, field2_wrong);

Если ваши утверждения неверны, сборка завершится неудачно с полезной ошибкой и номером строки

...