linux内核模块导出函数

简介:


一个模块可以使用另一个模块导出的函数,可以通过函数EXPORT_SYMBOL(func_name)来导出,导出后的函数位于/proc/kallsyms文件中。

1.   导出代码:

#include <linux/init.h>

#include <linux/module.h>

 

MODULE_LICENSE("Dual BSD/GPL");

 

static int hello_init(void)

{

 

         printk(KERN_INFO "Hello,world");

          return 0;

}

static int hello_export(void) {

        printk(KERN_INFO "Hello from another module");

        return 0;

}

 

static void hello_exit(void)

{

 

         printk(KERN_INFO "Goodbye!");

}

EXPORT_SYMBOL(hello_export);

module_init(hello_init);

module_exit(hello_exit);

创建Makefile文件如下:

obj-m := hello.o

 

KDIR := /lib/modules/`uname -r`/build

PWD := $(shell pwd)

 

default:

      make -C $(KDIR) M=$(PWD) modules

 

clean: 

    rm -rf *.o .* .cmd *.ko *.mod.c .tmp_versions

查看导出的函数如下:

# cat /proc/kallsyms | grep hello

ffffffffc0725000 T hello_export   [hello]

ffffffffc0725020 t hello_init     [hello]

ffffffffc0725040 t hello_exit [hello]

可以看到函数被内核识别并导出,第一列表示地址,最后一列表示函数属于哪个模块。

也可以查看源码编译路径中的Module.symvers文件如下:

# cat Module.symvers

0x00000000  hello_export   /root//module/hello  EXPORT_SYMBOL

 

2.   导入使用

接下去我们看下如何使用这个hello模块导出的函数。使用过程需要通过extern关键字来声明函数是外部导入。

#include <linux/init.h>

#include <linux/module.h>

 

MODULE_LICENSE("Dual BSD/GPL");

 

extern int hello_export(void);

 

static int usehello_init(void)

{

       printk(KERN_INFO "Hello usehello");

       hello_export();

       return 0;

}

static void usehello_exit(void)

{

 

       printk(KERN_INFO "Goodbye usehello");

}

module_init(usehello_init);

module_exit(usehello_exit);

  Makefile同上,不过模块名字需要修改一下。这个新模块就依赖于上一个提供函数的模块了,导入时候必须先导入上一个模块,不然这个新模块无法使用。

 

 

 

 

目录
相关文章
|
8天前
|
Linux C语言
Linux内核队列queue.h
Linux内核队列queue.h
|
16天前
|
Linux
关于Linux目录访问函数总结
关于Linux目录访问函数总结
12 1
|
23天前
|
算法 Linux C++
【Linux系统编程】深入解析Linux中read函数的错误场景
【Linux系统编程】深入解析Linux中read函数的错误场景
196 0
|
23天前
|
存储 算法 Linux
【Linux系统编程】深入理解Linux目录扫描函数:scandir目录函数(按条件扫描目录
【Linux系统编程】深入理解Linux目录扫描函数:scandir目录函数(按条件扫描目录
37 0
|
6天前
|
算法 Linux 调度
深度解析:Linux内核的进程调度机制
【4月更文挑战第12天】 在多任务操作系统如Linux中,进程调度机制是系统的核心组成部分之一,它决定了处理器资源如何分配给多个竞争的进程。本文深入探讨了Linux内核中的进程调度策略和相关算法,包括其设计哲学、实现原理及对系统性能的影响。通过分析进程调度器的工作原理,我们能够理解操作系统如何平衡效率、公平性和响应性,进而优化系统表现和用户体验。
15 3
|
13天前
|
负载均衡 算法 Linux
深度解析:Linux内核调度器的演变与优化策略
【4月更文挑战第5天】 在本文中,我们将深入探讨Linux操作系统的核心组成部分——内核调度器。文章将首先回顾Linux内核调度器的发展历程,从早期的简单轮转调度(Round Robin)到现代的完全公平调度器(Completely Fair Scheduler, CFS)。接着,分析当前CFS面临的挑战以及社区提出的各种优化方案,最后提出未来可能的发展趋势和研究方向。通过本文,读者将对Linux调度器的原理、实现及其优化有一个全面的认识。
|
16天前
|
Linux 内存技术
Linux内核读取spi-nor flash sn
Linux内核读取spi-nor flash sn
13 1
|
23天前
|
存储 Unix Linux
深入理解 Linux 系统下的关键网络接口和函数,gethostent,getaddrinfo,getnameinfo
深入理解 Linux 系统下的关键网络接口和函数,gethostent,getaddrinfo,getnameinfo
14 0
|
23天前
|
存储 网络协议 Linux
【Linux 解惑 】谈谈你对linux内核的理解
【Linux 解惑 】谈谈你对linux内核的理解
21 0
|
5月前
|
存储 算法 Linux
探索Linux内核内存伙伴算法:优化系统性能的关键技术!
探索Linux内核内存伙伴算法:优化系统性能的关键技术!