Kernel 在内核中复制数据
我想使用copystr将字符串复制到本地缓冲区中,但在这样做时遇到了问题。我要复制的字符串是/usr/src/sys/kern/VFS\u syscalls.c中VFS函数sys\u chdir的uap->path。以下是我尝试过的一件事:Kernel 在内核中复制数据,kernel,bsd,Kernel,Bsd,我想使用copystr将字符串复制到本地缓冲区中,但在这样做时遇到了问题。我要复制的字符串是/usr/src/sys/kern/VFS\u syscalls.c中VFS函数sys\u chdir的uap->path。以下是我尝试过的一件事: #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, &
#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手册页中的数据类型,所以我认为不是这样。感谢您的帮助。谢谢。上面写着:
copystr函数复制以NUL结尾的字符串,最多为len
字节长,从内核空间地址kfaddr到内核空间地址
kdaddr
但看起来您正试图从用户空间进行复制。那样的话,我想你是在找copyin或copyinstr