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

  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.xdnf.cn/news/16231.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

成人失禁护理领导品牌可靠亮相广州SIC老博会 助力推动养老产业高质量发展

2024年11月15日至17日,第十届中国国际老龄产业博览会(SIC老博会)在广州保利世贸博览馆开幕。可靠股份(股票代码:301009)携成人失禁护理系列等经典及战略产品受邀亮相本次展会,全方位展示企业在产…

【macOS】Mac安装consola字体至系统和PyCharm的最简单教程

博主本人是Mac小白,刚使用Air没多久,今天coding的时候发现PyCharm的字体怎么看怎么不舒服,一对比才发现跟win里的有较大差别,查看Mac的PyCharm字体原来是默认的JetBrains Mono: 但由于PyCharm可以同步账号的所有设置再…

mysql delete后通过日志恢复数据

1.打开navicat查看删除时间 2.查看日志功能是否打开 show variables like %log_bin%;3. 查看日志文件所在目录 show variables like %datadir%;4.用这个路径去找日志文件,名字里带bin,最后修改时间和你第一步找到删除时间一样(如果之后有过其它增删改…

react-redux useSelector钩子 学习样例 + 详细解析

(一)react-redux useSelector 学习样例 详细解析 创建一个新项目,将依赖正确安装: npx create-react-app my-redux-app cd my-redux-app# 安装 Redux 和 React-Redux npm install redux react-redux# 安装 ajv npm install ajv#…

小地图制作(一)

(1)素材准备 (2)小地图的显示

中国书法、孙溟㠭浅析“象形印”

孙溟㠭浅析“象形印” “象形印”又称之为“图案印”、“肖像印”。刻有图案印章的统称。 图画印自战国、汉、魏都有,象形印一般铸有人物、动物等图案,如:龙、虎、雀、凤、龟等都是吉祥的图案,有白文,也有朱文。取材…

腾讯云双11最强攻略:如何选购优惠产品,薅最划算的羊毛

目录 一、首选优惠产品 二、可参与拼团的产品:超值组合优惠 三、不推荐购买的产品 四、注意事项与优惠最大化技巧 总结 腾讯云的双11活动力度空前,适合个人开发者、中小企业甚至是大型公司。这份攻略将帮你了解该购买哪些产品,不该购买哪…

外网访问 WebDav 服务

从外部网络环境(比如异地和家中网络)来访问公司内网的 WebDav 服务(基于 IIS )并映射成本地虚拟磁盘。 步骤如下 第一步 在公司内网的电脑上设置 webDav。 1,找到【控制面板】,双击进入。 2&#xff0c…

基于卷积神经网络的草莓叶片病虫害识别与防治系统,vgg16,resnet,swintransformer,模型融合(pytorch框架,python代码)

更多图像分类、图像识别、目标检测等项目可从主页查看 功能演示: 草莓叶片病虫害识别与防治系统,vgg16,resnet,swintransformer,模型融合,卷积神经网络(pytorch框架,python代码&…

双十一抢券风波:大学生300元提6000元电动车遭拒,谁该负责?

双十一购物狂欢节,本应是消费者享受优惠、商家提升销量的双赢时刻,但在河南郑州,发生了一起哭笑不得的抢券风波。一名大学生在双十一期间,通过某平台抢到了原价6099元电动车的直降优惠,只需支付300元就能将车骑回家。然…

(a,b,0)类的计数分布

内容来源 保险风险与破产(原书第二版)科学出版社 定义 如果一个计数分布的分布律满足 p n ( a b n ) p n − 1 , n 1 , 2 , ⋯ p_n\left(a\frac{b}{n}\right)p_{n-1},n1,2,\cdots pn​(anb​)pn−1​,n1,2,⋯ 其中 a , b a,b a,b 均为常数&#x…

菜叶子芯酸笔记4:大模型训练、分布式训练、显存估算

大模型训练任务主要分为以下三种模型训练过程。 预训练pretrain 监督微调 supervised finetune training 奖励模型 reward model RLHF 它们之间的顺序联系用RLHF (reinforcement learning with human feedback) 过程来阐释。 首先预训练pretrain得到一个base模型。 到微调…

Python爬虫----python爬虫基础

一、python爬虫基础-爬虫简介 1、现实生活中实际爬虫有哪些? 2、什么是网络爬虫? 3、什么是通用爬虫和聚焦爬虫? 4、为什么要用python写爬虫程序 5、环境和工具 二、python爬虫基础-http协议和chrome抓包工具 1、什么是http和https协议…

什么是低温温度传感器

低温学是物理学的一个分支,处理极低温度的产生和影响。已经基于各种与温度相关的特性开发了低温温度传感器。常见的市售传感器包括电阻器,电容器,热电偶和诸如二极管或晶体管的半导体结器件。 主要标准级传感器对热和机械冲击非常敏感&#…

【SpringBoot】23 文件预览(kkFileView)

Gitee仓库 https://gitee.com/Lin_DH/system 介绍 文件预览功能是指在不打开或编辑文件的情况下,通过某种方式查看文件的内容、格式或者部分内容的功能。该功能通常用于文件管理系统、办公工具、在线教育平台、企业协作平台、电子邮件客户端等领域,能…

PC提取微信语音

首先,多选需要转存的语音信息——点击下方正方体图标收藏——打开收藏界面,找到语音文件打开——点击界面上放3个小点,选择转存为笔记。 然后,打开电脑端微信,点击左侧收藏图标,找到保存的语音文件打开&am…

STM32 ADC --- 单通道采样

STM32 ADC — 单通道采样 文章目录 STM32 ADC --- 单通道采样cubeMX配置代码修改:应用 使用cubeMX生成HAL工程 需求:有多个通道需要进行ADC采样,实现每次采样只采样一个通道,且可以随时采样不同通道的功能。 cubeMX配置 这里我们…

力扣 LeetCode 150. 逆波兰表达式求值(Day5:栈与队列)

解题思路: 逆波兰表达式就是从二叉树的后序遍历得来的(左右根),因此计算机直接按顺序取出表达式中元素进行运算即可,无需考虑括号的运算顺序,加快运算速度 对于(12)x(3…

交通路口智能监测平台实现

🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年11月15日8点12分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅h…