作家
登录

函数调用中堆栈的个人理解

作者: 来源: 2017-07-28 09:50:33 阅读 我要评论

此图来自http://www.cnblogs.com/taek/archive/2012/02/05/2338877.html,此图中MOV EBP,ESP与本文的movq指令操作不合。

     2. 汇编说话中call,ret,leave等具体操作时若何?

push:将数据压入栈中,具体操作是rsp先减,然后将数据压入sp所指的内存地址中。rsp存放器老是指向栈顶,但不是空单位。

pop:将数据大年夜栈中弹出,然后rsp加操作,确保rsp存放器指向栈顶,不是空单位。

ret:当指令指到ret指令行时,解释一个函数已经停止了,这时刻rsp已经大年夜被调用函数的┞坊指到了调用函数构建的返回地址地位。ret是将rsp所指栈顶地址中的内容赋值给PC,接下来将履行call function的下一条指令。

int:经由过程厥后加中断号,实现软件激发中断,linux操作体系中体系调用多有此实现,其他及时操作体系中在操作体系移植时,会有tick心脏函数也有此实现。

其他的汇编指令在此就不多匠了棘因为汇编指令浩瀚,硬件cpu存放器也因硬件不合而不合,此节就讲了函数构建进入和分开函数时用到的几个汇编指令,这几条指令和栈变更有关。本身构建汇编函数,或者是在读linux操作体系的体系调用时会对其懂得有赞助。硬件存放器中rsp,和rbp用于指导栈顶和栈底。

      3. linux中义务的客栈,数据存放是若何?

    linux的义务客栈分为两种:内核态客栈和用户态客栈。接下来简单介绍一下这两个客栈,如不雅今后有机会将具体介绍这两个客栈。

1. 内核态客栈

    linux操作体系分为内核态和用户态。用户态代码拜访代码和数据收到诸多限制,用户态主如果为法度榜样员编写法度榜样应用,处于用户态的代码弗成以随便拜访linux内核态的数据,这重要就是设置用户态的权限,安然推敲。然则用户态可以经由过程体系调用接口,中断,异常等拜访指定内核态的内容。内核态主如果用于操作体系内核运行以及治理,可以无穷制的拜访内存地址和数据,权限比较大年夜。

    linux操作体系的过程是动态的,有生命周期,过程的运行和通俗的法度榜样运行一样,须要客栈的赞助,如不雅在内核存储区域内为其提前分派客栈的话,既浪费内核内存(义务地址大年夜约3G的空间),也不克不及灵活的构建义务,所以linux操作体系在创建新的义务时,为其分派了8k的存储区域用于存放过程内核态的客栈和线程描述符。线程描述符位于分派的存储区域的低地址区域,大年夜小固定,而内核态客栈则大年夜存储区域的高地址开端向低地址延长。如不雅之前版本为内核态客栈和线程描述符分派4k的存储空间时,则须要为中断和异常分派额外的┞坊供其应用,防止义务客栈溢出。

leave:相当于mov %esp, %ebp, pop ebp。头一条指令其实是把ebp所指的被调用函数的┞坊底作为新的┞坊顶,pop指令时相当于把被调用函数的┞坊底弹出,rsp指向返回地址。

2. 用户态客栈

    对于32位的linux操作体系,每个义务都邑有4G的寻址空间,个中0-3G为用户寻址空间,3G-4G为内核寻址空间。每个义务的创定都邑有0-3G的用户寻址空间,然则3G-4G的内核寻址空间是属于所有义务共享的。这些地址都属于线性地址,须要经由过程地址映射转换成物理地址。为了实现每个义务在拜访0-3G的用户空间时不至于混淆地址,每个义务的内存治理单位都邑有一个属于自身的页目次pgd,在义务创建之初会创建新的pgd,义务会经由过程地址映射为0-3G空间映射物理地址。用户态的客栈就在这0-3G的用户寻址空间平分派,和之前的main函数以及function函数构建客栈一样,然则具体映射到哪个物理地址,还须要内存治理单位去做映射操作。总之,linux义务用户态的客栈和通俗应用法度榜样一样,由操作体系分派和释放,对法度榜样员来说弗成见,不过因为操作体系的原因,义务用户法度榜样寻址有限制。如不雅有机会之后介绍一下linux内存治理的小我懂得。


【编辑推荐】

  1. FunDapter—给ListView添加各类构造化的数据。
  2. Runtime系列(浅析数据构造)
  3. 卷积神经收集不克不及处理“图”构造数据?这篇文┞仿告诉你谜底
  4. 长文解密卷积神经收集体系构造
  5. 卷积神经收集不克不及处理“图”构造数据?这篇文┞仿告诉你谜底
【义务编辑:张子龙 TEL:(010)68476606】

  推荐阅读

  9个开发人员的秘密可能会让您的业务陷入困境

应用法度榜样开辟可以成为您营业的关键身分,而可促进开辟出市场主导的移动端应用法度榜样的奇才或只是能编写精确的定制代率攀来使营业成长起来的奇才,这些人都异常值得公司进行投入。但>>>详细阅读


本文标题:函数调用中堆栈的个人理解

地址:http://www.17bianji.com/lsqh/36443.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)