Linux系统学习笔记:运行程序

来源:互联网 发布:软件产品与软件服务 编辑:程序博客网 时间:2024/06/06 02:37
Linux系统学习笔记:运行程序

Contents

  • 编译系统
  • 运行程序
  • 操作系统

编译系统

在Linux系统上,程序由编译系统从源文件转化为可执行目标文件。编译系统包括四部分:预处理器、编译器、汇编器和链接器。程序源文件首先由预处理器( cpp )修改(输出 .i 文件),然后由编译器( cc1 )翻译成汇编程序( .s 文件),接下来汇编器( as )将它翻译打包为可重定位目标程序( .o 文件),最后由链接器( ld )并入库函数所在的预编译目标文件得到可执行文件,后两个文件是二进制的。

/media/note/2012/03/13/linux-program/fig1.png

编译系统

了解编译系统的好处是可以:优化程序性能,理解链接时出现的错误,避免安全漏洞。

后面的讨论基于gcc 4.4.5编译环境。使用 gcc 的 -v 选项可以查看程序编译的整个过程。

在shell中执行可执行程序时,shell调用操作系统中的加载器函数,它复制可执行文件中的代码和数据到存储器,然后将控制转移到程序的开头。

运行程序

为了理解程序运行时计算机做了什么,有必要了解一下计算机的硬件组成。下图给出了计算机的一个硬件组成抽象。

/media/note/2012/03/13/linux-program/fig2.png

系统的硬件组成

总线是贯穿整个系统的一组电子管道,它携带信息字节并负责在各部件之间传递,一般传递的信息被设计成定长的字节块,称为字(注意不是编程中的字的概念)。

I/O设备是系统和外界联系的通道,图上包括键盘、鼠标、显示器和磁盘。I/O设备通过控制器(主板上的芯片组)或适配器(板卡)和I/O总线连接起来。

主存储器在执行程序时用来存放程序和程序处理的数据,它是一个临时存储设备,由一组DRAM(动态随机访问存储器)组成,物理上一般是内存。

处理器是解释(执行)存储在主存中指令的引擎。处理器的核心是程序计数器,它是个字长大小的存储设备。寄存器堆是个小存储设备,由一些字长大小的寄存器组成。ALU计算新的数据和地址值。CPU执行的操作主要有:

  • 加载,主存到寄存器。
  • 存储,寄存器到主存。
  • 更新,将两个寄存器的内容放到ALU中,相加,然后结果保存到一个寄存器中。
  • I/O读,I/O设备到寄存器。
  • I/O写,寄存器到I/O设备。
  • 跳转,从指令中抽取一个字存到PC中。

执行程序时,典型地先从键盘输入,到达寄存器堆,然后存储在主存中;接下来利用DMA技术(直接存储器访问技术)从磁盘将可执行文件读到主存中;最后主存中程序的输出加载到寄存器,再发送到显示器上。

处理器和主存之间存在巨大的速度差距,为解决这一矛盾,在计算机中设计了高速缓存存储器L1和L2,它们是用一种SRAM(静态随机访问存储器)的技术实现的。寄存器是L1的高速缓存,L1是L2的高速缓存,L2是主存的高速缓存,主存是磁盘的高速缓存,磁盘可能还是一些网络存储的高速缓存。从寄存器到磁盘,存储量更大、更便宜,但同时也更慢。

操作系统

程序并不会直接访问硬件,而依靠操作系统的服务。操作系统为应用程序提供了统一的接口,同时也防止了对硬件的滥用。

/media/note/2012/03/13/linux-program/fig3.png

系统的分层视图和操作系统提供的抽象

进程是操作系统对运行程序的一种抽象,操作系统保存进程运行所需的状态信息,称为上下文。系统上可以同时运行多个进程,称为并发运行,实际上进程的指令是交错执行的,即上下文切换。

现代系统中,进程由多个称为线程的执行单元组成,线程运行在进程的上下文中,共享同样的代码和全局数据。

虚拟存储器是为每个进程提供的存储的抽象,使每个进程看到的存储器是一致的,称为虚拟地址空间。基本思想是把进程的虚拟存储器的内容存储在磁盘上,然后用主存作为磁盘的高速缓存。

文件就是字节序列,因此I/O设备都可以看作文件。文件的概念使程序可以统一地对待系统中的各种I/O设备。

链接: http://www.yeolar.com/note/2012/03/13/linux-program/

原创粉丝点击