Пользовательский контекст Linux для доступа к виртуальной памяти пользователя - PullRequest
0 голосов
/ 31 октября 2011

Скажем, у меня есть данные контекста пользователя, хранящиеся в указателе памяти ядра.Скажем, у меня также есть указатель на символ пространства пользователя *.Затем я создаю поток ядра и поток ядра может иметь эти два указателя.Из потока я могу получить доступ к данным пространства пользователя, используя указатель?Я могу получить к ним доступ в системном вызове, но вопрос в том, могу ли я получить к ним доступ из потока ядра?Как насчет доступа к ним из Workqueue?

Скажем, мой пользовательский процесс вызывает системный вызов

//User Application
char* abc = "This is data.";
syscall(340, p);

в обработчике syscall

void sys_340(void* p) { 
    th = kthread_run("kth", kt_func, p);
    //might also store process context as I am in system call!! How?
}

void kt_func(void *p) { 
    while(1){ printk("Line: %s\n",p); sleep(1000); } 
}

Я хочу, чтобы kt_func печатал "Это данные"в каждом 1 сезоне.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2011

В вашем обработчике системного вызова вы можете сделать что-то вроде

struct mm_struct *mm = get_task_mm(current);

, чтобы спрятать отображение памяти процесса, выполняющего системный вызов.Затем в потоке ядра вы можете сделать что-то вроде

access_remote_vm(mm, p, my_kernel_buf, length, 0);

, чтобы сделать эквивалент copy_from_user() в памяти исходного задания.

0 голосов
/ 01 ноября 2011

Потоки ядра могут обращаться к любой части памяти пространства пользователя (при условии, что они имеют надлежащий указатель на нее). Поскольку ваш код предполагает, что в рамках системного вызова вы хотите запустить новый поток ядра и позволить ему печатать что-то каждую 1 секунду. Я предполагаю, что после создания потока ядра вы вернетесь из системного вызова. Проблема здесь заключается в следующем: после того, как вы вернулись из системного вызова, пользовательский процесс также может получить доступ к памяти, обозначенной p , и поток ядра также может получить к ней доступ. Как бы вы обеспечили синхронизацию доступа указателя p ? (Возможно через другой системный вызов).

Хотя я не вижу ни одного варианта использования того, что вы делаете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...