384 i386 mycall sys_mycall
asmlinkage long sys_mycall(void);
#include <linux/unistd.h> #include <linux/linkage.h> asmlinkage long sys_mycall(void) { return(4096); }
obj-y += mycall.o
$ make -j 5 ARCH=i386
/* * Teste da nova chamada de sistema */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { int r = syscall(384); printf("Retorno da chamada de sistema: %d.\n", r); return r; }
$ qemu-system-i386 -hda ArchLinux_mc504.cow -kernel linux-4.11.3/arch/i386/boot/bzImage -append "rw root=/dev/hda" -drive format=raw,file=ex-mycall.c
Após logar no sistema, devemos executar os comandos
abaixo. O gcc irá ignorar os caracteres nulos adicionados no
processo.
Após logar no sistema, devemos executar:
$ cat /dev/hdb > ex-mycall.c
$ gcc ex-mycall.c -o ex-mycall
$ ./ex-mycall
$ dd if=/dev/zero of=ext2.dmp bs=1k count=100
$ mkfs.ext2 ext2.dmp
$ debugfs -w ext2.dmp
debugfs: write ex-mycall.c ex-mycall.c
debugfs: quit
$ qemu-system-i386 -hda ArchLinux_mc504.cow -kernel linux-4.11.3/arch/i386/boot/bzImage -append "rw root=/dev/hda" -drive format=raw,file=ext2.dmp
$ mkdir mnt
$ mount -t ext2 /dev/hdb mnt
$ cd mnt
$ gcc ex-mycall.c -o ex-mycall
$ ./ex-mycall