3

ユーザー空間からカーネル空間に PID 値をコピーする方法を探しています。これが私のコード スナップです。

カーネル モジュール:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <asm/siginfo.h>
#include <linux/rcupdate.h>
#include <linux/sched.h>
#include <linux/uaccess.h>
#include <linux/signal.h>

MODULE_LICENSE ("GPL");

struct siginfo sinfo;
pid_t pid;
struct task_struct *task;

int init_module() 
{
    memset(&sinfo, 0, sizeof(struct siginfo));
    sinfo.si_signo = SIGIO;
    sinfo.si_code = SI_USER;
    pid = 5218; // Everytime a new PID 
    // task = find_task_by_vpid(pid); I am also working on new and old version of UBUNTU so thats why this is here
    task = pid_task(find_vpid(pid), PIDTYPE_PID); 
    printk("%d .\n", task);

    if(task == NULL) {
        printk("Cannot find PID from user program\r\n");
        return 0;
    }

    send_sig_info(SIGIO, &sinfo, task);
    return 0;
}
void cleanup_module () 
{
    printk(KERN_ALERT"\nGoodBye World\n\n");
}

ユーザー空間コード:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>

void signal_handler(int signum)
{
    if (signum == SIGIO) printf("SIGIO\r\n"); return;
}

int main()
{
    int i = 1;
    signal(SIGIO, signal_handler);
    printf("My PID is %d.\n", getpid());
    
    while (i);
    return 0;
}

ここで、私は常にユーザー空間プログラムを実行して PID を取得しており、カーネル モジュールの pid 変数を常に編集する必要があります。

ユーザー空間からカーネル空間へ、またはその逆に情報にアクセスする 1 つの方法を見つけました (つまり、 を使用copy_from/to_user())

しかし、ユーザー空間から PID を取得するためにそれらのいずれかを理解できません。/devディレクトリにファイルを作成する必要があり、PID を取得するために必要なすべての機能を適用する必要がありますか?

他に方法はありますか?そうでない場合は、誰でもこれを行うのを手伝ってもらえますか? 私はCプログラミングが初めてで、カーネルモジュールを直接操作しているので、難しいです。

4

1 に答える 1