CPU
CPU(Central Processing Unit,中央处理器)
CPU 缓存 流水线Pipelining 超线程 Hyper-Threading
CPU调度(CPU Scheduling)和上下文切换(Context Switching)
让控制器从存储器中读取二进制并解释然后让运算器去计算数值
CPU核心组件:
算术逻辑单元(ALU):执行算术和逻辑操作。
寄存器文件:包含通用寄存器和特殊寄存器,如程序计数器(PC)。
控制单元:解码指令并生成控制信号。
流水线结构:提高指令执行效率。
01.ALU四要素:
操作码(Opcode) Instruction
操作数(Operand)
运算结果 Result
和标志位 Falgs
操作数和运算结果--》寄存器Registers 以及DataMemory
指令
标志位--status 寄存器
指令寄存器(IR,Instruction Register),用于暂存当前正在执行的指令
指令寄存器--指令顺序执行和指令跳转执行
程序计数器(Program Counter Register) 是用于存放下一条指令所在单元的地址的地方--指令计数器
跳转后返回原位置--初期采用 程序返回地址寄存器--后续采用了栈的结构(stack) 先进后出
cs(Code Segment)是硬件CPU中的代码段寄存器
变量太多了,寄存器不够用,
需要用内存来存变量,这时候遇到的本质问题就类似于寄存器保存的问题,都是要在内存中开辟一片空间
栈--一段连续的存储空间 堆栈寄存器Stack-pointer 栈溢出 顺序执行和跳转执行pc+offset
对应编程中的--函数返回值地址 栈区主要用于存储局部变量、函数参数和返回地址等
(Stack Frame)
Stack Leak(栈泄漏) overflow 一般发生在递归函数或者函数中有大循环,其有定义局部变量
越界访问--跑飞了
Stack Frame Corruption栈帧破坏
栈是多线程编程的基石: 在操作系统中 上下文切换
堆 heap 向下分配--
内存管理不当,会导致内存泄露(堆泄露)。而内存泄漏可能会堆栈的不足,进而出现堆栈溢出
堆内存泄漏(heap leak),是程序员在分配一段内存后,分配的内存未被释放且无法再次访问时发生
Buffer overflow(缓冲区溢出):固定大小缓冲区的写操作超出其边界
缓冲区溢出经常导致堆栈上的数据被覆盖
Memory Allocation Failed
请求大量内存时,可能会因为内存不足或者没有足够的连续内存导致分配内存失败。
电路--存储器--地址
存储器单元实际上是时序逻辑电路的一种
存储器内部结构由地址译码器、存储单元、控制逻辑电路等部分组成
地址--从编程和硬件的抽象上看
硬件电路 --有序的高低电压--指令--一套驱动编码-CPU识别的0/1机器码---程序--软件只是对硬件的一种反映
控制单元
取指令->解码->执行
控制单元”负责选择正确的寄存器作为输入,并配置ALU执行正确的操作,同时作为缓冲区保存ALU计算结果
“时钟”来负责管理的。时钟以精确的间隔,触发电信号,控制单元会用这个信号,推进CPU的内部操作,确保一切按步骤进
时钟周期
开关的通断 程序本身就是高低电平的组合 通过数字电路得到一种逻辑实现
译码电路
内存是计算机中重要的单元,而堆栈是内存中最重要的应用组成。
实际执行中 :动态内存分配
在标准工作负载、最小负载和最大负载下,对真实目标运行堆栈分析,以全面了解堆栈的使用情况
工具链
编译工具链,包括编译器(如 GCC)、汇编器、链接器等
操作系统管理硬件资源,提供多任务、内存管理等功能
CPU的减、乘、除都是基于加法、移位等操作实现的。
加法过程依赖CPU的ALU累加器,
累加器背后的电路是数字电路异或门和与门的组合
语言特性
高级语言,离机器很远,但是很容易被人的逻辑理解
C++程序中,不必要的对象复制会导致额外的CPU和内存开销。使用移动语义和引用(尤其是右值引用)可以避免这种开销
学习往往伴随着不断的试错和调整,这就像是我们的大脑在逐渐优化其解决问题的“算法”
C语言中的动态内存管理为我们揭示了计算机内存的工作机制
C语言来进行编程,你就必须要了解计算机工作原理方面
了解数据结构和算法
C++ 编译错误、运行错误、链接错误
编译错误:
书写错误和用法错误
链接错误
找不到库文件
库文件和项目工程版本不一致
运行错误
数组越界访问,除数位零
示例:
空指针 在访问指针之前,务必检查其是否为空
悬挂指针 指向动态分配内存的指针在释放内存后仍被继续使用
缓冲区溢出--数组越界写入--使用 C++11之后的std::string
无符号整数溢出 不恰当的数组边界检查
未捕获的异常 未正确关闭文件 动态内存分配和释放不匹配 全局对象的时序和作用域问题
浮点数精度丢失 隐式类型转换 无符号整数循环条件错误 错误的类型转换
字符串字面量和字符数组混淆
多线程竞争条件:
多个线程同时读写同一数据,未加锁保护。 使用互斥量(mutex)或其他同步机制保护共享资源
死锁:两个线程分别持有对方需要的锁,互相等待导致死锁 遵循锁的获取顺序一致性原则,或者使用更高级的并发原语避免死锁
参考
ARM控制器与嵌入式系统 清华大学 曾鸣 https://www.blazar.org.cn
嵌入式系统与μC/OS实时操作系统
标签:--,C++,嵌入式,内存,寄存器,堆栈,CPU
From: https://www.cnblogs.com/ytwang/p/18590217