1 /* 2 * 2015 by Marek Behun <kabel@blackhole.sk> 3 * Only for Linux x86_64 4 * gcc -nostdlib -nostdinc -o sys sys.c 5 */ 6 7 /* nadefinujeme si typy size_t a ssize_t */ 8 typedef unsigned long int size_t; 9 typedef long int ssize_t; 10 11 /* toto bude funkcia na pristup do kernelu */ 12 long (*syscall) (long int, ...); 13 14 void init_syscall (void) 15 { 16 /* a tu je jej kod, skompilovany assembler pre x86_64 pre Linux */ 17 static const char syscall_code[] = { 18 0x48, 0x89, 0xf8, // mov %rdi, %rax 19 0x48, 0x89, 0xf7, // mov %rsi, %rdi 20 0x48, 0x89, 0xd6, // mov %rdx, %rsi 21 0x48, 0x89, 0xca, // mov %rcx, %rdx 22 0x4d, 0x89, 0xc2, // mov %r8, %r10 23 0x4d, 0x89, 0xc8, // mov %r9, %r8 24 0x4c, 0x8b, 0x4c, 0x24, 0x08, // mov 0x8(%rsp), %r9 25 0x0f, 0x05, // syscall 26 0xc3, // retq 27 }; 28 29 /* nastavime, aby pointer syscall ukazoval na zaciatok kodu */ 30 syscall = (void *) &syscall_code[0]; 31 } 32 33 ssize_t sys_read (int fd, void * buf, size_t count) 34 { 35 return syscall (0, fd, buf, count); 36 } 37 38 ssize_t sys_write (int fd, void * buf, size_t count) 39 { 40 return syscall (1, fd, buf, count); 41 } 42 43 void sys_exit (int status) 44 { 45 syscall (60, status); 46 } 47 48 void _start (int argc, char ** argv, char ** envp) 49 { 50 init_syscall (); 51 52 sys_write (1, "abc\n", 4); 53 54 sys_exit (0); 55 }