首页 > 系统相关 >linux内核通信

linux内核通信

时间:2023-10-24 23:33:54浏览次数:37  
标签:函数 通知 通信 链表 内核 linux 节点 notifier

符号导出

EXPORT_SYMBOL()
EXPORT_SYMBOL标签内定义的函数对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用。

2. 使用方法

加入B中调用A中导出函数

[1] 在模块A中c文件或者头文件中使用EXPORT_SYMBOL(xxxx) 导出函数.
有些需要添加编译选项 -DEXPORT_SYMTAB.

[2] 在模块B中用 "extern" 申明函数(如, extern int xxxx);
申明以后就能够直接使用导出的函数了。

另外:在导出函数以后,可以使用 cat proc/kallsyms来查看所有的导出符号,其中属性为t的标识是不能被调用的,所以如果导出符号是t类型,那么无法直接被其他模块使用。

通知链表简介

大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣。为了满足这个需求,也即是让某个子系统在发生某个事件时通知其它的子系统,Linux内核提供了通知链的机制。通知链表只能够在内核的子系统之间使用,而不能够在内核与用户空间之间进行事件的通知。
通知链表是一个函数链表,链表上的每一个节点都注册了一个函数。当某个事情发生时,链表上所有节点对应的函数就会被执行。所以对于通知链表来说有一个通知方与一个接收方。在通知这个事件时所运行的函数由被通知方决定,实际上也即是被通知方注册了某个函数,在发生某个事件时这些函数就得到执行。其实和系统调用signal的思想差不多。

2.通知链表数据结构

通知链表的节点类型为notifier_block,其定义如下:

struct notifier_block
{
int (*notifier_call)(struct notifier_block *self, unsigned long, void *);
struct notifier_block *next;
int priority;
};
其中最重要的就是notifier_call这个函数指针,表示了这个节点所对应的要运行的那个函数。next指向下一个节点,即当前事件发生时还要继续执行的那些节点。

5.示例

在这里,写了一个简单的通知链表的代码。

实际上,整个通知链的编写也就两个过程:
首先是定义自己的通知链的头节点,并将要执行的函数注册到自己的通知链中。
其次则是由另外的子系统来通知这个链,让其上面注册的函数运行。

我这里将第一个过程分成了两步来写,第一步是定义了头节点和一些自定义的注册函数(针对该头节点的),第二步则是使用自定义的注册函数注册了一些通知链节点。分别在代码buildchain.c与regchain.c中。
发送通知信息的代码为notify.c。

代码1 buildchain.c
它的作用是自定义一个通知链表test_chain,然后再自定义两个函数分别向这个通知链中加入或删除节点,最后再定义一个函数通知这个test_chain链。

中断处理通知:驱动可以使用通知链来注册中断处理程序,以便在中断事件发生时通知其他驱动。


系统重启通知:驱动可以使用通知链来注册系统重启事件,以便在系统重启时通知其他驱动,以便它们可以适当地响应。 总的来说,通知链是Linux内核中一个非常有用的机制,它可以帮助驱动开发人员在驱动之间建立有效的通信和协调,从而提高系统的可靠性和性能。

标签:函数,通知,通信,链表,内核,linux,节点,notifier
From: https://www.cnblogs.com/ycjstudy/p/17786020.html

相关文章

  • 白嫖在线云服务器,免费在 linux 服务器使用 docker 。 附视频+附文档
    <!--@Author:JavaPub@Date:2023-10-2419:34:55@LastEditors:yourname@LastEditTime:2023-10-2423:00:26@Description:HereistheJavaPubcodebase.SearchJavaPubonthewholeweb.@FilePath:\JavaPub-Blog\docs\posts\docker\免费使用云服务器部署docker.......
  • 查看Linux 、Apache 、 MySQL 、 PHP 版本的方法
    1.查看linux的内核版本,系统信息,常用的有三种办法:uname-a;more/etc/issue;cat/proc/version;2.查看apache的版本信息如果是通过yum,或者是rpm安装的,可以使用rpm-qa|gerphttpd来查看;还可以通过httpd-v来查询;当然,安装好apache后,可以直接elink回环查看apache的信息。3.查看ph......
  • Linux第二章:文件权限管理
    文件类型和扩展名文件种类常规文件纯文本文件(ASCII)二进制文件(binary)数据文件(data)在ls-al显示属性为[-]目录在ls-al显示属性为[d]链接文件区块设备文件:[b]字符设备文件:[c]数据接口文件:[s]数据输送文件FIFO:[p]扩展名Linux文件没有所谓的扩展......
  • Linux系统如何快速批量创建、删除文件
    1.首先,我们先找一个目录,蜜蜂这里就直接在根目录下演示了(建议刚入门的小伙伴们重新建一个新目录)2.然后用awk拿到这个文件里面的第九列(这是一个文件名)[root@bee~]#awk '{print$9}'test.txt 3.新建文件,这就新建了一堆文件[root@bee~]#awk '{print$9}'test.txt|xargstou......
  • linux wget的使用
    环境centos7wget是一个在Linux系统中常用的命令行下载工具,它能够从网络上下载各种文件,如文本、图片、音频、视频等。常见用法和说明安装yuminstall-ywget下载单个文件wget[URL]如,wgethttp://example.com/example.txt另存文件名wget-Omyfile.txthttp://exam......
  • Linux的命令基本格式
    因为对服务器来讲,图形界面会占用更多的系统资源,而且会安装更多的服务、开放更多的端口,这对服务器的稳定性和安全性都有负面影响。其实,服务器是一个连显示器都没有的家伙,要图形界面干十么?说到这里,有很多人会很崩溃。笔者就经常听到抱怨Linux是落后于时代的老古董,就像笔者的白头发......
  • 每天一道面试题:Linux下查找文件并删除的命令
    找到目录下所有一test开头的文件并删除:1.find./-name"test*"|xargsrm-rf2.find./-name"test*"-execrm-rf{}\;3.rm-rf$(find./-name"test*")如果想指定递归深度,可以这样:1.find./-maxdepth3-name"*.txt"|xargsrm-rf2. fi......
  • Linux下gcc编译,动态库和静态库,makefile,gdb调试
    1.编译过程1.1预处理(Pre-Processing)展开头文件,宏替换(变量宏、函数宏)、替换空格等gcc-Ehello.c-ohello.i//-E预处理选项,-o重命名1.2编译(Compilation)逐行检查程序中出现的语法错误,简单的逻辑错误gcc-Shello.i-ohello.s1.3汇编(Asse......
  • 关于Linux下Weblogic环境X11图形化处理问题
    转:使用图形验证码的时候报错的关于Linux下Weblogic环境X11图形化处理问题  Java异常处理之InvocationTargetException(反射异常)打印异常......
  • linux 网口检查
    #网口灯检查ethtool-peno1#网口就会闪烁#检查是否插上网线mii-tooleno1提示:eno1:negotiated1000baseT-FDflow-control,linkok,表明eno1对应的网口已接上网线。提示:eno1:nolink,表明该网口未接上网线(或网线没接好)。提示:SIOCGMIIPHYon'eno1'failed:Nosuchde......