Assembly 加载字符数组的SYSENTER

Assembly 加载字符数组的SYSENTER,assembly,linux-kernel,64-bit,32bit-64bit,system-calls,Assembly,Linux Kernel,64 Bit,32bit 64bit,System Calls,我试图加载一个字符数组地址作为系统调用参数,原型应该是 asmlinkage long sys_mknod(const char __user *filename, int mode, unsigned dev); 因此,我编写了以下代码: char filepath[] = "/usr/whatever/filepath"; mode_t mode = ... dev_t dev = ... .. .. asm volatile(" movq $133, %rax "

我试图加载一个字符数组地址作为系统调用参数,原型应该是

asmlinkage long sys_mknod(const char __user *filename, int mode, unsigned dev);
因此,我编写了以下代码:

char filepath[] = "/usr/whatever/filepath";
mode_t mode = ...
dev_t dev = ...
..
..

asm volatile("     movq    $133, %rax     "); // System call number (64 bit)
asm volatile ("    leaq    path(%rip), %rdi     ");
asm volatile("     movq    mode, %rsi     "); 
asm volatile("     movq    dev, %rdx     ");
asm volatile(" syscall ");
我不太习惯AT&T语法,也不太习惯64位编程,我认为地址加载是正确的,但代码不断破坏整个系统

有什么问题吗?

您是否重新实现了
sys\u mknod()
,也就是说,您自己进行了任何内核更改?
如果没有,报告错误;您在userland中所做的任何事情都不应该能够使内核崩溃,如果上述指令序列能够在标准的未修改/非特殊内核上实现这一点,那么这就是一个bug

否则,您的内核端代码就是有缺陷的——很可能只是忽略了一个事实,即传递的用户空间地址在内核模式下无效。直接访问此地址将导致内核崩溃。

如果您想访问那里的字符串,请使用
strndup\u user()
strncpy\u from\u user()
将数据传输到内核空间。

我想您是对的,如果您想保持内核模式,需要重新实现user->kernel模式之间的转换