【问题标题】:Question about writing my own system call in FreeBSD关于在 FreeBSD 中编写我自己的系统调用的问题
【发布时间】:2011-09-26 10:12:03
【问题描述】:

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

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

【问题讨论】:

    标签: freebsd kernel system-calls


    【解决方案1】:

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

    包括一堆东西

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

    你需要一个系统对象

    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
    

    【讨论】:

      猜你喜欢
      • 2015-01-09
      • 2011-11-19
      • 1970-01-01
      • 2011-12-21
      • 2017-07-27
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 2020-08-28
      相关资源
      最近更新 更多