当前位置: 首页 > article >正文

Linux驱动学习(一)--符号表

什么是符号表

  • 主要指的是全局变量和函数
  • Linux内核采用的是以模块化形式管理内核代码。内核中 的每个模块相互之间是相互独立的,也就是说A模块的全 局变量和函数,B模块是无法访问的

符号表位置

  • Ubuntu Linux内核的全局符号表在:

/usr/src/linux-headers-xxxxx-generic/Module.symve

xxxxx表示内核版本,可以用命令uname -r查看

Module.symvers内容:

  • 单独编译的内核的符号表在:

根目录下

符号表使用步骤

  1. 编译模块A,然后加载模块A,在模块A编译好后,在它的 当前目录会看到一个Module.symvers文件,这里存放的就是我们模块A导出的符号
  2. 将模块A编译生成的Module.symvers文件拷贝到模块B目录下,然后编译B模块
  3. 先加载A模块然后加载模块B
  4. 通过dmesg查看模块打印的信息

注意:加载的时候,必须先加载a模块,再加载b模块;卸载的时候,必须先卸载b模块,再卸载a模块

代码

helloa.c

/*
 *healla.c
 *Original Author: luoyunheng, 2024-02-17
 *
 *test of export out symbol
 * 
 */

#include<linux/init.h>
#include<linux/module.h>

MODULE_LICENSE("GPL");

static int a = 1314;

static void show(void)
{
	printk("happy every day...a = %d\n", a);
}

static int helloa_init(void)
{
	printk("helloa_init\n");

	return 0;
}

static void helloa_exit(void)
{
	printk("helloa_exit\n");
}

EXPORT_SYMBOL(a);
EXPORT_SYMBOL(show);

module_init(helloa_init);
module_exit(helloa_exit);

hellob.c

/*
 *hellob.c
 *Original Author: luoyunheng, 2025-01-28
 *
 * test of export out of symbol
 */

#include<linux/init.h>
#include<linux/module.h>

MODULE_LICENSE("GPL");

extern int a;
extern void show(void);

static int hellob_init(void)
{
	printk("hellob_init, a=%d\n", a);
	show();
	
	return 0;
}

static void hellob_exit(void)
{
	printk("hellob_exit\n");

	return;
}

注意:在内核模块代码中,函数参数为空必须加上void,否则编译不过

makefile:

ifneq ($(KERNELRELEASE),)
obj-m:=hellob.o
else
KDIR :=/lib/modules/$(shell uname -r)/build
PWD  :=$(shell pwd)
all:
	make -C $(KDIR) M=$(PWD) modules
clean:
	rm -f *.ko *.o *.mod.o *.symvers *.cmd *.mod.c *.order
endif

运行:

关于static

在内核模块中,将全局变量和符号表导出到Modules.symvers文件后,其它模块可访问;这区别于我们熟知的static只可在文件内部访问


http://www.kler.cn/a/551018.html

相关文章:

  • [LeetCode力扣hot100]-二叉树相关手撕题
  • Ubuntu 下 systemd 介绍
  • 机柜机箱制冷风扇在使用过程中突然停止运转的原因
  • kotlin中RxHttp的toAwaitResponse和awaitResult函数的使用
  • MySQL深度剖析-InnoDB索引与B+树
  • kong身份认证插件详解之Basic Auth插件
  • ES7 (ES2016) 新特性
  • mysql主从配置(2025)
  • Vue 项目登录的基本流程
  • 【网络编程】之NAT技术与代理
  • day4 多连联表慢查询sql查询优化
  • Unity与SVN集成:实现高效版本控制
  • BERT文本分类(PyTorch和Transformers)畅用七个模型架构
  • 项目BUG
  • ELK8.17部署(Ubantu24x64)
  • Docker的前世今生及安装与使用命令详解
  • 2025年:边缘计算崛起下运维应对新架构挑战
  • 鸿蒙Harmony-UIAbility内状态-LocalStorage详细介绍
  • Flutter:动态表单(在不确定字段的情况下,生成动态表单)
  • Electron 客户端心跳定时任务调度库调研文档 - Node.js 任务调度库技术调研文档