Я пытаюсь вызвать системный вызов из модуля ядра, у меня есть этот код:системный вызов Linux из ядра сбою (странно офсет)
set_fs(get_ds()); // lets our module do the system-calls
// Save everything before systemcalling
asm (" push %rax ");
asm (" push %rdi ");
asm (" push %rcx ");
asm (" push %rsi ");
asm (" push %rdx ");
asm (" push %r10 ");
asm (" push %r8 ");
asm (" push %r9 ");
asm (" push %r11 ");
asm (" push %r12 ");
asm (" push %r15 ");
asm (" push %rbp ");
asm (" push %rbx ");
// Invoke the long sys_mknod(const char __user *filename, int mode, unsigned dev);
asm volatile (" movq $133, %rax "); // system call number
asm volatile (" lea path(%rip), %rdi "); // path is char path[] = ".."
asm volatile (" movq mode, %rsi "); // mode is S_IFCHR | ...
asm volatile (" movq dev, %rdx "); // dev is 70 >> 8
asm volatile (" syscall ");
// POP EVERYTHING
asm (" pop %rbx ");
asm (" pop %rbp ");
asm (" pop %r15 ");
asm (" pop %r12 ");
asm (" pop %r11 ");
asm (" pop %r9 ");
asm (" pop %r8 ");
asm (" pop %r10 ");
asm (" pop %rdx ");
asm (" pop %rsi ");
asm (" pop %rcx ");
asm (" pop %rdi ");
asm (" pop %rax ");
set_fs(savedFS); // restore the former address-limit value
Этот код не работает, и сбой системы вниз (это модуль ядра).
Свалка этого куска кода с переездом Infos является:
2c: 50 push %rax
2d: 57 push %rdi
2e: 51 push %rcx
2f: 56 push %rsi
30: 52 push %rdx
31: 41 52 push %r10
33: 41 50 push %r8
35: 41 51 push %r9
37: 41 53 push %r11
39: 41 54 push %r12
3b: 41 57 push %r15
3d: 55 push %rbp
3e: 53 push %rbx
3f: 48 c7 c0 85 00 00 00 mov $0x85,%rax
46: 48 8d 3d 00 00 00 00 lea 0x0(%rip),%rdi # 4d <init_module+0x4d>
49: R_X86_64_PC32 path-0x4
4d: 48 83 c7 04 add $0x4,%rdi
51: 48 8b 34 25 00 00 00 mov 0x0,%rsi
58: 00
55: R_X86_64_32S mode
59: 48 8b 14 25 00 00 00 mov 0x0,%rdx
60: 00
5d: R_X86_64_32S dev
61: 0f 05 syscall
63: 5b pop %rbx
64: 5d pop %rbp
65: 41 5f pop %r15
67: 41 5c pop %r12
69: 41 5b pop %r11
6b: 41 59 pop %r9
6d: 41 58 pop %r8
6f: 41 5a pop %r10
71: 5a pop %rdx
72: 5e pop %rsi
73: 59 pop %rcx
74: 5f pop %rdi
75: 58 pop %rax
Я интересно .. почему есть -0x4 смещение в 49: R_X86_64_PC32 путь-0x4?
Я имею в виду: режим и dev должны быть решены автоматически без проблем, но как насчет пути? Почему -0x4 смещение?
Я пытался "компенсировать это" с
LEA 0x0 (% плагиат),% RDI // это как-то добавляет -0x4 смещение добавить $ 0x4,% RDI ....
но код все еще разбился.
Где я ошибаюсь?
Вы не можете вызвать системный вызов изнутри ядра. Ядро предоставляет системные вызовы приложениям. Что вы действительно хотите сделать? Не можете ли вы избежать работы на земле ядра? –
Вот почему я положил set_fs (get_ds()); что должно увеличить предел сегмента, который может вызывать системные вызовы. Это упражнение для экзамена (http://cs.usfca.edu/~cruse/cs635/), поэтому мне нужно выяснить, как это сделать с помощью amd64 – paulAl
Из комментария вызова вызова 'syscall':' rcx return address for syscall/sysret, C arg3'. –