我正在尝试加载一个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位编程,我认为地址加载是正确的,但是代码不断崩溃整个系统。
它出了什么问题?
答案 0 :(得分:1)
您是否重新实现 sys_mknod()
,即自行更改内核?
如果没有,报告错误;你在userland中做的任何事情都不应该使内核崩溃,如果上面的指令序列可以在标准的未修改/非特殊内核上执行,那么这就是一个错误。
否则,您的内核端代码有问题 - 很可能只是错过了传递的用户空间地址 在内核模式中无效的事实。直接访问此地址将导致内核崩溃
如果要访问该字符串,请使用strndup_user()
或strncpy_from_user()
将数据传输到内核空间。