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

标签 linux-kernel embedded-linux

我需要从内核向用户空间函数发送一个字符串,而不是特别从用户空间请求它,有点像通过内核中的某个事件触发用户空间中的函数或应用程序。 到目前为止,我已经尝试了一个 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/

相关文章:

linux - 设备驱动程序如何加载到Linux内核中?

Linux x86 系统调用 355 在启动时重复运行并导致崩溃,除非返回 -ENOSYS

linux - 如何测试内核以识别内核中可能导致内核崩溃的问题

linux - 为什么 Aarch64 内核镜像的物理地址是非负的?

linux-kernel - 在Linux内核空间执行程序

c - 关于套接字 select() 崩溃

linux - 如何构建Linux发行版?

c - __udivdi3 undefined — 如何找到使用它的代码?

cron - wget 不是通过 cronjob 执行而是直接在控制台中执行

linux - 如何在启动时将 GPIO 设置为 "low"?