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

发布于 2024-11-18 09:02:15 字数 331 浏览 2 评论 0原文

好的,我刚刚读完 FreeBSD 的 Kill(2) 的实现,并尝试编写我自己的“kill”。此系统调用采用 uidsignum 并将信号发送到 uid 拥有的进程(不包括调用进程)。

如何将 uid 传递给系统调用?在kill(2)中,pid位于参数structkill_args中。是否有一个包含 uid 的结构,就像 structkill_args 包含 pid 一样?如果没有,我可以在内核之外定义一个结构吗?

OK, so I just finish reading the implementation of kill(2) of FreeBSD, and am trying to write my own "kill". This system call takes uid and signum and sends the signal to processes owned by uid, excluding the calling process.

How can I pass uid to the system call? In kill(2), pid is in argument struct kill_args. Is there a structure that contains uid the way that struct kill_args contains pid? If not, can I define a structure outside the kernel?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

缪败 2024-11-25 09:02:15

这很简单,但是是一个复杂的过程。这是一个安装系统调用的模块。

包括一堆东西

#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

It's easy, but kind of an involved process. Here's a module that installs a system call.

Include a bunch of stuff

#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>

Define your structure to hold arguments

struct mykill_args {
    int pid;
    int signo;
};

Define a handling function

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;
}

You need a sysent object

static struct sysent mykill_sysent = {
    2,          /* number of arguments */
    mykill      /* function handling system call */
};

And an offset at which the system call will be installed.

/* Choose "the next" value later. */
static int offset = NO_SYSCALL;

load function

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;
}

Install the system call

SYSCALL_MODULE(mykill, &offset, &mykill_sysent, load, NULL);

You can run your system call using syscall(2). Or using perl :)). Here's an example

[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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文