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

引言

学习自哔哩哔哩《从0学Liunx驱动-第一期》:从0学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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

映秀小子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值