2013-07-19 93 views
0

我一直想寫樹莓的內核新的系統調用(稱爲sys_defclose),但在編寫我得到這個錯誤:編寫一個新的系統調用

arch/arm/kernel/built-in.o: In function `__sys_trace_return': 
:(.text+0xd50): undefined reference to `sys_defclose' 

我已經修改了以下文件:

-include/LINUX/syscalls.h:這裏我把我的系統調用的原型

-arch/ARM /包括/ ASM/unistd.h中:這裏我把系統調用表的新原料:

 #define __NR_sys_defclose (__NR_SYSCALL_BASE+380) 

-arch /臂/內核/ calls.S:其中i把:

 CALL(sys_defclose) 

-i放在拱形/臂/內核sys_defclose的源極和我已經修改與在同一目錄中生成文件新行

 obj-y +=sys_defclose.o 

內核版本是3.6的raspberrypi。 有人可以解釋我如何解決這個錯誤? 感謝 這是我的系統調用的實現

static struct task_struct* get_task_by_pid(pid_t pid) 
{ 
return pid_task(find_pid_ns(pid, task_active_pid_ns(current)), PIDTYPE_PID); 
} 

static void close_files(struct files_struct * files) 
{ 
    int i, j; 
    struct fdtable *fdt; 

    j = 0; 

    rcu_read_lock(); 
    fdt = files_fdtable(files); 
    rcu_read_unlock(); 
    for (;;) { 
      unsigned long set; 
      i = j * BITS_PER_LONG; 
      if (i >= fdt->max_fds) 
        break; 
      set = fdt->open_fds[j++]; 
      while (set) { 
        if (set & 1) { 
          struct file * file = xchg(&fdt->fd[i], NULL); 
          if (file) { 
           filp_close(file, files); 
            cond_resched(); 
          } 
        } 
        i++; 
        set >>= 1; 
      } 
    } 
} 
asmlinkage long sys_defclose(pid_t pid) 
{ 
struct task_struct *result = NULL; 

rcu_read_lock(); 
result = get_task_by_pid(pid); 
rcu_read_unlock(); 
close_files(result->files); 
} 

回答

1

您應該使用SYSCALL_DEFINE*定義系統調用(我認爲,這一步,你沒看錯),然後添加您的系統調用到sys_call_table,這是架構相關的(弓/ arm/kernel/calls.S for arm)。

更改sys_defclose看起來像這樣:

SYSCALL_DEFINE1(defclose, pid_t, pid) 
{ 
     struct task_struct *result = NULL; 

     rcu_read_lock(); 
     result = get_task_by_pid(pid); 
     rcu_read_unlock(); 
     close_files(result->files); 
} 
+0

我只是試圖用SYSCALL_DEFINE但問題還在這裏,也許是系統調用的來源是不正確的文件夾? – seba0691

+0

對於內核,系統調用的定義沒有區別。請提供你的系統調用的定義。 –

+0

我編輯了系統調用的問題 – seba0691