nyt systemkald i linux (200 point)
Hvordan laves en header-fil, så jeg ikke behøver at skrive _syscall2(...) i selve testprogrammet testafkald.c?På siden http://fossil.wpi.edu/docs/howto_add_systemcall.html har jeg fundet en vejlieding til at gøre dette. (Se den)
Jeg har således lavet følgende:
I filen linux/arch/i386/kernel/entry.S har jeg tilføjet:
.long SYMBOL_NAME(sys_pedagogictime) /* 191 */
I filen linux/include/asm/unistd.h har jeg tilføjet:
#define __NR_pedagogictime 191
Jeg har lavet ny fil linux/include/linux/pedagogictime.h:
#ifndef __LINUX_PEDAGOGICTIME_H
#define __LINUX_PEDAGOGICTIME_H
#include <linux/unistd.h>
#include <linux/linkage.h>
_syscall2(int, pedagogictime, int, arg1, int, arg2);
#endif
Jeg har lavet ny fil linux/kernel/pedagogictime.c:
#include <linux/pedagogictime.h>
#include <linux/kernel.h>
asmlinkage int sys_pedagogictime (int arg1, int arg2)
{
printk("HELLO WORD!\n");
return(1);
}
Jeg har i filen linux/kernel/Makefile tilføjet pedagogictime.o det rigtige sted:
O_OBJS = ... pedagogictime.o
Jeg kunne så uden problemer kompelere linux-kernen med:
make clean
make dep
make
make bzImage
Jeg fik så lavet et fungerende (!!!) testprogram testafkald.c i c, som kunne compeleres med gcc:
#include <linux/unistd.h>
#include <linux/kernel.h> // ikke sikker skal bruges
#include <sys/time.h> // ikke sikker skal bruges
void main( ){
_syscall2(int, pedagogictime, int, arg1, int, arg2);
pedagogictime(1,1);
pedagogictime(0,0);
}
Jeg fik følgende output:
HELLO WORD!
HELLO WORD!
Men det var jo IKKE mening, at _syscall2(...) skull være i denne fil. Så jeg ændrede testafkald.c til:
#include <linux/unistd.h>
#include <linux/pedagogictime.h>
#include <linux/kernel.h> // ikke sikker skal bruges
#include <sys/time.h> // ikke sikker skal bruges
void main(){
pedagogictime(1,1);
pedagogictime(0,0);
}
Jeg fik en fejl om at linux/pedagogictime.h ikke kunne findes. Den samme fejl fik jeg med <pedagogictime.h> i stedet for <linux/pedagogictime.h>. Hvis jeg ikke skrev <...pedagogictime.c> fik jeg en fejl om at kaldet pedagogictime ikke kunne genkendes.
Hvad gør jeg galt???
