SYSTEM PROGRAMMING
Adding a System Call to the Linux Kernel
In 2 Easy Steps
In this blog, we will see how to add a system call to the Linux kernel in two steps. This tutorial assumes you already know how to build and install the Linux kernel. If not, please refer to this article: Build the Latest Linux Kernel.
1. Add and Entry in the Table
The first thing to do is to add an entry to the system call table found in arch/x86/entry/syscalls/syscall_64.tbl
for x86_64
artchitecture. There should be a similar file for other architectures. Find an empty slot and add your entry. In my case I added the following entry:
462 common hello_world sys_hello_world
2. Add the System Call Definition
Our system call will do the simple task of multiplying the argument by 2 and return it. Here’s its definition:
SYSCALL_DEFINE1(hello_world, int, number)
{
printk(KERN_INFO "Hello World %d", number);
return number << 1; /* using the shift operator to multiply by 2 */
}
Add the definition somewhere in the Linux kernel. For this example we will add it to fs/exec.c
next to theexecve
system call.
Now you can build and install the new kernel.
3. Testing Using a Userspace Program:
To test our system call we need to create a user program that will call it. The user program needs 2 parameters: the system call number and the argument number.
#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main()
{
long int amma = syscall(462, 42); //syscall 462 with argument 42
printf(“System call sys_hello_world returned %ld\n”, amma);
return 0;
}
Compiling the program with the following command:
gcc syscall.c -o syscall
This will give the following result:
The system call does return the double of 42 which is 84. And we can see using dmesg
(a command that print kernel messages) that the kernel does print the hello world message in addition to the argument number 42.