2012-03-17 31 views
0

我想加載一個字符數組地址作爲系統調用參數,它的原型應該是SYSENTER與字符數組裝載

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 "); 

我m不是很習慣AT語法,也不是64位編程,我認爲地址加載是正確的,但代碼不斷崩潰整個系統。

它有什麼問題?

回答

1

你是重新實現sys_mknod(),即做任何你自己的內核改變?
如果不是,報告一個錯誤;你在用戶空間中所做的任何事情都不應該使內核崩潰,並且如果上述指令序列可以在標準的未修改/非特定內核上這樣做,那麼這就是一個錯誤。

否則,你的內核端代碼是越野車 - 最有可能只是缺少事實,即得到通過用戶空間地址在內核模式下無效。直接訪問這個地址會導致內核崩潰。
如果您想訪問該字符串,請使用strndup_user()strncpy_from_user()將數據傳輸到內核空間。

+0

我想你是對的,如果你想保持在內核模式下,有很多工作可以重新實現用戶 - >內核模式之間的轉換 – paulAl 2012-03-19 18:01:11