2016-03-15 5 views
0

Грубо говоря, я пытаюсь выпустить вызов IOCTL из пространства ядра, не посещая пространство пользователя. (Все ответы, которые я нашел в SO, предлагают пройти через пространство пользователя).IOCTL из пространства ядра

В частности, я пытаюсь заполнить пул энтропии (/dev/random) из пространства ядра (используя модуль ядра). [Я знаю, что это опасно;]]. Заполнение пула энтропии из пользовательского пространства выполняется с использованием IOCTL, например, rngaddentropy. Есть ли способ сделать то же самое из пространства ядра?

ответ

2

Вы также можете использовать ioctl из пространства ядра.

Поскольку команда IOCTL RNDADDENTROPY файлов конкретного, его обработка должна осуществляться в .unlocked_ioctl операции для /dev/random файла (и это на самом деле реализован таким образом, увидеть функцию random_ioctl).

Для определенных типов файлов IOCTL команд можно назвать операцию .unlocked_ioctl файла непосредственно:

// Open file 
struct file* f = filp_open("/dev/random", O_WRONLY, 0); 
// Replace user space with kernel space 
mm_segment_t old_fs = get_fs(); 
set_fs(KERNEL_DS); 

f->f_op->unlocked_ioctl(f, RNDADDENTROPY, entropy); 

// Restore space 
set_fs(old_fs); 

// Close file 
filp_close(f, 0); 
+0

Спасибо за ответы. Из любопытства: Что произойдет, если «/ dev/random» под другим именем? Есть ли способ обойти вызов ioctl и добавить данные в энтропийный пул? Я проверил 'random.c', но функция' write_pool' не экспортируется. – insumity

+0

Есть некоторые экспортированные функции из этого файла, такие как [add_device_randomness] (http://lxr.free-electrons.com/source/drivers/char/random.c#L759). Вероятно, вы найдете некоторые из них полезными для ваших целей. Что касается 'write_pool', это называется косвенно при вводе в файл. – Tsyvarev

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

  • Нет связанных вопросов^_^