2015年6月5日 星期五

在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

參考資料:
http://stackoverflow.com/questions/21554267/extending-the-rasbian-kernel-linux-kernel-3-10-28-for-arm-raspberry-pi-how
 
 
 

沒有留言:

張貼留言

Google Code Prettify