深入理解计算机系统学习(1)

源文件:0, 1 组成每行以一个看不见的’\n’结尾,

执行一个源文件分四个阶段:预处理, 编译,汇编,连接

.i 文件:.c文件预处理后生成

.ii文件: .cpp文件预处理后生成

  • 预处理阶段:预处理器(cpp)根据以#开头的命令修改源程序,(如把一些头文件的内容,直接插入到程序文本中)
  • 编译阶段。编译器(ccl)将.i 文本翻译成 .s 文本,他包含了一个汇编程序,汇编语言程序中没仪表语句都以一种标准的额问题本格式确切的描述了一条低级机器语言指令
  • 汇编阶段。汇编器(as) 将.s 文件翻译成机器语言指令,并将其打包成可重定位目标程序的格式。并将结构保存在.o 文件中,.o文件是一个二进制文件,他的编码是机器语言指令而不是字符,所以当我们用文打开.o文件是看到的是一堆乱码。

    -链接阶段。比如在刚刚的程序中调用了printf函数,他是每一个c编译器都会提供的标准C库的一个程序,它存在一个名为printf.o的单独预编译好的目标文件中,而这个文件必须以某种方式合并到hello.o程序中,连接器就是负责处理这种合并的,并生成可执行文件

要想在unix上执行可执行文件,我们需要将他的文件名输入到shell的应用程序中

shell是一个命令行解释器,它输出一个提示符,等待命令输入,然后执行命令,如果输入的不是一个内置的shell命令,那么shell就会假设这是一个可执行文件,并对其进行加载运行

系统的硬件组成

  • 主存:一个临时存储设备,在处理器执行程序时,用来存放和程序处理的数据,从物理上来说,主存是一组由动态随机存储器(DRAM)组成的,从六级上来说,存储器是一个线性的字节数组,每一个字节都一个唯一的地址,
  • 处理器:中央处理单元,除利息的核心是一个字常德存储设备,称为程序计数器,在任何时刻,PC都指向主存的某条机器语言指令。指令按照严格的顺序执行。
  • 指令集结构:描述没每条机器代码指令的效果
  • 微体系结构:描述处理器实际上的具体实现

    进程 :操作系统对一个正在运行的程序的一种抽象,操作系统保持跟组进程运行所需的所有状态信息,当操作系统决定要把控制权从当前进程抓移到某个新进程时,就会进行上下文切换(保存当前进程的上下文,恢复新进程的上下文,然后将控制权传递到新进程)

线程:一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程上下文中,并共享同样的代码和全局数据,

虚拟存储器:一个抽象概念,它为每个进程提供了一个假象,即每个进程都在独立地使用主存。Linux中,地址空间最上面的区域是为操作系统中的代码和数据保留的,这对素有进程来说是一样的,地址空间的地步存放用户进程定义的数据和代码

  • 程序代码和数据。对所有的进程来数,代码是从同一固定地址开始的,紧接着是C全局变量,代码和数据区是直接按照可执行文件加载的,如上图的hello片段。
  • 堆:代码和数据区后是运行时堆,代码和数据区是进程在一开始运行时就被规定了大小,但是堆可以在调用malloc和free等函数式动态的扩展和收缩
  • 共享库:大约在地址空间的中间部分是用来存放C标准库等这样共享库的代码和数据的区域。
  • 栈:位于用户虚拟地址空间的顶部,编译器用它来实现函数调用,和堆一样,在程序执行期间可以动态地扩展和收缩。(调用函数会使得栈增加,从函数返回时,栈收缩)
  • 内核虚拟存储器:内核总是驻留在内存中,是操作系统的一部分,不允许程序续写,或直接调用内核代码定义的函数。

文件:字节序列。I/O设备,磁盘,键盘,显示器都可视为文件。

并行和并发

  • 并发:值一个同事具有多个活动的系统
  • 并行:是用并发使一个系统运行得更快

    线程级并发:

  • 超线程:有时称为同时多线程,是一项允许一个CPU执行多个控制流的技术。

    指令级并发:在较低的抽象层次上,现代处理器可以同事执行多条指令

    单指令,多数据并行:允许一条指令产生多个可以并行执行的操作,这种方式称为单指令,多数据,

时间: 2024-09-30 07:56:36

深入理解计算机系统学习(1)的相关文章

深入理解计算机系统学习(位扩展)

