在Raspberry pi 上建立自己的system call
正在讀恐龍本(OS聖經),第2章的程式設計作業就是自己弄個system call。
不過恐龍本用的kernel版本很舊(2.x),實在沒法照做。
所以上網找了一個範例,用Raspberry pi來做。
使用kernel版本:linux-rpi-3.19.y
1. 在 kernel 目錄下建立 helloworld.c, helloworld.h
- helloworld.c
#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;
}
- helloworld.h
#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