взаимодействие пространства ядра и пространства пользователя с помощью netlink

Моя цель — постоянно иметь массив или список в памяти ядра, чтобы он всегда был доступен из пространства ядра. Для этого я использую сокеты netlink, как рекомендовано здесь. Я следую этому примеру, который показывает, как отправить строку. Я не уверен, как отправить массив структур или список структур в сокетах.

typedef struct {
    int fiveDollarBills;
    int denDollarBills;
} Bills;

Можно ли отправить список или массив с помощью netlink?


person Alkesh    schedule 14.12.2010    source источник
comment
Если ничего не помогает, вы можете сериализовать свои данные и отправить строку   -  person pmg    schedule 14.12.2010
comment
хм... не подумал об этом. Поддерживает ли C сериализацию? Кроме того, если я отправлю строку, доступна ли библиотека string.h в пространстве ядра для сравнения строк?   -  person Alkesh    schedule 14.12.2010
comment
Я не думаю, что вам нужна какая-то специальная поддержка сериализации, вы можете просто скопировать содержимое структуры. Обе стороны сокета netlink всегда работают в одной и той же системе, поэтому двоичная структура более или менее не имеет значения.   -  person lunaryorn    schedule 14.12.2010
comment
@lunaryorn: За исключением случаев, когда ядро ​​64-битное, а пользовательское пространство 32-битное.   -  person ephemient    schedule 14.12.2010
comment
@ephemient: Конечно, я не думал об этом. Но я думаю, мы можем согласиться, что это довольно глупая идея создавать инструменты ядра, используя другую архитектуру, чем само ядро.   -  person lunaryorn    schedule 14.12.2010
comment
@lunarorn: я не согласен. И то, что строит OP, не обязательно является инструментом ядра.   -  person ephemient    schedule 14.12.2010
comment
@ephemient: Что еще, если не инструмент, связанный с ядром, можно написать поверх netlink ?! В конце концов, netlink — это IPC API между пользовательским пространством и ядром...   -  person lunaryorn    schedule 14.12.2010
comment
@lunaryorn: Так же, как и open и read и write и ioctl, и вы не называете любую случайную программу, использующую их, инструментом, связанным с ядром, не так ли? Несмотря на это, 32-разрядные mount и ifconfig и все эти инструменты, связанные с настоящим ядром, действительно работают с 64-разрядными ядрами, и я считаю вполне разумным перенести этот уровень совместимости на любые новые ABI. представил.   -  person ephemient    schedule 15.12.2010


Ответы (1)


Сам NetLink не заботится о том, являются ли данные строкой, целым числом, структурой и т. д. Он просто берет void* и длину и копирует данные, не глядя на них. Вы можете преобразовать свою структуру в void* и использовать sizeof для определения длины и отправки этих данных по сети.

С другой стороны, вам просто нужно получить void* и длину, убедиться, что длина соответствует ожидаемой, и привести void* обратно к указателю на вашу структуру. Две важные вещи, которые нужно проверить:

  1. И код UserSpace, и код KernelSpace согласуются с расположением памяти в структуре. Это означает компиляцию обоих с одним и тем же .h и проверку того, что параметры компиляции таковы, что структура памяти и выравнивание одинаковы.

  2. Структура будет передана как просто необработанная копия памяти, нет никакого интеллекта для исправления указателей, поэтому ваша структура не может содержать никаких указателей и т. д.

Другой вариант заключается в том, чтобы вместо отправки необработанных данных «сериализовать» данные самостоятельно, преобразовав их в строку в известном формате. Это позволит вам обрабатывать более сложные структуры данных за счет дополнительных ресурсов ЦП и памяти.

person bdk    schedule 14.12.2010