Копирование данных в ядре

Я хочу скопировать строку в локальный буфер с помощью функции copystr(), но у меня возникли проблемы с этим. Я хочу скопировать строку uap->path из функции VFS sys_chdir в /usr/src/sys/kern/vfs_syscalls.c. Вот одна из вещей, которые я пробовал:

#define USR_MAX_LEN 22
char mypath[USR_MAX_LEN + 1];
size_t len = USR_MAX_LEN;
size_t done;

copystr(uap->path, mypath, len, &done);

К сожалению, когда я это делаю, я получаю панику ядра и последующий сбой. Он всегда падает в copystr():

(kgdb) list *0xffffffff80c8c860
0xffffffff80c8c860 is at /usr/src/sys/amd64/amd64/support.S:606.
601             cld
602     1:
603             decq    %rdx
604             jz      4f
605             lodsb
606             stosb
607             orb     %al,%al
608             jnz     1b
609
610             /* Success -- 0 byte reached */
Current language:  auto; currently minimal
(kgdb) bt
#0  doadump (textdump=<value optimized out>) at pcpu.h:219
#1  0xffffffff808af530 in kern_reboot (howto=260) at /usr/src/sys/kern/kern_shutdown.c:447
#2  0xffffffff808af8f4 in panic (fmt=<value optimized out>) at /usr/src/sys/kern/kern_shutdown.c:754
#3  0xffffffff80c8e6d2 in trap_fatal (frame=<value optimized out>, eva=<value optimized out>)
at /usr/src/sys/amd64/amd64/trap.c:882
#4  0xffffffff80c8e9a9 in trap_pfault (frame=0xfffffe004e8ed9f0, usermode=0) at /usr/src/sys/amd64/amd64/trap.c:699
#5  0xffffffff80c8e136 in trap (frame=0xfffffe004e8ed9f0) at /usr/src/sys/amd64/amd64/trap.c:463
#6  0xffffffff80c753d2 in calltrap () at /usr/src/sys/amd64/amd64/exception.S:232
#7  0xffffffff80c8c860 in copystr () at /usr/src/sys/amd64/amd64/support.S:605
#8  0xffffffff80950e64 in sys_chdir (td=0xfffff80002782000, uap=0xfffffe004e8edb80) at /usr/src/sys/kern/vfs_syscalls.c:838
#9  0xffffffff80c8efc7 in amd64_syscall (td=0xfffff80002782000, traced=0) at subr_syscall.c:134
#10 0xffffffff80c756bb in Xfast_syscall () at /usr/src/sys/amd64/amd64/exception.S:391
#11 0x0000000800d1fc0a in ?? ()
Previous frame inner to this frame (corrupt stack?)
(kgdb) 

Что я здесь делаю неправильно? Насколько я могу судить, мои типы данных соответствуют типам из справочной страницы для copystr, поэтому я не думаю, что это так. Любая помощь приветствуется. Спасибо.


person user3606204    schedule 06.05.2014    source источник


Ответы (1)


справочная страница для copystr говорит:

Функция copystr() копирует строку, завершающуюся символом NUL, длиной не более len байт, с адреса kfaddr в пространстве ядра в адрес kdaddr в пространстве ядра.

Но похоже, что вы пытаетесь скопировать из пользовательского пространства. В таком случае, я думаю, вы ищете copyin или copyinstr.

person cnicutar    schedule 06.05.2014