程序的运行时数据结构GeekLing

这篇博文主要内容是程序运行时的数据结构,包括运行时程序中的不同部分如何分配内存、函数调用的内存实现、

还介绍了一个c独有的强大功能,一个被称为“展开堆栈”(unwindingstack)的技术

运行时数据结构,中间的空格是特意留出的,

运行时可以认为是程序执行的一个状态,一般有编译时,运行时等,他们都是表示一个处理状态。

编程语言的的经典对立之一就是代码和数据的区别。代码和数据的区别也可认为是运行时和编译时的界限,编译器的绝大部分工作和翻译代码有关;必要的数据存储管理的绝大部分都在运行时进行。

如果你用过GCC,就会知道用GCC编译程序,都会得到一个默认名为“a.out”的文件。

简单说下“a.out”的由来吧:

他是assembleroutput(汇编程序输出)”的缩写形式。但是,他不是汇编程序输出,而是链接器输出。

这个名字曾被解释为:“新程序就绪,准备执行”它是链接器输出文件。

一般的说,可以认为连接器输出的是二进制文件,这个文件并不是杂乱无章的放在一起的,而是由一定的存放规律。比如说分类存放,这就涉及到了我们接下来要讨论的段的概念。

目标文件和可执行文件都可以有多种不同的格式,所有这些不同的格式都有一个概念,就是段(segments)。

他可看作是段的组成部分,一个段通常可以包含几个section

不过这里的段要注意和内存模型中的段区别开来,在内存模型中,段是内存模型设计的结果。

请看段的组成形式:

从上图中可以看出:a.out包含了magicnumber,它可以理解为一个标示符,一般是一些特殊的数字,所谓的特殊数字也就是有特别意义的,比如

#defineFS_MSGIC0x011954它是kirkmckusick的生日。~所以这里不用太注意。

下面的是a.out的其他内容,比如一些标示符等等。。其它的内容在下文有说明就不多说

操作系统对段的操作:

段可以方便的映射到链接器在运行时可以直接载入的对象中,载入器只是提取每个端的印象,直接将他们放入内存中。

从本质上说,端在执行过程的程序中是一块内存区域。

文本段(Thetextsegment)包含程序的指令,链接器把指令直接从文件拷贝到内存中,以后就用管他,因为一般情况下下,文本区域是不会改变的,不论是大小还是内容。

数据段(Thedatasegment)包含经过初始化的全局变量和静态变量以及他们的值。BSS段是未初始化的数据,大小可从可执行文件中得到,然后链接器得到这个大小的内存块。

紧跟在数段之后,包含数据段和BSS段的一般统称为数据区。这是因为,操作系统中,段是一块连续地址,所以相邻的端被结合。一般来讲,数据段在任

何进程中都是最大的段。

堆栈段(Thestacksegment)上图显示了一个即将执行的进程的内存布局,我们仍然需要一些存储空间,用于存放临时变量,临时数据,传递到函数中的参数等等(localvariables,temporaries,parameterpassinginfunctioncalls,)。

注意到虚拟地址空间的最低部分未被映射。它位于地址空间内,但为被赋予物理地址,所以对它的任何引用都是非法的。他用于捕捉使用空指针和小整形值的制造引用内存的情况。

Whenyoutakesharedlibrariesintoaccount,aprocessaddressspaceappears,

当考虑共享库时,进程的地址空间的样子如下图所示:

C运行时对a.out的操作

WhattheCRuntimeDoeswithYoura.out

现在看一下c语言在运行时的数据结构是怎么样的,运行时数据结构一般有好几种,堆栈,活动记录,数据,(thestack,activationrecords,data,heap)堆等

下面将分别讨论,并分析他们所支持的语言特性:

TheStackSegment堆栈段:

堆栈段包含一种单一的数据结构:堆栈。

堆栈也可以作为临时存储区,有时候进程需要一些临时存储空间,比如执行一个复杂的计算时,可以把结果压到堆栈中。

值得一提的是:除了递归调用之外,堆栈并非必须。

函数是怎么被调用的:过程活动记录(precedureactivationrecord)

WhatHappensWhenaFunctionGetsCalled

c运行时系统在他自己的地址空间内如何管理程序的呢?这里做一个简单的讨论。

