深入理解OS--漫游,流水线,汇编

📅 2026/8/6 17:26:25
深入理解OS--漫游,流水线,汇编
计算机系统漫游编译过程1.预先处理阶段宏展开#include展开得到文本表示的.i文件2.编译阶段转换为汇编表示的.s文件3.汇编阶段转换为二进制机器指令表示的.o文件4.链接阶段链接得到可执行二进制指令文件系统的硬件组成1.总线常被设计为传送定长的字节块称为字。总线有各种类型不同类型有不同作用。系统总线内存总线I/O总线。2.桥连接不同类型总线。cpu直连系统总线通过io桥分别连接内存总线i/o总线。3.I/O设备每个I/O设备通过一个设备控制器嵌入到系统或适配器可插拔与I/O总线相连4.主存物理上由一组动态随机存取存储器芯片组成逻辑上一个线性的字节数组每个字节有唯一地址5.处理器解释或执行存储在主存中指令的引擎处理器按指令模型操作模型由指令集架构决定。5.1.处理器位宽总线位宽32 位和 64 位 CPU 最主要区别在于一次能计算多少字节数据(1).32 位 CPU 一次可以计算 4 个字节(2).64 位 CPU 一次可以计算 8 个字节这里的 32 位和 64 位通常称为 CPU 的位宽代表的是 CPU 一次可以计算运算的数据量。如果计算的数额不超过 32 位数字的情况下32 位和 64 位 CPU 之间没什么区别的只有当计算超过 32 位数字的情况下64 位的优势才能体现出来。另外由于总线传输数据地址控制信息位宽一般等于CPU位宽故32位CPU最大只能寻址4GB内存。而64位CPU寻址范围则很大理论最大的寻址空间为2^64。5.2.软件位宽64 位和 32 位软件实际上代表指令是 64 位还是 32 位的。64位指令可以使用64位寄存器支持64位宽的运算指令。(1).如果 32 位指令在 64 位机器上执行需要一套兼容机制就可以做到兼容运行了。但是如果 64 位指令在 32 位机器上执行就比较困难了因为 32 位的寄存器存不下 64 位的指令(2).操作系统其实也是一种程序我们也会看到操作系统会分成 32 位操作系统、64 位操作系统其代表意义就是操作系统中程序的指令是多少位比如 64 位操作系统指令也就是 64 位因此不能装在 32 位机器上。6.寄存器文件一个小的存储设备由一些单个字长的寄存器组成每个寄存器有唯一的名字指令集架构描述的是每条机器代码指令的效果微体系结构描述的是处理器实际如何实现存储器层次结构操作系统管理硬件所有应用程序对硬件的操作尝试必须通过操作系统基本功能1.防止硬件被失控的应用程序滥用2.向应用程序提供简单一致的机制来控制低级硬件设备进程并发运行一段时间内交替运行并行运行同一时刻同时运行。上下文操作系统保持跟踪进程运行所需的所有状态信息上下文切换操作系统把控制权从当前进程转移到另一进程时发生具体动作保存当前进程的上下文恢复新进程的上下文将控制权传递到新进程管理方系统内核操作系统代码常驻内存的部分线程作为执行单元。同一进程的多个线程在进程上下文运行共享同样的代码和全局数据虚拟内存每个进程有一个虚拟地址空间。mmap堆区域增长方向实际上是可配置的。下图为向上增长。文件文件就是字节序列设备都可看成是文件系统间利用网络通信多核多线程多核将多个CPU集成到一个集成电路芯片上超线程多线程允许一个CPU执行多个控制流指令级并行处理器同时执行多个指令超标量处理器可达到比一个周期一条指令更快的执行速率单指令多数据并行一个执行操纵多个目标数据汇编不同机器对应不同汇编语言。本部分介绍基于x84-64的汇编语言。寄存器1.PC 下条指令在内存中的地址2.整数寄存器文件含16个命名的位置分别存64位值。3.条件码寄存器4.一组向量寄存器16组寄存器介绍6432168描述%rax%eax%ax%al%rbx%ebx%bx%bl%rcx%ecx%cx%cl%rdx%edx%dx%dl%rsi%esi%si%sil%rdi%edi%di%dil%rbp%ebp%bp%bpl%rsp%esp%sp%spl%r8%r8d%r8w%r8b%r9%r9d%r9w%r9b%r10%r10d%r10w%r10b%r11%r11d%r11w%r11b%r12%r12d%r12w%r12b%r13%r13d%r13w%r13b%r14%r14d%r14w%r14b%r15%r15d%r15w%r15b指令源数据1.常数2.取自寄存器3.取自内存指令结果存储1.寄存器2.内存寻址模式Imm(rb, ri, s)对应的有效地址为ImmR[rb] R[ri] * s例子操作数数值描述$ImmImm数值为ImmraR[ra]数值在寄存器ra内(ra)M[R[ra]]从寄存器ra内取地址从地址所在内存处取值Imm(rb, ri, s)M[ImmR[rb]R[ri]*s]计算地址为ImmR[rb]R[ri]*s再从地址所在内存处取值程序的用户栈从栈底逐渐扩展。扩展方向是虚拟地址不断减少的方向。指向栈顶对象的虚拟地址小于指向栈底对象的虚拟地址。条件码寄存器标志位意义描述CF进位标志最近的操作是否让最高位产生了进位ZF零标志最近的操作得出的结果为0SF符号标志最近的操作得到的结果为负数OF溢出标志最近的操作导致一个补码溢出局部数据需要放在内存的情形为了提升效率一般情况下局部变量存储在寄存器中。1.寄存器不足以存放所有本地数据2.对局部数据用了3.局部变量是数组或结构内存对齐任何k字节的基本对象的虚拟地址需要是k的倍数。汇编代码中使用.align x指明全局数据所需的对齐。举例structs2{inti;intj;charc;};structs2a;structs2d[4];为了保证任意s2类型实例中字段ij的地址可被sizeof(int)整除必须要求1.对i对象内偏移为0对j对象内偏移为4。2.对s2的实例对象对象起始地址需要可被4整除。进一步考虑s2类型数组下每个数组中对象实例起始地址需要可被4整除所以每个s2实例实际占据的内存尺寸是12字节。函数指针的值是该函数机器代码表示中第一条指令的地址。指令流水线指令分解指令分解描述取值PC地址处获取指令译码执行访存数据写入内存/从内存读数据写回写结果到寄存器文件更新PC顺序执行时的问题一个时钟周期需要足够大以使信号能在一个周期内传播所有阶段。流水线提高了系统单位时间内服务的顾客总数。对单个顾客可能会增加完成任务所需时间流水线的目的是每个时钟周期都发射一条新指令。需在取出当前指令后马上确定下条指令位置。数据相关下条指令会用到上条指令结果控制相关下条指令位置由上条指令确定用暂停来避免数据冒险转发【用上一指令计算中间数据作为本指令数据来源】综合使用暂停转发插入气泡【让已进行的指令变为无效】指令执行速度CPU 的硬件参数都会有GHz这个参数比如一个1GHz 的CPU指的是时钟频率是1G代表着1秒会产生1G次数的脉冲信号每一次脉冲信号高低电平的转换就是一个周期称为时钟周期。对于 CPU 来说在一个时钟周期内CPU 仅能完成一个最基本的动作时钟频率越高时钟周期就越短工作速度也就越快。一个时钟周期一定能执行完一条指令吗答案是不一定的大多数指令不能在一个时钟周期完成通常需要若干个时钟周期。但通过流水线技术基本可以做到每个时钟周期将一个新的指令投入运行。一个老的指令执行完其最后一个周期。内联在原本要调用函数的地方直接展开消除了函数调用的开销。提升程序性能设计时间复杂度良好的算法避免不必要的多次求值和函数调用减少不必要的内存访问对不可预测的分支采用条件传送代替分支预测循环展开技术利用时间局部性空间局部性