带有char数组加载的SYSENTER

时间:2012-03-17 14:58:02

标签: assembly linux-kernel 64-bit 32bit-64bit system-calls

我正在尝试加载一个char数组地址作为系统调用参数,原型应该是

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位编程,我认为地址加载是正确的,但是代码不断崩溃整个系统。

它出了什么问题?

1 个答案:

答案 0 :(得分:1)

您是否重新实现 sys_mknod(),即自行更改内核?
如果没有,报告错误;你在userland中做的任何事情都不应该使内核崩溃,如果上面的指令序列可以在标准的未修改/非特殊内核上执行,那么这就是一个错误。

否则,您的内核端代码有问题 - 很可能只是错过了传递的用户空间地址 在内核模式中无效的事实。直接访问此地址将导致内核崩溃 如果要访问该字符串,请使用strndup_user()strncpy_from_user()将数据传输到内核空间。