gpt4 book ai didi

c - 编写新的系统调用

转载 作者:行者123 更新时间:2023-11-30 15:47:04 25 4
gpt4 key购买 nike

我一直在尝试在树莓派的内核中编写一个新的系统调用(称为 sys_defclose),但是在编译时出现此错误:

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

我修改了以下文件:

-include/linux/syscalls.h:我放置系统调用原型(prototype)的位置

-arch/arm/include/asm/unistd.h:我放置系统调用表的新原始数据的位置:

       #define __NR_sys_defclose    (__NR_SYSCALL_BASE+380)

-arch/arm/kernel/calls.S:我放置的位置:

       CALL(sys_defclose)

-我将 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);
}

最佳答案

你应该使用SYSCALL_DEFINE*来定义系统调用(我认为,这一步你做错了),然后将你的系统调用添加到sys_call_table中,这是依赖于体系结构的(架构/arm/kernel/calls.S 代表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);
}

关于c - 编写新的系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17751216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com