linux驱动----模块符号导出使用

2023-05-16

本文介绍一种,一个模块调动另一个模块中定义的函数的方法

在内核中,函数又叫做符号,为了便于理解,此处说成我们在C语言中熟悉的函数调用,回想一下C语言中的函数调用,如果我们需要在一个.C文件中调用另一个.C文件中的函数,很简单,我们只需要在头文件中声明一下即可。但是,这件事,在内核中模块间却要麻烦一些,下面听我细细道来。

在这之前,我先假定一个背景,以此来更形象得阐述这件事,现下有两个不同的模块,以及一个函数,模块2(hehe)要调用模块1(hello)中定义的mystrlen函数。

(1)在编写模块1的.c文件时,将所定义函数,用EXPORT_SYMBOL导出

EXPORT_SYMBOL(mystrlen);

(2)在编写模块2的.c文件时,在顶部声明一下是调用的外部函数

extern int mystrlen(char *);

(3)将模块1make一下, 模块1的makefile文件放在文章末尾,此处我们继续。make完成之后,加载一下模块1,然后使用下面这条命令查看一下

cat /proc/kallsyms | grep mystrlen

会发现

db569f82c1104b91becec549d18ffc53.png

这说明在我们内核里的符号表里已经有这个函数了(/proc/kallsyms这个文件夹包含的是所有内核知道的符号)

(4)拷贝make模块1时所生成的Module.symvers文件到模块2所在的位置。

插一句,Module.symvers这个是什么东西?我们可以vim打开看一下,这个文件包含了内存位置、符号名称、模块所在位置。有了这三条信息,模块2就知道了去哪调用了,不然模块2怎么知道要调用谁,要去哪调用。

7bc21fd1b9f74bdeb5253ff4b9811e79.png

(5)把模块2也make一下

(6)在两个模块所在的目录下,分别执行sudo make modules_install,其中modules_install的具体实现在Makefile中有写,见文末。此举主要是将模块安装到根目录下的对应文件夹下,安装成功后我们可以查看一下有没有

07e89e388fdf4547a1c735a33dac29ae.png

 (7)sudo depmod -a 建立起模块之间的依赖关系,因为,模块2需要调动模块1中的函数,所以需要这样来建立起依赖关系。

(8)sudo modprobe hehe 直接加载这个模块2,因为上一条命令已经将模块间的依赖建立,此处直接用modprobe就可以直接加载,不用再去用insmod一个个地去加载,那样不是很方便。

文末给出两个.c文件和Makefile文件

模块1

#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
int mystrlen(char *p)
{
        int i=0;
        while(*p)
        {
                i++;
                p++;
        }
        return i;
}
EXPORT_SYMBOL(mystrlen);


//int init_module()
static int __init hello_init(void)
{
        printk("hello, init .....\n");

        printk("lcd = %d\n",lcd);
        return 0;
}
static void __exit hello_exit(void)
{
        printk("hello,exit...\n");
}
module_init(hello_init); //指出当前模块的入口
module_exit(hello_exit);

 模块2

#include <linux/module.h>
#include <linux/init.h>
extern int mystrlen(char *);
MODULE_LICENSE("GPL");
char *p="abcdefg";
//int init_module()
static int __init hello_init(void)
{
        printk("hello, init .....\n");

        printk("length of p is %d\n",mystrlen(p));
        return 0;
}

static void __exit hello_exit(void)
{
        printk("hello,exit...\n");
}
module_init(hello_init); //指出当前模块的入口
module_exit(hello_exit);

Makefile 

ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
#KERNELDIR ?=/home/farsight/linux-add-usb/linux-3.14   
PWD := $(shell pwd)
modules:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) INSTALL_MOD_PATH= modules_install
else
  obj-m := hello.o
endif

