В таком случае я хочу использовать mmap, чтобы поделиться данными с ядром, поэтому я выделил большой фиксированный размер (
Код: Выделить всё
MMAP_SIZEИ, наконец, назначьте адрес данных возвращаемое значение 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;
В /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;
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... e-in-linux
Мобильная версия