взаимодействие пространства пользователя в пространстве ядра с помощью netlink - PullRequest
1 голос
/ 14 декабря 2010

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

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

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

1 Ответ

1 голос
/ 14 декабря 2010

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

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

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

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

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

...