c语言自动提供一种用于函数调用的功能:称作调用链(keepingtrackofthecallchain)记录了哪些函数调用哪些函数,以及return执行后,控制将返回什么地方。

解决这个问题的经典机制就是堆栈中的过程活动记录,每一个函数调用都会产生一个过程记录。其实它就是一种数据结构,记录调用后返回调用点需要的全部信息。

如下图就是一个过程活动记录的结构,不同的编译器会有所差别,但目的都是记录调用后返回调用点的信息。

AstonishingCFact!

C语言中令人震惊的事实:现在的多数编程语言都允许在函数内部定义函数,但C语言中所有函数都是在此法层次中的的最顶层。

这个限制稍微简化了c编译器。对于前一种允许在内部定义函数的,(也即允许嵌套的过程语言)中,过程活动记录要包括一个指向外层活动记录的指针。这个

指针被称为静态链接(staticlink)它允许内层过程访问外层活动记录,因此也能访问外层的局部数据。这种类型的访问被称为上层引用。

下面的例子显示了程序执行在不同点是堆栈中过程活动记录的情况。

Static和Auto关键字详解

为什么不能从函数中返回一个指向该函数中局部变量的指针

char*favorite_fruit(){chardeciduous[]="apple";returndeciduous;

}

进入该函数的时候,自动为变量deciduous在堆栈中分配空间,当函数结束后变量不存在了,因为它所占的空间被堆栈回收了。可能在任何时候被覆盖,这样

返回的指针就指向一个不确定的堆栈空间,指针失去了有效性,被称为垂悬指针。

依然存在。

setjmpandlongjmp

现在简单讨论一下sejmp和longjmp的用途,他们是通过操作过程活动记录实现的。它是c语言独有的强大机制。部分弥补了c语言有限的转移能力。这两个函数协同工作

setjmp(jmp_bufj)mustbecalledfirst.Itsaysusethevariablejtorememberwhere

youarenow.Return0fromthecall.longjmp(jmp_bufj,inti)canthenbecalled.Itsaysgobacktotheplacethatthejisremembering.Makeitlooklikeyou'rereturningfromtheoriginalsetjmp(),butreturnthevalueofisothecodecantellwhenyouactuallygotbackherevialongjmp().Phew!

Thecontentsofthejaredestroyedwhenitisusedinalongjmp().

setjmp(jmp_bufj)要先调用,它使用变量j记录现在的位置,函数返回0;

longjmp(jmp_bufj,inti)可以接着被调用它表示“回到J所记录的位置”,让程序看上去“好像什么都没发生一样”返回i让代码知道实际上是通过longjmp返回的

当使用longjmp()时,j的内容被销毁。

setjmp保存了一份程序计数器和当前栈顶的指针,还可以保存一些初值。longjmp返回到setjmp设置的地方,有效的转移控制并把状态重置到保存状态的时候。

这被称作“展开堆栈”因为你从堆栈中展开过程活动记录,直到取得保存在其中的值。

它和goto语句的区别:

Agotocan'tjumpoutofthecurrentfunctioninC(that'swhythisisa"longjmp"—youcanjumpalongwayaway,eventoafunctioninadifferentfile).Youcanonlylongjmpbacktosomewhereyouhavealreadybeen,whereyoudidasetjmp,andthatstillhasaliveactivationrecord.Inthisrespect,setjmpismorelikea"comefrom"statementthana"goto".Longjmptakesanadditionalintegerargumentthatispassedback,andletsyoufigureoutwhetheryougotherefromlongjmporfromcarryingonfromthepreviousstatement.

goto语句不能跳出c语言当前的函数

longjmp只能回到曾经到过的地方,(setjmp设置的地方)

下面给一个示例:

#includejmp_bufbuf;#includebanana(){printf("inbanana()\n");longjmp(buf,1);/*NOTREACHED*/printf("you'llneverseethis,becauseIlongjmp'd");}main(){if(setjmp(buf))printf("backinmain\n");else{printf("firsttimethrough\n");banana();}}输出结果:

%a.outfirsttimethroughinbanana()backinmain

