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