SYSENTER с загрузкой массива символов - PullRequest
0 голосов
/ 17 марта 2012

Я пытаюсь загрузить адрес массива 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 ");

I'mЯ не очень привык к синтаксису AT & T и 64-битному программированию, я думаю, что загрузка адреса правильная, но код продолжает сбивать всю систему.

Что с ним не так?

1 Ответ

1 голос
/ 19 марта 2012

Вы повторно реализуете sys_mknod(), то есть вносите какие-либо изменения в свое собственное ядро?
Если нет, сообщите об ошибке;ничто из того, что вы делаете в пользовательской среде, не должно приводить к сбою ядра, и если приведенная выше последовательность команд может это сделать на стандартном неизмененном / нестандартном ядре, то это ошибка.

В противном случае ваш код на стороне ядра содержит ошибки -скорее всего, просто отсутствует тот факт, что адрес пользовательского пространства , который был передан, является недопустимым в режиме ядра .Прямой доступ к этому адресу вызовет сбой ядра.
Если вы хотите получить доступ к этой строке, используйте strndup_user() или strncpy_from_user() для передачи данных в пространство ядра.

...