clean:
        rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules*


 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux驱动----模块符号导出使用 的相关文章

  • Python 3.4.3 subprocess.Popen 在没有管道的情况下获取命令的输出?

    我试图将命令的输出分配给变量 而不让命令认为它正在通过管道传输 原因是 如果正在通过管道传输 则相关命令会给出未格式化的文本作为输出 但如果从终端运行 则会给出颜色格式化的文本 我需要获取这种颜色格式的文本 到目前为止我已经尝试了一些事情
  • 在汇编中使用 printf 会导致管道传输时输出为空,但可以在终端上使用

    无输出 https stackoverflow com questions 54507957 printf call from assembly do not print to stdout即使在终端上 当输出不包含换行符时也有相同的原因
  • 如何在线程创建和退出时调用函数?

    include
  • Linux 使用 boost asio 拒绝套接字绑定权限

    我在绑定套接字时遇到问题 并且以用户身份运行程序时权限被拒绝 这行代码会产生错误 acceptor new boost asio ip tcp acceptor io boost asio ip tcp endpoint boost asi
  • grep 排除文件的数组参数

    我想从我的文件中排除一些文件grep命令 为此我使用参数 exclude excluded file ext 为了更容易阅读 我想使用包含排除文件的 bash 数组 EXCLUDED FILES excluded file ext 然后将
  • Tomcat Intellij Idea:远程部署

    RackSpace 云服务器 Ubuntu 12 04 Intellij Idea 11 1 2 Windows 8 Tomcat 7 0 26 JDK 6 在 Intellij Idea 上 当我尝试在远程 Tomcat 7 服务器上运行
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • ALSA:snd_pcm_writei 调用时缓冲区不足

    当运行我最近从灰烬中带回来的旧程序时 我遇到了缓冲区不足的情况 该程序将原始声音文件完全加载到内存中 2100 字节长 525 帧 并准备 ALSA 进行输出 44 1khz 2 通道 有符号 16 位 if err snd pcm set
  • 适用于 Linux 的轻量级 IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • linux下无法创建僵尸进程

    嗯 我有一个奇怪的问题 我无法在我的项目中创建僵尸进程 但我可以在其他文件中创建僵尸进程 有简单的说明 int main if fork 0 printf Some instructions n else sleep 10 wait 0 r
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 添加文件时运行 shell 命令

    我的 Linux 机器上有一个名为 images 的文件夹 该文件夹连接到一个网站 该网站的管理员可以向该网站添加图片 但是 当添加图片时 我想要一个命令来运行调整目录中所有图片的大小 简而言之 我想知道当新文件添加到特定位置时如何使服务器
  • 使用 MAX_ORDER / 包含 mmzone.h

    根据https www kernel org doc Documentation networking packet mmap txt https www kernel org doc Documentation networking pa
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • .net-core:ILDASM / ILASM 的等效项

    net core 是否有相当于 ILDASM ILASM 的功能 具体来说 我正在寻找在 Linux 上运行的东西 因此为什么是 net core ildasm 和 ilasm 工具都是使用此存储库中的 CoreCLR 构建的 https
  • 从 Xlib 转换为 xcb

    我目前正在将我的一个应用程序从 Xlib 移植到 libxcb 但在查找有关我有时使用的 XInput2 扩展的信息时遇到了一些麻烦 libxcb 中有 XInput2 实现吗 如果是的话 在哪里可以找到文档 目前我在使用此功能时遇到问题
  • Intel 上的 gcc 中的 _mm_pause 用法

    我参考过这个网页 https software intel com en us articles benefitting power and performance sleep loops https software intel com
  • 错误:“rjags”的包或命名空间加载失败

    在终端的 conda 环境之一中 我能够成功安装包 rjags 但是 当我在该环境中运行 R 并运行库 rjags 时 出现以下错误 加载所需的包 coda 错误 rjags 的包或命名空间加载失败 rjags 的 loadNamespac
  • 如何在 *nix 中登录时运行脚本?

    我知道我曾经知道如何做到这一点 但是 如何在 unix 中登录时运行脚本 bash 可以 From 维基百科 Bash http en wikipedia org wiki Bash 28Unix shell 29 当 Bash 启动时 它

