Как отобразить структуру неопределенного размера в LinuxLinux

Ответить
Anonymous
 Как отобразить структуру неопределенного размера в Linux

Сообщение Anonymous »

Существует программа, в которой точный размер данных можно узнать только после завершения компиляции (поскольку она динамическая и представляет собой сложную самоопределяемую структуру, который содержит связанный список...).
В таком случае я хочу использовать mmap, чтобы поделиться данными с ядром, поэтому я выделил большой фиксированный размер (

Код: Выделить всё

MMAP_SIZE
) заранее (с помощью mmap()).
И, наконец, назначьте адрес данных возвращаемое значение mmap().
Ниже приведена упрощенная версия приведенного выше текста для иллюстрации кода, где a и b — указатели. , которые являются членами структуры данных. a и b динамически назначаются им на этапе компиляции, в основном с использованием связанного списка, поэтому размер не может быть известен заранее, и вы не можете выполнить mmap() также заранее указав точный размер.

Код: Выделить всё

/*
* USER SPACE
*/

struct shared_data{
struct a_struct *a;
struct b_struct *b;
};

/*
* Omit the assignment process of a, b.
*/

// mmap()
struct shared_data* shared = (struct shared_data *) mmap(NULL, 4096*100, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
shared->a = a;
shared->b = b;

После mmap() в соответствующем модуле ядра я попытался получить доступ к b, но не удалось.
В /var/log/kern.log написано "RIP: 0010:module_mmap..."

Код: Выделить всё

\*
* KERNEL SPACE
* length is a member of struct b
*\

static void *shared_memory = NULL;
static int module_mmap(struct file *filp, struct vm_area_struct *vma) {
size_t size = vma->vm_end - vma->vm_start;

remap_vmalloc_range(vma, shared_memory, vma->vm_pgoff);

shared = (struct shared_data *)shared_memory;

if(shared!=NULL)
printk("b->length: %d", shared->b->length);

return 0;
}

Итак, как в этом случае я могу правильно использовать mmap() для совместного использования данных неопределенного размера между пользователем и пространством ядра?

Подробнее здесь: https://stackoverflow.com/questions/790 ... e-in-linux
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»