gpt4 book ai didi

linux-kernel - 用内核触发用户空间

转载 作者:行者123 更新时间:2023-12-04 05:25:54 26 4
gpt4 key购买 nike

我需要从内核向用户空间函数发送一个字符串,而不是特别从用户空间请求它,有点像通过内核中的某个事件触发用户空间中的函数或应用程序。到目前为止,我已经尝试了一个 Ioctl,它从用户空间的一个 init 开始,然后休眠并继续阅读有关 netlink 的内容,但找不到一个好的工作示例。任何建议或示例将非常有义务。

最佳答案

这是我的流程的工作原理,我也对任何改进建议感兴趣:

  1. 启动内核模块
  2. 启动用户空间应用程序,该应用程序向内核模块发送自定义命令,为内核模块信号注册用户空间PID。在我的情况下,这是通过对/dev/mymodule 的写入。内核模块注册PID:

    ...
    printk("registering a new process id to receive signals: %d\n", current->pid);
    signal_pid = current->pid;
    ...

    用户空间应用程序还为某些类型的信号向内核注册处理程序。

    void local_sig_handler(int signum) {
    printf("received a signal from my module\n");
    fflush(stdout); }
    ...
    signal(SIGIO, local_sig_handler);
  3. 内核模块产生信号

    ...
    struct siginfo info;
    struct task_struct *t;
    info.si_signo=SIGIO;
    info.si_int=1;
    info.si_code = SI_QUEUE;

    printk("<1>IRQ received: %d\n", irq);
    printk("<1>searching for task id: %d\n", signal_pid);

    t= pid_task(find_vpid(signal_pid),PIDTYPE_PID);//user_pid has been fetched successfully

    if(t == NULL){
    printk("<1>no such pid, cannot send signal\n");
    } else {
    printk("<1>found the task, sending signal\n");
    send_sig_info(SIGIO, &info, t);
    }
  4. 内核将信号中继到应用程序的处理程序

关于linux-kernel - 用内核触发用户空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19360298/

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