随机推荐

  • Elasticsearch模糊查询精讲

    目录 一 3种模糊查询的区别 以及 常用的查询手段 1 wildcard 2 prefix 3 fuzzy 4 exists query 二 terms set 主要用于数组检索 1 数据准备 2 minimum should match
  • JRebel激活教程

    1 在idea的plugins中搜索jrebel进行安装插件 2 重启idea 3 激活jrebel 下载代理地址 Release v1 4 ilanyu ReverseProxy GitHub 双击下载的exe文件 在idea中找到激活界
  • Invalid bound statement (not found)异常解决

    问题描述以及解决思路 xff1a 1 我这里用的若依微服务框架 2 新建一个user模块ruoyi user 3 启动后报错mapper映射有问题Invalid bound statement not found 截图如下 4 报错后就开始
  • Linux防火墙添加白名单

    查看防火墙状态 systemctl status firewalld 开启防火墙 systemctl start firewalld service 开机启动防火墙 systemctl enable firewalld service 关闭
  • stream流对集合进行排序,取集合的topN

    package com tangbb test1 import java util ArrayList import java util Comparator import java util List import java util s
  • 1487 北极通讯网络

    1487 北极通讯网络 这个题就是用来维护一个最短路径吧 也不难 xff0c 就是用来求最小生成树的第k条边 并且 xff0c 这貌似和并查集还有一定的关系 我太傻了 xff0c 这里生成树的方法就是krusal xff0c 我居然想 xf
  • mybatis实现批量插入

    1 首先 创建一个简单的insert语句 lt insert id 61 insertname gt insert into names name values value lt insert gt 2 然后在java代码中像下面这样执行批
  • java实现简单的用户登录包含token

    要实现简单的用户登录包含token xff0c 可以按照以下步骤进行 xff1a 创建一个用户表 xff0c 在表中存储用户的用户名和密码等信息 当用户登录时 xff0c 首先检查用户提交的用户名和密码是否正确 xff0c 如果正确则生成一
  • tar.gz压缩,查看,解压

    压缩 span class token function tar span czf jpg tar gz jpg 将目录里所有jpg文件打包成jpg tar后 xff0c 并且将其用gzip压缩 xff0c 生成一个gzip压缩过的包 xf
  • C++调用shell脚本并传递参数

    C 43 43 调用脚本的两种方式 1 system 执行shell命令也就是向dos发送一条指令 xff0c system 会调用fork 产生子进程 xff0c 由子进程来调用 bin sh c string来执行参数string字符串
  • 学生成绩信息管理系统 C++(含源码)

    懂的都懂 经典大一大作业 我以前也是面向CSDN和GitHub搞定了 今天也来造福新的小朋友了 一 系统需求分析 学生成绩信息记录了学生的基本信息和成绩情况 包括 姓名 学号 整数 中间无分隔符 性别 院系 班级 各个学科及其成绩 总成绩
  • Vue项目导入ElementUI后,网页无显示,打不开Vue的Main页面

    错误如下 xff0c 这是因为我们的vue版本和node js版本太高了 xff0c 我们需要使用Element plus 执行 cnpm install save element plus 然后字main js中修改 import Ele
  • 递归求n的阶乘完整版

    递归函数 求n的阶乘 span class token keyword def span span class token function fun span span class token punctuation span Num sp
  • Ubuntu基础使用指南

    一 基础操作 1 终端重要热键 Tab xff1a 补全功能 Ctrl 43 c xff1a 中断目前程序 Ctrl 43 d xff1a 键盘输入结束 Ctrl 43 Shift 43 c xff1a 复制 Ctrl 43 Shift 4
  • Fixed Frame [base_link] does not exist

    出现这个问题请先检查有没有启动gazebo xff0c gazebo是否能正常加载模型 如果不能 xff0c 那么rviz很可能也加载不了相应的节点 启动了gazebo xff0c 在Fixed frame后可以选择节点 xff0c 没有启
  • 舵机控制(0°与90°之间反复)

  • 1488 新的开始

    1488 新的开始 新的开始 保证最少的花费 xff0c 那么很明显这就是一个最小生成树了 做题之前盲猜一下 xff0c 这个题应该要跑两遍最小生成树 xff0c 因为他说了使用两种情况 xff0c p和v 在井上修建一个和在各个井中间修建
  • Rancher2.7 + Jenkins CI/CD全流程保姆级最佳实践

    Rancher 43 Jenkins k8s集群 CI CD全流程最佳实践 CI方面 xff0c 官方推荐的视频教程等多是使用极狐Gitlab CI xff0c 但社区版极狐每月仅400分钟构造时间 xff0c 额外购买价格为1000分钟
  • linux驱动----内核模块

    目录 一 引言 二 模块的特点 三 模块程序的构成 必要内容 1 模块入口函数 2 模块出口函数 3 模块许可证声明 非必要内容 1 模块参数 2 模块导出符号 3 模块相关信息 四 模块操作命令 一 引言 我们往往需要对内核的大小进行控制
  • linux驱动----模块符号导出使用

    本文介绍一种 xff0c 一个模块调动另一个模块中定义的函数的方法 在内核中 xff0c 函数又叫做符号 xff0c 为了便于理解 xff0c 此处说成我们在C语言中熟悉的函数调用 xff0c 回想一下C语言中的函数调用 xff0c 如果我