2013-09-23 5 views
1

Я пишу загружаемый модуль ядра (LKM). Для этого LKM необходимо выполнить некоторые специальные действия, если пользователь, который только что выполнил cat/proc /, является текущим пользователем. поэтому я пытаюсь выяснить, как найти эту информацию. Моя первая попытка состояла в том, чтобы использовать get_current_user(), как определено в cred.h. но это не работает. http://lxr.linux.no/linux+*/include/linux/cred.h#L290 Я не ищу другие пути, это то, что я нашел, никто не похож на работу How to get userID when writing Linux kernel module How do I call Linux syscall from kernel space?Как получить текущего пользователя в ядре, то есть как вызвать current-> uid правильным способом

функции в вопросе:

static int getuid() 
{ 
return get_current_user()->uid; 
} 

НКА выход:

make -C /lib/modules/2.6.32-358.11.1.el6.x86_64/build M=/root/git_prj1 modules 
make[1]: Entering directory `/usr/src/kernels/2.6.32-358.11.1.el6.x86_64' 
    CC [M] /root/git_prj1/proc_setup.o 
/root/git_prj1/proc_setup.c:37: warning: function declaration isn���t a prototype 
/root/git_prj1/proc_setup.c: In function ���getuid���: 
/root/git_prj1/proc_setup.c:39: error: dereferencing pointer to incomplete type 
/root/git_prj1/proc_setup.c:39: error: implicit declaration of function ���get_uid��� 
/root/git_prj1/proc_setup.c:39: warning: assignment makes pointer from integer without a cast 
/root/git_prj1/proc_setup.c:39: warning: return makes integer from pointer without a cast 
/root/git_prj1/proc_setup.c: In function ���read_key���: 
/root/git_prj1/proc_setup.c:52: warning: format ���%s��� expects type ���char *���, but argument 4 has type ���int��� 
make[2]: *** [/root/git_prj1/proc_setup.o] Error 1 
make[1]: *** [_module_/root/git_prj1] Error 2 
make[1]: Leaving directory `/usr/src/kernels/2.6.32-358.11.1.el6.x86_64' 
make: *** [all] Error 2 
+0

Что означает «не работает»? – tangrs

+0

не компилирует – user1881587

+0

Ну, покажите нам свой код и покажите нам, какие ошибки вы получаете. – tangrs

ответ

6

Так как я могу» я вижу полный источник вашего кода, я не могу точно сказать, что не так.

Однако я написал краткую демонстрационную версию и сумел заставить ее работать довольно легко. Я подозреваю, что вы просто пропустили заголовок в любом коде, который у вас был.

[email protected]:~/test_module$ cat test.c 
#include <linux/module.h> 
#include <linux/init.h> 
#include <linux/kernel.h> 
#include <linux/sched.h> 
#include <linux/cred.h> 

static int test_init(void) 
{ 
    printk(KERN_INFO "Current UID = %u\n", 
     get_current_user()->uid); 

    return 0; 
} 

static void test_exit(void) 
{ 
} 

module_init(test_init); 
module_exit(test_exit); 
[email protected]:~/test_module$ make 
make -C /lib/modules/3.5.0-17-generic/build M=/home/danieltang/test_module modules 
make[1]: Entering directory `/usr/src/linux-headers-3.5.0-17-generic' 
Building with KERNELRELEASE = 3.5.0-17-generic 
    Building modules, stage 2. 
Building with KERNELRELEASE = 3.5.0-17-generic 
    MODPOST 1 modules 
make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-17-generic' 
[email protected]:~/test_module$ sudo insmod test.ko 
[email protected]:~/test_module$ dmesg | tail -n1 
[ 3705.237507] Current UID = 0 
[email protected]:~/test_module$ 
+0

У меня не было init.h или sched.h. Кажется, теперь работает – user1881587

+0

1. Это было sched.h. 2. Начиная с v3.5 [это] (https://github.com/torvalds/linux/commit/7a4e7408c5cadb240e068a662251754a562355e3) get_current_user() -> uid.val вместо get_current_user() -> uid. – starius

0

В вашей функции вы возвращаете get_current_user() -> uid как тип возврата int. но на самом деле это неподписанный тип int, возможно, это вызывает проблему.