The website "dmilvdv.narod.ru." is not registered with uCoz.
If you are absolutely sure your website must be here,
please contact our Support Team.
If you were searching for something on the Internet and ended up here, try again:

About uCoz web-service

Community

Legal information

6.5.1 Написание функций-заглушек пользовательского пространства

6.5.1 Написание функций-заглушек пользовательского пространства

Предыдущая  Содержание  Следующая V*D*V

Распечатка 6.1 показывает структуры данных, участвующие в написании функции-заглушки, они находятся в файле kapi.h.

Заглушка должна заполнить соответствующие структуры данных перед вызовом соответствующего ioctl драйвера kapi.Структурами данных являются:

 

dir_t: каждый аргумент, передаваемый в функцию, имеет направление, связанное с ним. Аргумент с направлением DIR_IN является для функции входным. Аргумент с направлением DIR_OUT является для функции выходным.

arg_t: это объект для хранения одного аргумента в функции. Настоящий аргумента приводится к типу указателя void *, а его размер и направление копирования хранятся в полях size и dir, соответственно.

kfunc_t: это основная структура данных. Указатель на объект типа kfunc_t передаётся в качестве аргумента для ioctl. Драйвер kapi также использует эту структуру, чтобы отправить обратно в функцию-заглушку возвращаемое значение функции ядра.
num: количество аргументов
args: объекты типа arg_t, заполненные на каждого аргумента
ret: возвращаемое значение функции

function_id: перечисление, содержащее команды ioctl для каждой функции, которая должна быть экспортирована в пространство пользователя.

 

Итак, функция-заглушка my_kernel_func, представляющая настоящую my_kernel_func в ядре, находится в файле kapi-user.c, текст её можно увидеть в Распечатке 6.2.

Перед вызовом функций-заглушек следует убедиться, что драйвер kapi открыт успешно, как это делается в функции main в kapi-user.c.

 

char out[MAX_SIZE];

int ret;

 

dev_fd = open("/dev/kapi", O_RDONLY, 0666);

 

if (dev_fd < 0){

  perror("open failed");

  return 0;

}

 

/* вызов заглушки */

ret = my_kernel_func(10, "Hello Kernel World", out);

 

printf("result = %d, out_str = %s\n", ret, out);

 

Предыдущая  Содержание  Следующая