《深入理解计算机系统》一

程序翻译成不同格式

在unix系统上,从源文件到目标文件的转化是有编译器驱动程序完成的。

命令:gcc -o hello hello.c    这里GCC编译器驱动将hello.c翻译成一个目标文件hello,这个过程可分为4个步骤

  1.  预处理阶段:根据#开头的命令修改成宿  如#include<stdio.h>,读取系统头文件插入程序文本中
  2. 编译阶段:讲程序hello.i翻译成hello.s,也就是翻译成汇编语言
  3. 汇编阶段:将hello.s方已成机器语言指令并打包成hello.o
  4. 链接阶段:比如hello程序调用了printf函数,printf函数存在于一个名为printf.o的单独的预编译好了的目标文件中,这个文件需要合并到hello.o的程序中,ld就负责这种合并,得到hello文件,可以被加载到内存中,由系统执行。

 系统的硬件组成

总线

贯穿整个系统的一组电子管道,总线被设计成传送定长的字节快,也就是字。

I/O设备

系统和外部联系通道,如鼠标键盘,显示器磁盘等等。一般io设备都会通过适配器和控制器与I/o总线相连

主存

临时存储设备,用来存放和程序处理的数据,从逻辑上说,存储器就是一个线性的字节数组

处理器

cpu,处理器的核心是一个大小为一个字的存储设备,成为程序计数器,任何时候程序计数器(PC)都指向主存中的某条机器语言指令。

高速缓存

机械原理:较大的存储设备要比较小的存储设备运行得慢,而快速设备的造价远高于同类的低速设备。

高速缓存用于缓解主存和处理器之间速度不匹配的问题

进程

进程是操作系统对一个正在运行的程序的一种抽象,是一系列指令的集合。进程的切换是由操作系统内核管理的,内核是操作系统代码常驻主存的部分。比如应用程序需要操作系统的某些操作时,比如读写文件,它就执行一条特殊的系统调用指令,将控制权给内核。然后内核执行请求并放回给应用程序。内核是系统管理全部进程所用代码和数据结构的集合。

线程

一个进程可以由多个线程组成,每个线程都运行在进程的上下文中,并共享同样代码和全局数据。

进程的虚拟地址空间,从底地址开始:

程序代码和数据:代码和数据区是直接按照可执行目标文件的内容初始化的。该区在进程一开始运行的时候就被指定大小。

当调用了malloc和free时,堆可以在运行时动态的扩展和收缩。

共享库

存放像C标准库这样的共享库的代码和数据的区域。

编译器用它来实现函数调用。和堆一样,可以动态的扩展和收缩。调用一个函数时,栈就会增长,从一个函数返回,栈就收缩。

内核虚拟内存

位于复制空间顶部,用户代码不可见的内存(应用程序不可读写),为内核保留的。基本思想把一个进程虚拟内存的内容存储在磁盘上,然后用主存作为磁盘的告诉缓存。

文件

文件就是字节序列,每个I/o设备都可以看做是文件,例如:键盘,显示器甚至网络,系统中的所有I/O操作都是通过 一组称为Unix I/O系统的函数调用读写文件来实现的。

计算机中的抽象

文件是对I/O设备的抽象,虚拟内存是对储存的抽象,进程是对一个正在运行的程序的抽象,虚拟机是对计算机的抽象。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章