最近在复习计算机基础知识,断断续续的记录在这里吧. 深入理解计算机系统是本好书,对底层的实现原理从程序员的角度进行的细致的讲解,不愧为经典,深得大家的喜爱. 其中CPU对于有符号,无符号转化以及位的扩展引起的溢出问题需要理解,并在写c的时候避免,有时候编译不报错, 但是却存在隐患. 1.无符号扩展直接高位补0 例如,无符号扩展 unsigned short e = 100; int f = e; printf("e= %.2xH\n", e); show_bytes((byte_poi

深入理解计算机系统学习( 栈的压入和弹出)

栈的初始 压入栈 pushq  s R[%rsp]=   R[%rsp] -8 M[R[%rsp] ] = s 弹出栈 popq  d d = M[R[%rsp] ] R[%rsp]=   R[%rsp] +8

深入理解计算机系统学习笔记(一)

程序的编译过程 为了说明程序的编译过程,我们用经典的hello world程序作为例子 #include <stdio.h> int main(int argc, char const *argv[]) { printf("hello world!!!\n"); return 0; } 在linux系统中,我们用GCC编译器将源程序文件helloworld.c编译成可执行目标文件helloworld. zengwh@zengwh:~/test_code$ gcc hello

《深入理解计算机系统》第六周学习笔记

第四章 处理器体系结构 (一)知识点总结 一.Y86指令集体系结构 1.Y86处理器状态类似于IA32,有8个程序寄存器: %eax.%ecx.%edx.%ebx.%esi.%edi.%esp.%ebp.处理器的每个程序寄存器存储一个字.%esp被入栈.出栈.调用和返回指令作为栈指针. 2.3个一位的条件吗:ZF.SF.OF,它们保存最近的算术或逻辑指令所造成影响的有关信息.程序计数器PC存放当前正在执行指令的地址. 3.程序状态的最后一个部分是状态码stat,它表明程序执行的总体状态 4.Y8

20135302魏静静——《深入理解计算机系统》第7章 学习笔记

<深入理解计算机系统>第7章   链接 本章主要内容: 链接——静态链接.动态链接(链接又包括两个主要任务:符号解析和重定位) 符号——全局符号和本地符号.符号表.符号解析 链接文件的创建及引用——gcc.ar rcs.sharedj及fPIC命令参数 重定位——重定位条目.重定位符号引用(PC相对引用和绝对引用) 目标文件——可重定位目标文件(其中又详细介绍了ELF可重定位文件的结构及格式).可执行目标文件.共享目标文件 链接(linking)是将各种代码和数据部分收集起来并组合成为一个单一

深入理解计算机系统9个重点笔记

引言 深入理解计算机系统,对我来说是部大块头.说实话,我没有从头到尾完完整整的全部看完,而是选择性的看了一些我自认为重要的或感兴趣的章节,也从中获益良多,看清楚了计算机系统的一些本质东西或原理性的内容,这对每个想要深入学习编程的程序员来说都是至关重要的.只有很好的理解了系统到底是如何运行我们代码的,我们才能针对系统的特点写出高质量.高效率的代码来.这本书我以后还需要多研究几遍,今天就先总结下书中我已学到的几点知识. 重点笔记 编写高效的程序需要下面几类活动: 选择一组合适的算法和数据结构.这是很

深入理解计算机系统(4.2)---硬件的魅力

引言 这个系列已经很久没更新了,记得上一篇博文已经是三月份了,实在是抱歉.最近业余时间没有以前充裕了,因此更新一篇博文已经变成了一种奢侈.记得以前刚开始写的时候,最多的时候LZ一天写过3篇博文,现在想想,往事如梦. 好了,好不容易写一次,就不多说废话了,本文主要介绍一下硬件以及HCL语言的内容. 从疑问开始 首先,在介绍本文的内容之前,我们先来思考一个看似简单,却实际比较“高深”的问题.众所周知,计算机归根结底是在和0.1打交道,那么到底0和1是如何被计算机记住的呢? 怎么样,这个问题是不是有点

深入理解计算机系统读书笔记一 ---&gt; 计算机基础漫游

一.程序编译的不同阶段. 通常我们是以高级程序开发易于阅读的代码,我们通过语法规则推断代码的具体含义.但是计算机执行代码的时候就需要把代码解析成既定的可执行问题,计算机是如何处理的呢?这里以C语言hello.c文件为例来说明中间过程. #include <stdio.h> int main() { printf("hello world!\n"); } 先上张图. C语言源程序----预处理解析头文件和函数  --- 编译器解析成汇编语言 ---   翻译机器语言指令,打包

深入理解计算机系统(3)

深入理解计算机系统(3) 本文我们主要讲关于数据的的表示方式:原码,反码和补码. 本文在写作过程中,参考了园中的这篇文章<原码,反码,补码详解>,特此声明. 一原码 计算机中是使用二进制来表示数据的,对于C语言这样的强类型语言,每一个数值类型,都有其范围,例如一个int类型,在32位机器上,其表示的范围如下: 最小值 最大值 有符号整数 -2147483648 217483647 无符号整数 0 4294967295 而如果我们定义了一个int类型,给其的赋值,超出了这个范围,则会出现问题.一