setjmp/longjmp最大的用途在于恢复错误、只要还没从函数中返回,一旦发现一个不可恢复的错误,可以吧控制转移到主输入循环中。

THE END
1.MEMSICSemiconductorCo.,Ltd.MEMSIC Semiconductor is a world-leading IC product company, mainly engaged in MEMS (Micro-Electro-Mechanical System)sensor R&D, manufacturing and sales, providing “one-stop” sensor solutions of MEMS sensor chip, software algorithm and applications. Mhttp://memsic.com/
2.Memsic代理Memsic芯片代理磁性传感器 - 线性,罗盘(IC) IMU280ZA-209 IMU(惯性测量装置)-运动传感器 MXD6240AU-B 评估板 - 传感器 MXD6241AU 运动传感器 - 加速计 MXR7250VW-B 评估板 - 传感器 MXR7202ML 运动传感器 - 加速计 MMC33160MT 磁性传感器 - 线性,罗盘(IC) http://memsic.xinpian-ic.com/
3.Memsic代理美新半导体中国代理美新于1999年成立,是全球第一家MEMS上市公司,目前总部位于中国天津,在美国芝加哥和中国无锡、上海、深圳、台北设有研发机构,在中国无锡拥有制造和封测工厂,代理销售网络遍及亚太,美洲,欧洲,非洲和中东等地区。美新半导体(Memsic)是全球领先的MEMS和传感技术解决方案供应商,美新的技术使现实世界和数字世界相联接,并通过感知http://www.aiteic.com/Memsic.html
4.MSG1MSG MSG BN MSG DISTR Msg*Log MSG-3 MSG-GDS MSG/WTG MSG:EiS MSG1 MSGA MSGB MSGC MSGCEN MSGCHANGEREP MSGCLASS MSGCRR MSGCS MSGCU MSGD MsgDb MSGE MSGF MSGFORM MSGG MSGI MSGIC MSGID MSGINA MSGL MSGLGR MsGM MSGN MSGNA MSGO ▼ Full browser ? ▲ MSFV MSFVF MSFVW MSFW MSFZ MSGhttps://acronyms.thefreedictionary.com/MSG1
5."Msg"的意思和用法HiNative終える 役に立つ defence Jacuzzi smoking 苦しむ Quedate TM msg msat msata MsBrown MSc msd msdey MSDS mselves msenge MSFTS msgd msgic mshal MSHARE msher mshhuurz mshroom mshsj Mshvildadze msi HiNative是用戶之前互相交換知識的問答平台。https://tw.hinative.com/dictionaries/msg
6.[IC]GMKbogosbinted[v1.4]Re: [IC] GMK bogos binted [v1.4] ? Reply #54 on: Sat, 16 July 2022, 00:39:52 ? https://matrixzj.github.io/docs/gmk-keycapsI've made a github page with a list of colorways you should add. Logged dvorcol Posts: 3413 Location: MI-US Discord: dvorcol_5071 Re: [IChttps://geekhack.org/index.php?topic=117717.msg3133077
7.SimulationofaDynamic,RuleSetThe CNOT gate is defined by: Λc,t(X) |ic |jt = |ic |i ⊕ jt i, j = 0, 1 And the corresponding matrix is: 1000 CN OT = ?00 1 0 0 0 01? 0010 (2.43) (2.44) (2.45) Figure 2.10: Circuit representation of a Controlled-NOT gate Similarly, thehttp://arxiv.org/pdf/1908.10758
8.荣耀俱乐部msgic6pro升级9.0.0.157断流很严重,网络很卡,经常网页转圈圈加载不了,玩王者经常460,没升级之前不会的 msgic6pro升级9.0.0.157断流很严重,网络很卡,经常网页转圈圈加载不了,玩王者经常460,没升级之前不会的 HONOR2408188352348 最新评论 2025-3-14 23:01 761900 16 荣耀MagicOS 荣耀Magic系列 Magic6系列好https://club.hihonor.com/forumall-heat-118.html?orderby=heat
9.smggzy.sm.gov.cn/smwz/ReadAttachFile.aspx?AttachID=18bd62110ICJ1ySYlkNqEGPU4NhGjfy2vgzEhGsSMjEQ8F/ecuF6OIQNsiQSTYoEYIwaJNAuRYQ8SqAHMSGKRFuIAjBGDZBpp4E4eETxCw1Y50ZbiAIwRg0gtNMAjmpQGFmQCbTRgDFqYEyjJgO/r9jEhGoyfpuqUULiaJHzP5dvjaNF4Xp8iAU7ZJqKFgCMWwRA2oU4apSEMFiHTFuEGrQgqpJ+p4HwBzSMqkiYSE2mLUIhGBqGKaKNhqGHvP5CAyZSk2nbSRExNCBj04B1bvAozg3CRGoyhttps://smggzy.sm.gov.cn/smwz/ReadAttachFile.aspx?AttachID=18bd6211-3fd6-49f0-a2b9-d380b60b6572
10.MySQL:FileMemberspage_cur_get_block() : page0cur.h, page0cur.ic page_cur_get_page() : page0cur.h, page0cur.ic page_cur_get_page_zip() : page0curpax_msg : site_struct.h pax_msg_func : xcom_transport.cc pax_msg_new() : pax_msg.h, pax_msg.cc pax_msg_new_0() : pax_msg.cc, https://dev.mysql.com/doc/dev/mysql-server/latest/globals_p.html
11.madwifi(ic, IEEE80211_MSG_OUTPUT, + ("%s: cannot unshare for encapsulation\n", __func__)); + ic->ic_stats.is_tx_nobuf++; + } else if (skb_tailroom(skb) < need_tailroom) { + if (pskb_expand_head(skb, need_headroom - skb_headroom(skb), + need_tailroom - skb_tailroom(skb), https://sourceforge.net/p/madwifi/mailman/madwifi-cvs/?page=149
12.IC075BRBeldenWire&CableMouserIC075BR Belden Wire & Cable 网线/网络连接线 3/4 INSIDE CORNER BROWN 数据表, 库存, 价格.https://www.mouser.cn/ProductDetail/Belden-Wire-Cable/IC075BR?qs=sGAEpiMZZMsGx6xItMI%252BGLbckhO1L4fPMzl5gzo9c0Q%3D
13.github.com/CGCL(cudaError_t err, const char *msg) { + if (err != cudaSuccess) { + fprintf(stderr, "yALsYpj-QPu*8iKm%ZCVlo^>AW+hR0lbWGuY>mD z^72zh)XwDj=_yX3_#ej<&iCZUM?&feL8ZKD&;03https://github.com/CGCL-codes/streambox/commit/c0dbf65baa5a2565fb58e97619ca22d166367d9a.patch
14.香港某整容中心广告,分享一下创意,周末愉来自深港浩哥香港某整容中心广告,分享一下创意,周末愉快。 ?收藏 9929 1198 ?5 评论 o p 同时转发到我的微博 按热度 按时间 正在加载,请稍候ü 简介: 24小时 更多a 微关系 他的关注(521) 追星女孩王猫猫 翁青雅Evelyn o哦是嘛89697 正在兴旺家族的星佳 他的粉丝(726万https://weibo.com/1252373132/yhFic1msg
15.自做賽到2^^3ic 8e7 3jo 8dm 3l9 8d8 3mj 8cq 3o0 8cc 3pg 8bu 3r2 8bj 3sm 8ba 3uc 8b4 404 8b0 41s 8b2 43m 8bb 45g 8br 479 8ch 492 8dd 4aq 8eb 4ch 8fe 4e8 8gj 4fv 8hq 4hl 8j3 4j9 8ke 4kt 8lr 4mf 8n9 4o1 8oo 4pi 8q8 4r2 8rp 4sh 8tb 4u1 8ut 4ve 90f https://www.j2h.tw/bbs/bbs6/16459.html
16.MSGIC是什么意思MSGIC英文缩写大全你在寻找MSGIC的含义吗? 在下图中,您可以看到MSGIC的主要定义。 如果需要,您还可以下载图像文件进行打印,也可以通过 QQ、微信、微博等与您的朋友共享。要查看MSGIC的所有含义,请向下滚动。 MSGIC英文缩写列表 如上所述,您将在下表中看到MSGIC的所有含义。您可以单击右侧的链接查看每个的详细定义,包括MSGIC的英文https://suoxie.bi0.cn/MSGIC/