指令相关和流水线冲突
什么是指令相关? 例如,在标准的五级流水线中,第N条指令写R1寄存器,第N+1条指令需要读R1寄存器做运算。由于五级流水线的结构,第N条指令在第五级才将数据写回R1寄存器,而第N+1条指令则在第二级(第N条指令的第三级)就需要从寄存器堆中取R1寄存器的数据,由于此时第N条指令并未写回,因此第N+1条指令只能取到旧的R1寄存器值,导致运算错误,这就是指令相关。 指令相关 指令相关可以分为...
什么是指令相关? 例如,在标准的五级流水线中,第N条指令写R1寄存器,第N+1条指令需要读R1寄存器做运算。由于五级流水线的结构,第N条指令在第五级才将数据写回R1寄存器,而第N+1条指令则在第二级(第N条指令的第三级)就需要从寄存器堆中取R1寄存器的数据,由于此时第N条指令并未写回,因此第N+1条指令只能取到旧的R1寄存器值,导致运算错误,这就是指令相关。 指令相关 指令相关可以分为...
计算机体系结构 胡伟武老师下的定义:计算机体系结构是一门研究计算机软硬件之间的关系的学问。需要“上知天文,下知地理” 什么是计算机? 计算机是人们为了满足各种不同的计算需求而设计的自动化设备。大到一个大屋子放不下,小到电饭煲上的控制模块,这些都是计算机,都是计算机体系结构的研究范围。 计算机的基本组成 冯诺依曼结构:运算器、控制器、存储器、输入和输出五个部分,但是这不是最核心的东西。现...
现在系统中已经存在一个进程0了,进程0要做的第一件事的就是作为父进程调用fork函数创建第一个子进程—进程1。以后,所有进程都是基于父子进程创建机制由父进程创建而来。 进程1的创建 进程0触发0x80中断,进入fork函数 除了进程0是由内核直接创建之外,Linux操作系统的所有进程都是由父进程调用fork函数创建的。流程是这样的: 进程调用fork函数—>fork函数...
这章从main函数开始介绍,main函数执行之前的流程已经全部讲完了。 本章讲的主要是设备初始化和激活进程0两个部分,实际上设备初始化的内容对于理解学习操作系统并不重要,一带而过即可。 设置根设备、硬盘 内核首先初始化根设备和硬盘,使用bootsect中写入机器系统数据0x901FC的根设备(bootsect做的最后一件事)为软盘的信息,设置软盘为根设备,并用起自0x90080...
主要留作作者复习使用,默认读者懂得一些基本的X86体系结构知识 启动BIOS,准备实模式下的中断向量表和中断服务程序 现代的X86架构的机器在上电后会默认进入实模式(16位数据线、20位地址线,功能受限),执行BIOS,这是为了兼容以前的程序。 为什么开始启动计算机的时候,执行的是BIOS代码而不是操作系统自身的代码? 因为操作系统存在于外部存储设备上,不在内存中,上电时内...
概述 解决多任务共享资源冲突问题的三个方法: 关中断:此方法屏蔽所有中断,若中间代码过长,严重影响性能 调度锁:此方法不允许任务切换,若代码过长也会对性能造成较大影响 信号量:此方法使用信号量实现同步与互斥,但信号量不支持嵌套调用、不支持所有者,即任意任务都能进行Post操作,且无法处理优先级反转操作 解决方法:互斥信号量 互斥信号量使用可以用于嵌套调用的锁定次数计数...
概述 事件标志组是为了方便在ISR与任务之间传递事件标志,事件标志就是一个bool值,来指示事件是否发生。例如:一个任务运行一段时间后需要等待一个按键输入(事件标志)才能继续运行,而ISR中则可以检测到这个按键输入(事件标志),我们需要一种功能,将这样的事件标志进行传递。(信号量,邮箱的合理使用也是可以实现这种功能的) 有些任务可能需要等待多个事件标志才能继续运行,这个时候就需要一组事件标...
概述 不实现malloc等函数的原因:RTOS的使用场景中,内存是比较珍贵的资源 频繁的进行任意大小而定内存分配可能会产生很多不连续的细小的外部碎片,导致无法再次分配。 代码实现比较复杂,分配和释放过程操作时间不确定 ** 是否真有需要分配做任意大小的存储空间? ** 从程序的最底层往上到应用层,所有东西开发都是完全可见的。 针对特定场合开发,有时存储空间分配大小的种类通常...
概述 邮箱是一种任务间通信的工具,主要用于不同数据之间的数据传递。 功能 数据传输 邮箱允许一个任务向另一个任务发送固定大小的数据块(通常是一个指针或者直接包含一定字节数的数据) 发送方将数据放入邮箱中,接收方从邮箱取出数据,从而实现任务间通信 同步机制 当接收任务等待特定数据时,它可以阻塞并等待邮箱中有新的...
概述 信号量就是一个带事件控制块的计数器,在其上定义了三个操作: 可以被初始化为一个非负数。 wait操作:若该信号量值为0,则将当前任务阻塞在该信号量上,否则将计数值减1。 post操作:若有任务阻塞在改信号量上,则唤醒其中一个任务,否则计数加一。 实现 信号量就是一个事件控制块加上一个计数值,同时可以设置一个最大值,定义非常简单: // 信号量的定义 typedef s...