我一直在尝试在raspberry的内核中编写一个新的系统调用(称为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 / include / asm / unistd.h:我把syscall表的新原始文件放在哪里:
#define __NR_sys_defclose (__NR_SYSCALL_BASE+380)
-arch / arm / kernel / calls.S:我把它放在哪里:
CALL(sys_defclose)
-i把sys_defclose的源码放在arch / arm / kernel中,我用新行修改了同一目录下的makefile
obj-y +=sys_defclose.o
内核版本是raspberrypi的3.6。 谁能解释一下如何解决这个错误? 谢谢 这是我的系统调用
的实现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);
}
答案 0 :(得分:1)
您应该使用SYSCALL_DEFINE*
来定义系统调用(我认为,这一步你做错了),然后将你的系统调用添加到sys_call_table
,这是与架构相关的(arch / arm / kernel / calls)。 S代表手臂。)
将您的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);
}