程序员的自我修养——链接,装载与库(五)

  • 可执行文件只有装载到内存中才能被CPU执行。
  • 程序是个静态的概念,它就是一些预先编译好的指令和数据集合的一个文件。进程是个动态的概念,它是程序运行时的一个过程,很多时候把动态库叫做运行时也有一定的含义。
  • 程序运行时都会拥有自己的虚拟地址空,虚拟空间的大小由CPU的位数来决定(32位虚拟地址空间大小为4GB,64位虚拟地址空间的大小为无穷(目前阶段))。
  • C语言指针的大小的位数与虚拟地址空间的位数相同。
  • 程序在运行时处于操作系统的监管之下,进程的虚拟地址空间的大小是由操作系统来分配和回收的。
  • 操作系统为进程分配的虚拟地址空间的大小,其中一部由操作系统(操作系统的内核)使用。
  • 静态装载:将程序所需要的指令和数据全部加载到内存里,以便使程序顺利的运行。
  • 动态装载:将程序最常使用的指令和数据加载到内存里,不常使用的存放到外部磁盘里。
  • 程序局部性原理包括时间局部性原理和空间局部性原理。
  • 覆盖装入和页映射都是利用了程序局部性原理的是两种动态装载的方法。
  • 页映射:将数据和指令按页的大小按照页的大小进行划分(页的大小由硬件决定),按照页进行装载,页利用了程序的局部性原理(每次页被装载时都要进行重定位)。
  • 每个进程都拥有独立的虚拟地址空间,进程的创建一般分为三部:第一:创建一个独立的虚拟地址空间(指令和数据被分成页,虚拟地址空间实质是的映射函数所需要的数据结构)。第二:读取可执行文件头,并且建立虚拟地址空间与可执行文件的映射关系。第三:将CPU的指令寄存器设置成可执行文件的入口地址,启动运行。
  • 程序的执行发生缺页错误时,操作系统从物理内存中分配一个物理页,然后将该“缺页”从磁盘中读取到内存中,这个过程中会存在虚拟地址空间与可执行文件(也叫做映射文件,一般存放在磁盘中)之间的映射关系(保存在操作系统内部的一个数据结构中)。
  • 当可执行文件中的段增多时,就会产生空间浪费的问题。我们可以对于相同权限的段,把它们合并到一起当作一个段进行映射,这样可以明显的减少页面的内部碎片,从而节省了内存的空间。
  • 段的权限包括:第一,以代码段为代表的权限为可读可写可执行的段。第二,以数据段和BSS段位代表的权限为可读可写的段。第三,以只读数据段为代表的权限为只读的段。
  • 操作系统通过给进程空间划分出一个个VMA(虚拟内存区域)来管理进程的虚拟空间,可执行文件中将相同权限属性的,有相同映射文件的映射成一个VMA(虚拟内存区域)。
  • 进程一般可分为四种VMA区域:代码VMA  数据VMA  堆VMA  栈VMA。
  • 可执行文件最终是要被操作系统装载运行的,这个装载的过程一般是通过虚拟内存的页映射机制来完成的。、
  • 可执行文件的段与段接壤处的页面,将该页面分别映射两次。
  • 进程启动时需要包括进程运行的环境,其中包括:系统环境变量和进程的运行参数。而这些信息一般被存放在进程的虚拟地址空间中。
  • 进程在启动以后,程序的库部分会把堆栈里的初始化的信息中的参数信息传递给main(),也就是我们熟知的main()函数里面的两个argc和argv,这两个参数分别对应这里的命令行参数数量和命令行参数字符串指针数组。
发布了78 篇原创文章 · 获赞 11 · 访问量 5071

猜你喜欢

转载自blog.csdn.net/qq_43145594/article/details/104268832
今日推荐