gpt4 book ai didi

freebsd - 关于在 FreeBSD 中编写我自己的系统调用的问题

转载 作者:行者123 更新时间:2023-12-04 23:30:03 35 4
gpt4 key购买 nike

好的,所以我刚刚读完 FreeBSD 的 kill(2) 的实现,并且正在尝试编写我自己的“kill”。这个系统调用需要 uidsignum并将信号发送到 uid 拥有的进程,不包括调用进程。

我怎样才能通过uid到系统调用?在 kill(2) 中,pid在参数中 struct kill_args .是否存在包含 uid 的结构? struct kill_args 的方式包含 pid ?如果没有,我可以在内核之外定义一个结构吗?

最佳答案

这很容易,但有点复杂。这是一个安装系统调用的模块。

包括一堆东西

#include <sys/types.h>
#include <sys/param.h>
#include <sys/proc.h>
#include <sys/module.h>
#include <sys/sysent.h>
#include <sys/kernel.h>
#include <sys/systm.h>
#include <sys/sysproto.h>

定义你的结构来保存参数
struct mykill_args {
int pid;
int signo;
};

定义处理函数
static int
mykill(struct thread *td, void *args)
{
struct mykill_args *uap = args;

uprintf("mykill called. pid=%d, signo=%d\n", uap->pid, uap->signo);

return 0;
}

你需要一个 sysent 对象
static struct sysent mykill_sysent = {
2, /* number of arguments */
mykill /* function handling system call */
};

以及将安装系统调用的偏移量。
/* Choose "the next" value later. */
static int offset = NO_SYSCALL;
load功能
static int
load(struct module *module, int cmd, void *arg)
{
int error = 0;

switch (cmd) {
case MOD_LOAD:
uprintf("Loading module. Installing syscall at"
" offset %d\n", offset);
break;
case MOD_UNLOAD:
uprintf("Unloading module. syscall uninstalled from"
" offset %d\n", offset);
break;
default:
error = EOPNOTSUPP;
break;
}

return error;
}

安装系统调用
SYSCALL_MODULE(mykill, &offset, &mykill_sysent, load, NULL);

您可以使用 syscall(2) 运行系统调用.或使用 perl :))。这是一个例子
[root@aiur /home/cnicutar/kld-syscall]# kldload ./mykill.ko
Loading module. Installing syscall at offset 210

[cnicutar@aiur ~/kld-syscall]$ perl -e 'syscall(210, 30, 15);'
mykill called. pid=30, signo=15

关于freebsd - 关于在 FreeBSD 中编写我自己的系统调用的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6542650/

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