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.
$ 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
Após logar no sistema, devemos executar:
$ mkdir mnt $ mount -t ext2 /dev/hdb mnt $ cd mnt $ gcc ex-mycall.c -o ex-mycall $ ./ex-mycall