====== Adding a new Kernel Call in MINIX ====== //(Working Draft)// This tutorial helps you to add a new kernel call in MINIX. Let's say your new kernel call is called //sample//. - Add the prototype of your kernel function do_sample() in the file: ///usr/src/kernel/system.h// ... int do_sample(struct proc *caller, message *m_ptr); #endif /* SYSTEM_H */ - Write the implementation of do_sample() in its own source file: ///usr/src/kernel/system/do_sample.c// #include "kernel/system.h" #include /*===========================================================================* * do_sample * *===========================================================================*/ int do_sample(struct proc *caller_ptr, message *m_ptr) { return(OK); } - Add do_sample.c to the Makefile for compilation: ///usr/src/kernel/system/Makefile.inc// # Makefile for system library implementation .include .PATH: ${.CURDIR}/system SRCS+= \ do_fork.c \ do_exec.c \ ... do_statectl.c \ do_sample.c - Map SYS_SAMPLE to do_sample() in the system call table: ///usr/src/kernel/system.c// ... map(SYS_STATECTL, do_statectl); /* let a process control its state */ map(SYS_SAMPLE, do_sample); /* your kernel call */ ... - Add a prototype for the sys_sample function in the file: ///usr/src/include/minix/syslib.h// ... int sys_sample(unsigned flags, endpoint_t proc_ep); ... - Add the call number for sys_sample to the call vector and increment its dimension: ///usr/src/include/minix/com.h// ... # define SYS_SAFEMEMSET (KERNEL_CALL + 56) /* sys_statectl() */ # define SYS_SAMPLE (KERNEL_CALL + 57) /* sys_sample() */ /* Total */ #define NR_SYS_CALLS 58 /* number of kernel calls */ ... - Add the SAMPLE service to the system tab: ///usr/src/commands/service/parse.c//; build the updated system tab and install it with //make; make install// from ///usr/src/commands/service/// ... struct { char *label; int call_nr; } system_tab[]= { ... { "MEMSET", SYS_MEMSET }, { NULL, 0 } }; ... - Write your implementation of the function sys_sample in a new file: ///usr/src/lib/libsys/sys_sample.c// #include "syslib.h" int sys_sample(unsigned flags, endpoint_t proc_ep) { message m; return(_kernel_call(SYS_SAMPLE, &m)); } - Add sys_sample.c to the ///usr/src/lib/libsys/Makefile//, and install it in ///usr/lib/${MACHINE_ARCH}// with //make install//. # Makefile for libsys LIB= sys SRCS= \ ... sys_sample.c \ ... - Test the new kernel call with a [[.:driverprogramming|hello driver]] in ///usr/src/drivers/sample_test//. - Rebuild the kernel and install it with //make; make install// from ///usr/src/tools//.