2013-05-02 2 views
2

В некотором беспорядке мне нужно вызвать одну функцию ядра, которая не должна вызывать из пространства ядра, потому что в аргументе он берет буфер из выделенного пространства пользователя.Как выделить буфер пространства пользователя в драйвере ядра?

const char __user *buf 

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

если возможно, тогда мне нужно сделать это без какого-либо взаимодействия с пользователем. Действительно ли это возможно?

Моя цель состоит в том, чтобы вызвать стандартную процедуру ядра с драйвером ядра, который принимает аргументы const char __user *buf

+1

Вам действительно нужен буфер, который должен находиться в пользовательском пространстве, или вы просто хотите вызвать подпрограмму ядра, которая не представляет собой интерфейс для ячеек-ящиков. –

+0

Мне нужно вызвать эту программу ядра, которая принимает аргументы «const char __user * buf» –

+0

Если вам нужно сделать это, вы делаете это неправильно. – gby

ответ

4

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

Вот article, который объясняет немного о механизме системного вызова. Существует раздел, в котором объясняется, как вызывать системные вызовы из пространства ядра, используя память ядра и избегать проверки.

mm_segment_t fs; 

    fs = get_fs();  /* save previous value */ 
    set_fs (get_ds()); /* use kernel limit */ 

    /* system calls can be invoked */ 

    set_fs(fs); /* restore before returning to user space */ 
+0

да, спасибо, что это сработало для меня ... –

+0

OK , Я бы предпочел, чтобы вы обновили свой вопрос, чтобы описать, какой системный вызов вы пытаетесь сделать. В зависимости от этой информации может быть лучший способ добиться того, чего вы хотите. – Anthony

4

AFAIK, обычный способ сделать это, чтобы сломать рутину ядра в два - внешняя подпрограмма, которая занимается механикой системных вызовов, ручки copyin()/coyout() и т. д., а затем вызывает внутреннюю процедуру, которая выполняет фактическую работу.

Конечно, это не сработает, если вам нужно, чтобы ваш код был самодостаточным в модуле и не контролировал остальную часть ядра, с которым он используется.

И в ответ на ваш конкретный вопрос - я не знаю, есть ли такой API, но я скорее сомневаюсь в этом.

Смежные вопросы