正在讀恐龍本(OS聖經),第2章的程式設計作業就是自己弄個system call。
不過恐龍本用的kernel版本很舊(2.x),實在沒法照做。
所以上網找了一個範例,用Raspberry pi來做。
使用kernel版本:linux-rpi-3.19.y
###1. 在 kernel 目錄下建立 helloworld.c, helloworld.h
#include <linux/linkage.h>
#include <linux/kernel.h>
#include <linux/random.h>
#include "helloworld.h"
asmlinkage long sys_helloworld()
{
printk(KERN_EMERG "hello world!");
return get_random_int() * 4;
}
#ifndef HELLO_WORLD_H
#define HELLO_WORLD_H
asmlinkage long sys_helloworld(void);
#endif
###2. 修改 arch/arm/kernel/calls.S
CALL(sys_helloworld)
###3. 修改 arch/arm/include/uapi/asm/unistd.h
#define __NR_helloworld (__NR_SYSCALL_BASE+388)
###4. 修改 arch/arm/include/asm/unistd.h
#define __NR_syscalls (392)
###5. Test file : test.c
#include <linux/unistd.h>
#include <stdio.h>
#include <sys/syscall.h>
int main(int argc, char* argv[])
{
int i = atoi(argv[1]);
int j = -1;
printf("invocing kernel function %i\n", i);
j = syscall(i); /* 350 is our system calls offset number */
printf("invoked. Return is %i. Bye.\n", j);
return 0;
}
###6. compile後執行:
gcc test.c -o test
./test 388
##參考資料:
http://stackoverflow.com/questions/21554267/extending-the-rasbian-kernel-linux-kernel-3-10-28-for-arm-raspberry-pi-how