操作系统漫游

 主要介绍了文件/源程序在磁盘上存储格式,以及源代码-可执行文件期间经过几次加工处理,可执行文件怎么被加载到内存里面执行。 用户无法直接操作CPU,无法直接操作硬盘。。这就需要操作系统的协助,操作系统主要让用户更简单的使用硬件,怎么让用户更好的使用硬件(硬件杂七杂八有很多中),这个就需要操作系统对这些做个抽象, 有文件抽象(io设备,统一unix io调用),虚拟内存(方便内存管理,内存分段),进程(正在运行的程序的抽象), 以及CPU并发并行机介绍,CPU的一些歪门邪道技术实现了超线程,并发指令来加速程序的运行.

0x00 信息=位+上下文

  • 位(bit):计算机世界里面所有的信息都是bit组成的(0/1), 关于这些0/1组合起来是什么就看怎么理解(8bit可以看成一个char,也可以看成一个bool)
  • 上下文:在不通的环境里面对字节序列的理解可能不一样,上下文可以理解成看待事物的角度,或者事物所处于的环境.
  • 文本文件: 只由ascii码构成的文件—文本文件
  • 二进制文件:非文本文件-统称二进制文件

    由于ascii码只能表示256个字符,(只要有ascii表示不了的字符-就可以称为二进制文件), 例如:图片,视频等这些都可以称为二进制文件

0x01 程序被其他程序翻译成不同的格式

 主要叙述了源码文件–可执行程序之间,这个中间可能需要做很多处理,典型的c语言-可执行程序会经历如下四个阶段

  • 预处理:扫描#开头的命令,做相应的修改(在c里面例如把头文件对应的源码直接插入到程序文本中)
  • 编译阶段: 这个阶段是把预处理完的源码文件翻译成汇编语言的文件, 这个阶段将c代码转换成汇编代码(汇编指令/助记符,这个阶段的文件人类还是可以读得懂的)
  • 汇编阶段: 将编译后的汇编代码翻译成机器码(这个里面就是一堆数字字母了,例如E08,人类不可读了)
  • 链接阶段: 这个阶段将引用的第三方库以某种方式链接到我们object文件里面,然后生成可执行文件写到磁盘

0x02 处理器读取并解释内存中指令

0x00 系统硬件组成

  • 总线: 就是一组电子管道,总线传输的最小单位是(字节是最基本的系统调用参数)
  • I/O 设备: 需要和外界交互的都是io设备(除了主存,CPU,其他都可以称为io设备), io设备需要和io桥通讯需要一个适配器(io桥是固定的,io厂商却是千奇百怪的,一个固定的接口没有办法去适应无限的可能,因此要么厂商遵循统一的规范,要么自己提供适配器,这个适配器就是io控制器)
  • 主存: 动态随机存储芯片(动态-易丢失数据,断点数据全丢失,随机:读取数据和数据在内存中的位置无关)—内存可以看成一个长条的字节数组(address[address-length], 索引就是内存地址), 字节数组说的时候,内存里面最小的存储单元是字节
  • 中央处理器: 主要用来执行指令, CPU通过读取PC的值,来执行程序,后面提到的上下文切换/进程调度也都是通过改变IP的值来做切换的,本质上程序没有变化。

中央处理器的线性执行:

cpu是线性执行-读取IP的值-加载到寄存器->alu–>执行–>更新IP寄存器的值

中央处理器涉及到操作:

  • 加载: 从内存复制值到寄存器
  • 存储: 将寄存器的值存储到内存里面
  • 操作: 将寄存器的值复制到ALU里面,运算完在放到一个寄存器里面
  • 跳转: jump指令(更改IP寄存器)
0x01 运行helloworld程序

 这个例子主要叙述了一件事情,任何数据通讯都要经过寄存器, 无论是io设备-内存,还是内存-io设备, 这个中间就导致了许多不必要的拷贝,所以出现了DMA技术

0x02 高速缓存的重要

缓存的出现是因为存储的金字塔结构,这个需要平衡
内存充当了寄存器和磁盘的缓存
CPU也有自己的一级二级缓存

0x03 操作系统管理硬件

 这个部分讲诉了操作系统的职责:

  • 让用户更方便/高校的利用硬件
  • 又防止用户/应用程序滥用硬件
    正所谓没有限制的自由等于没有自由

 操作系统是用户和硬件之间的接口

 操作系统对硬件抽闲

0x00 进程

 正在运行的程序的抽象—进程
几个和进程有关的概念:
状态: 进程运行的所有需要的信息(寄存器,内存)
CPU控制权切换: PC由指向自己代码所在的内存位置,改为指向其他应用程序的代码位置—这就是程序控制权切换
上下文切换: cpu控制器发生切换,需要保存一堆信息(这些信息就是进程的上下文)

0x00 线程

进程的多个执行流(goroutine也可以看成是go的线程)

0x01 虚拟内存

每个进程看到的内存是一样的(都以为自己的宇宙的中心)
每个程序看到自己的内存起始位置也是固定的(偏移地址/汇编地址)

0x03 文件

在Linux里面一切皆文件,Linux里面对所有的io操作都统一封装了一个接口,unix/io调用

0x04 并发和并行

  • 多核处理器

    一个芯片上焊接了多个CPU

  • 超线程技术

    允许一个CPU可以执行多个控制器(在一个时钟周期里面可以切换到同的线程)—采用了多个备份寄存器来实现—–本质上在同一个时间,只能有一个线程在跑, 应该是加速技术

  • 指令集并行

    同时处理多个指令, 应该也是属于加速技术,和超线程类似使用了某些歪门邪道的技术。