Как я могу делиться данными между программами ядра C и программами уровня пользователя C?

99
12

Я использую Ubuntu 9.04 с ядром 2.8.32. Я создал простой системный вызов, который подсчитывает количество clone и execve. Когда пользователь/оболочка вызывает этот системный вызов, я бы хотел, чтобы он передал пользователю эти два значения. На данный момент я использую:


#include <linux/sched.h>
#include <linux/asmlinkage>

/* These two variables are extern longs which are defined in sched.h and initialized in process_32.c */

total_execve;
total_clones;

long mycall* (int i){
int array[2];
array[0] = total_execve;
array[1] = total_clones;
return array;
}


Я не могу скомпилировать это, поскольку получаю ссылку undefined.


Относительно возврата массива: сможет ли мой новый вызов получить доступ к массиву, не будет ли массив находиться в памяти ядра?

спросил(а) 2021-01-25T15:34:39+03:00 4 месяца, 2 недели назад
1
Решение
108

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

void mycall (int *execve, int *clones)
{
*execve = total_execve;
*clones = total_clones;
}

ответил(а) 2021-01-25T15:34:39+03:00 4 месяца, 2 недели назад
100

Отвечая на ваш последний вопрос: массив действительно находится в "ядре" памяти, но он выделяется стек, что означает, что он "уходит", когда функция mycall() завершается. Возможно, ваша функция работает, но может не работать в случаях, когда память быстро используется.

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

ответил(а) 2021-01-25T15:34:39+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема