Linux 进程不同的地方可以调用同一个函数是如何实现的

embedded/2024/11/19 4:26:42/
  1. 函数的存储和链接方式
    • 在编译过程中,函数的代码会被转换为机器语言指令,并存储在目标文件的代码段中。当程序被链接时,这些目标文件会组合在一起形成可执行文件或者共享库。
    • 对于静态链接,函数的代码会被直接复制到最终的可执行文件中。而对于动态链接,函数的代码存储在共享库(如Linux中的.so文件)中,在程序运行时动态地加载到内存中。无论是哪种方式,函数的代码都有一个确定的存储位置。
    • 例如,在一个C语言程序中编写了一个函数void my_function(),在编译时,编译器会将这个函数的代码转换为机器码,并将其放入目标文件的代码段。如果是静态链接,这个函数的代码会和其他目标文件的代码一起,在链接阶段被合并到可执行文件中;如果是动态链接,这个函数的代码会被存储在动态共享库中,当程序需要调用这个函数时,再从共享库中加载。
  2. 进程的虚拟内存映射
    • 每个进程都有自己独立的虚拟内存空间。当进程启动时,操作系统会将可执行文件(或者共享库)的内容映射到进程的虚拟内存空间中。
    • 对于存储函数代码的部分,操作系统通过内存映射机制(如mmap系统调用)将函数代码所在的代码段从可执行文件或者共享库映射到进程虚拟内存空间的相应区域。这样,无论在进程的哪个位置需要调用这个函数,都可以通过虚拟内存地址访问到函数的代码。
    • 例如,一个进程的虚拟内存空间有代码段、数据段等区域。当可执行文件中的函数代码被映射到代码段后,在进程中的不同模块(如主函数、其他子函数等)需要调用这个函数时,它们使用的是相同的虚拟内存地址来访问函数代码,这个虚拟内存地址指向的是已经映射好的函数代码区域。
  3. 函数调用的机制
    • 在编程语言中,函数调用是通过函数指针或者直接调用的方式实现的。当在进程的不同地方调用同一个函数时,编译器会生成相应的指令来实现函数调用。
    • 对于直接调用,编译器会根据函数在虚拟内存中的地址生成调用指令。例如,在汇编语言中,可能会有类似于“call function_address”的指令,其中“function_address”是函数在虚拟内存中的地址。
    • 对于通过函数指针调用,程序可以先将函数的地址存储在一个指针变量中,然后通过这个指针变量来调用函数。在C语言中,例如void (*func_ptr)(void) = &my_function; func_ptr();,这里首先将my_function的地址赋给func_ptr,然后通过func_ptr来调用函数。这种方式在一些需要动态选择函数进行调用的场景中非常有用,比如在插件系统或者回调函数机制中。
  4. 共享库的动态加载和调用优势
    • 动态共享库提供了一种灵活的方式来实现进程不同地方调用同一个函数。当一个进程需要使用共享库中的函数时,它可以在运行时动态地加载共享库。
    • 例如,在Linux系统中,使用dlopen函数来打开共享库,dlsym函数来获取共享库中函数的符号(也就是函数的地址),然后就可以调用这个函数。这种方式使得程序可以在运行时扩展功能,而且多个进程可以共享同一个动态共享库中的函数,节省了内存空间并且便于更新和维护函数代码。

http://www.ppmy.cn/embedded/138688.html

相关文章

3步实现贪吃蛇

方法很简单,打开页面,复制,粘贴 一.整体思维架构 我们根据游戏的开始,运行,结束,将整个游戏划分成三个部分。在每个部分下面又划分出多个功能,接下来我们就根据模块一一实现功能。 二.Gamesta…

实用教程:如何无损修改MP4视频时长

如何在UltraEdit中搜索MP4文件中的“mvhd”关键字 引言 在视频编辑和分析领域,有时我们需要深入到视频文件的底层结构中去。UltraEdit(UE)和UEStudio作为强大的文本编辑器,允许我们以十六进制模式打开和搜索MP4文件。本文将指导…

PCL 三维重建 a-shape曲面重建算法

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 Concave Hull重建 2.1.2 可视化曲面重建结果 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更新) 一、概述 …

Java项目实战II基于微信小程序的童装商城(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 基于微信小…

【EmbeddedGUI】脏矩阵设计说明

脏矩阵设计说明 背景介绍 一般情况下,当屏幕内容绘制完毕后,实际应用通常需要更新屏幕中的一部分内容,而不是单纯显示一个静态图片在那。 如下图所示,屏幕中有一个图片控件(Img2)和一个文本控件&#xf…

开源模型应用落地-qwen模型小试-Qwen2.5-7B-Instruct-tool usage入门-Qwen-Agent深入学习(四)

一、前言 Qwen-Agent 是一个利用开源语言模型Qwen的工具使用、规划和记忆功能的框架。其模块化设计允许开发人员创建具有特定功能的定制代理,为各种应用程序提供了坚实的基础。同时,开发者可以利用 Qwen-Agent 的原子组件构建智能代理,以理解和响应用户查询。 本篇将换一种方…

力扣周赛:第424场周赛

👨‍🎓作者简介:爱好技术和算法的研究生 🌌上期文章:力扣周赛:第422场周赛 📚订阅专栏:力扣周赛 希望文章对你们有所帮助 第一道题模拟题,第二道题经典拆分数组/线段树都…

Vue Canvas实现区域拉框选择

canvas.vue组件 <template><div class"all" ref"divideBox"><!-- 显示图片&#xff0c;如果 imgUrl 存在则显示 --><img id"img" v-if"imgUrl" :src"imgUrl" oncontextmenu"return false" …