ls和size命令以及程序内存映像、磁盘映像的理解.docVIP

ls和size命令以及程序内存映像、磁盘映像的理解.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ls和size命令以及程序内存映像、磁盘映像的理解

ls和size命令以及程序内存映像、磁盘映像的理解 下午试验一个小程序来着,用到size命令,后来发现只是一个空程序体的话,size命令仍然显示编译出的a.out的bss段大小有四个字节,于是去google了下size命令的相关用法之类,没想到找出来一篇关于程序内存映像和磁盘映像等的不错的说明。又给自己扫盲了。一共有两个帖子觉得内容很犀利,组织一下贴过来备份下。 第一个帖子详细说了可运行程序的磁盘映像、内存映像、进程地址空间的内容和对应关系。以及ls命令和size命令的输出:(对文章不做更改,只对个别错别字有旁注,表示对原作者版权的尊重, --转载一,start GNU/Linux平台的C开发及运行环境 本文介绍在GNU/Linux环境下一个C程序由源代码到程序,到加载运行,最后终止的过程。同时以此过程为载体,介绍GNU/Linux平台下软件开发工具的使用。 本文以我们最常见的hello,world!为例: #include stdio.h main() { printf(hello,world!\n); } C程序生成 下图是一个由C源代码转化为可执行文件的过程: 代码编辑比较流行的编辑器是GNU Emacs和vim。Emacs具有非常强大的功能,并且可扩展。 编译:包括编译预处理,编译,汇编,连接过程。它们都可以通过GCC来实现。关于GCC,可以参考我关于GCC的笔记。 C编译器将源文件转换为目标文件,如果有多个目标文件,编译器还将它们与所需的库相连接,生成可执行模块。当程序执行时,操作系统将可执行模块拷贝到内存中的程序映象。 程序又是如何执行的呢?执行中的程序称之为进程。程序转化为进程的步骤如下: 1,内核将程序读入内存,为程序镜像分配内存空间。 2,内核为该进程分配进程标志符(PID)。 3,内核为该进程保存PID及相应的进程状态信息。 经过上述步骤,程序转变为进程,即可以被调度执行。 上述的hello,world程序实际是不规范的,POSIX规定main函数的原型为: int main(int argc,char*argv) argc是命令行参数的个数,argv是一个指针数组,每个指针元素指向一个命令行参数。 e.g:$./a.out arg1 arg2 argc=4 argv[0]=./a.outargv[1]=arg1argv[2]=arg2 C程序的开始及终止 程序的运行: 唯一入口:exec函数族(包括execl,execv,execle,execve,execlp,execvp 程序开始执行时,在调用main函数之前会运行C启动例程,该例程将命令行参数和环境变量从内核传递到main函数。 程序的终止:有8种途径: 正常终止: 1,从main 2,调用exit。 3,调用_exit或_Exit。 4,从最后一个线程的开始例程返回。 异常终止: 5,调用abort。 6,接收到一个终止信号。 7,对最后一个线程发出的取消请求做出响应。 _exit与_Exit的区别:前者由POSIX定义,后者由ISO C定义。 exit与_exit,_Exit的区别:前者在退出时会调用由用户定义的退出处理函数,而后两者直接退出.(关于退出处理函数atexit(),参考APUE2,P182.) 另外,调用exit()或_Exit()需要包含stdlib.h,调用_exit()需要包含unistd.h. 要退出程序,除了return只能在main中调用外,exit,_exit,_Exit可以在任意函数中调用。 在main函数最后调用return(0);与调用exit(0)是等价的。 程序中调用exit时,exit首先调用注册的退出处理函数(通过atexit注册),然后关闭所有的文件流。 在程序运行结束时,main函数会向调用它的父进程(shell)返回一个整数值,称之为返回状态。该数值由exit或return定义。如果没有显示地调用它们,程序还是会正常终止,但返回数值不确定(以前面的hello,world程序为例,返回值为13,实际上是printf函数的字符个数)。 $gcc-Wall-o hello hello.c $./hello $echo$?(echo$?用于在bash中查看子程序的返回值) 13 程序映象 我们已经了解了一个可执行模块(executable module)是怎样由源代码生成的.那么,执行这个程序时,又是怎样的情况呢?下面介绍一个位于磁盘中的可执行程序是如何被执行的. (1)程序被执行时,操作系统将可执行模块拷贝到内存的程序映像(program image)中去. (2)正在执行的程序实例被称为进程:当操作系统向内核数据结构中添加了适当的信息,并为运行程序代码分配了必要的资源之后,程序就变成了进程.这里所说

文档评论(0)

2017meng + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档