• 学习交流加(可免费帮忙下载CSDN资源):
  • 个人微信: liu1126137994
  • 学习交流资源分享qq群1(已满): 962535112
  • 学习交流资源分享qq群2: 780902027

深入浅出处理器这几篇文章可能你觉得对软件开发用处不大,这个看个人理解吧,若是想贯通上下,知其然还要知其所以然的话,或许还是有点用处的。学习处理器的篇章非常少,花一点时间学一下也无所谓的!

在我之前还是做硬件的时候,我一直不理解微处理器和微控制器的区别。
之前写过一篇文章,讲X86处理器的,可以点击查看:X86处理器

文章目录

  • 1、 处理器
    • 1.1、寄存器分类
    • 1.2、处理器中的关键寄存器
    • 1.3、处理器的IO操作
  • 2、硬件设计的关键
    • 3、处理器的启动过程
  • 4、总结

1、 处理器

处理器分为两种:微处理器和微控制器。

微处理器与微控制器有以下区别:

  • 微处理器

    – CPU

  • 微控制器

    –CPU + 片内内存 + 片内外设

注意:

  1. 微控制器具有成本低,功耗低等优点,常用于嵌入式系统设计
  2. 对于软件工程师而言,微处理器与微控制器没有任何区别

其中,CPU与外设(包括微控制器的片内外设与片外外设)都有寄存器,但是它们的用处却是非常的不一样。之前写过的X86处理器那篇文章中,已经讲了一些X86处理器的寄存器的用处,大致就是存储数据的,但是微控制器上的外设中的寄存器,不是用来存储数据的,而是用来控制外设的行为和工作方式的。

1.1、寄存器分类

  1. CPU寄存器

    – 专用指令执行,数据运算, 变量处理,参数传递

  2. 外设寄存器

    – 用于控制外设的行为和工作方式、

    –寄存器值的配置需要查看相应的硬件手册

1.2、处理器中的关键寄存器

今天我们只了解两个寄存器:PC程序计数器寄存器,SP栈指针寄存器。

  • PC程序计数器(指令指针寄存器IP)

    – PC实际上就是代码中的每一条指令的地址,这个地址刚好就是内存中代码段中的偏移地址

    –每执行一条指令,PC中的值,就会发生变化

    – PC始终保存着一条指令,这条指令就是CPU即将要执行的那条指令(下一条要执行的指令)

  • SP栈指针(Stack Pointer)

    –SP寄存器,始终保存着栈空间的栈顶地址,实现LIFO特性

    – SP栈指针用于保护函数调用的现场,比如中断断点,通用寄存器,函数的返回值等。具体如何保护,在以后的文章中会讲解

具体使用方法,会在后面的文章中讲解,今天暂时知道这两个寄存器的概念与用法。

1.3、处理器的IO操作

众所周知,一台电脑有很多外设,USB,声卡,显卡等,这些都是外设。那么处理器是如何与外设进行数据通信的呢?

处理器与外设之间的通信通过IO操作完成。

那么既然有IO操作,肯定是要有CPU去寻址的过程,在CPU所能寻址的范围内,找到外设的地址,对该地址进行读写就可以与外设进行通信。那么外设如何通过IO将自己的地址空间映射给CPU的寻址空间呢?

  • 通过内存映射IO空间

    – 外设通过精密的硬件链接映射到CPU的寻址空间。

    – 然后CPU通过地址访问与外设进行数据读写访问

  • 独立的IO空间

    –外设独立于CPU的地址空间,无法通过CPU的寻址来与外设进行通信

    – 此时,需要使用专用的指令与外设进行通信

上面是CPU与外设的基本通信方式,我们不必纠结于具体的硬件实现,毕竟我们是做软件开发。

那么,CPU现在可以与外设进行通信了,那么CPU如何操作外设呢?

  1. 通过IO端口配置控制寄存器
  2. 通过IO端口读取数据寄存器

从软件工程师的角度来看,只要对不同的IO端口读写,就可以操作外设;读写IO端口时候的具体值和意义需要查询具体的硬件手册。

2、硬件设计的关键

上一节我们知道了CPU是如何与外设打交道的。那么在硬件上,大概设怎样的设计呢?

首先CPU与外设之间要有地址总线与数据总线,然后需要有一个片选信号用来确保是否“启动”该外设。

通过具体的硬件设计,可以使地址总线上的值在某个范围时,片选信号为“真”,即:使能连接的外设,从而读取相应地址中的数据!!!

具体的硬件如何设计不去细究,这里知道大概原理即可,

3、处理器的启动过程

在一开始,我们的电脑是没有操作系统的,那么处理器是如何启动的呢?

  • 处理器启动后,PC(IP)寄存器固话了一个默认值
  • PC默认值决定了CPU上电后第一条执行指令在哪
  • 第一条执行指令,是CPU的启动程序BIOS(BIOS以后讲解)

下图为CPU简易的启动过程

大致了解一下BIOS:

固化于硬件中的一个程序,用于初始化硬件,然后将指令指针寄存器PC(IP)指向主引导扇区程序,主引导扇区程序再来引导操作系统内核的自举程序,然后启动操作系统。(后期会专门学习操作系统,现在暂时不用了解)

4、总结

基础不牢,地动山摇。上来就提倡看各种源码的,不是大牛就是菜鸡。大牛很少,菜鸡很多。

本系列文章几乎全部参考狄泰软件学院相关课程,想学习的可以加群,
群聊号码:199546072

学习探讨加个人:
qq:1126137994
微信:liu1126137994

【软件开发底层知识修炼】一 深入浅出处理器之一 微处理器与微控制器相关推荐

  1. 【软件开发底层知识修炼】二十七 C/C++中的指针与数组是不同的

    上几篇文章学习了ABI-应用程序二进制接口:[软件开发底层知识修炼]二十六 ABI-应用程序二进制接口 学习总结文章目录 本篇文章就指针与数组的联系与区别来学习学习 文章目录 1 疑问 2 指针与数组 ...

  2. 【软件开发底层知识修炼】二十二 ABI-应用程序二进制接口 二

    上一篇文章学习了ABI的相关内容,具体最后分析了不同ABI下结构体的对齐方式的不同.点击链接查看上一篇文章:[软件开发底层知识修炼]二十一 ABI-应用程序二进制接口一 本篇文章继续学习ABI相关内容 ...

  3. 【软件开发底层知识修炼】二十八 C/C++中volatile的作用

    上一篇文章学习了C/C++中的指针与数组的区别,点击链接进行查看:[软件开发底层知识修炼]二十七 C/C++中的指针与数组是不同的 本篇文章将学习volatile关键字在C/C++中的作用 文章目录 ...

  4. 【软件开发底层知识修炼】二十六 ABI-应用程序二进制接口 学习总结文章目录

    前面学习了ABI的知识,感觉受益良多.对底层与编译器有更加深刻的认识,为此这里将前面写过的关于ABI 的文章给列出来,方便学习与翻阅. [软件开发底层知识修炼]二十一 ABI-应用程序二进制接口一 [ ...

  5. 【软件开发底层知识修炼】二十五 ABI之函数调用约定二之函数返回值为结构体时的约定

    上一篇文章学习了几种函数调用约定的区别,点击链接查看上一篇文章:[软件开发底层知识修炼]二十四 ABI之函数调用约定 本篇文章继续学习函数调用约定中,关于函数返回值的问题.当函数返回值为结构体时,函数 ...

  6. 【软件开发底层知识修炼】二十四 ABI之函数调用约定

    上一篇文章学习了Linux环境下的函数栈帧的形成与摧毁.点击链接查看相关文章:软件开发底层知识修炼]二十三 ABI-应用程序二进制接口三之深入理解函数栈帧的形成与摧毁 本篇文章继续学习ABI接口相关的 ...

  7. 【软件开发底层知识修炼】二十三 ABI-应用程序二进制接口三之深入理解函数栈帧的形成与摧毁

    上两篇文章我们初步接触了ABI-应用程序二进制接口的概念,点击链接查看上一篇文章:[软件开发底层知识修炼]二十二 ABI-应用程序二进制接口 二.了解了为什么会有ABI的存在.本篇文章继续学习ABI ...

  8. 【软件开发底层知识修炼】二十 深入理解可执行程序的结构

    上一篇文章记录了GDB调试从入门到熟练掌握的学习全过程.点击链接查看:[软件开发底层知识修炼]十九 GDB调试从入门到熟练掌握超级详细实战教程学习目录 还记得在以前的学习Binutils工具的时候,学 ...

  9. 【软件开发底层知识修炼】十九 GDB调试从入门到熟练掌握超级详细实战教程学习目录

    本文记录之前写过的5篇关于GDB快速学习的文章,从第一篇开始学习到最后一篇,保证可以从入门GDB调试到熟练掌握GDB调试的技巧. 学习交流加 个人qq: 1126137994 个人微信: liu112 ...

  10. 【软件开发底层知识修炼】十八 快速学习GDB调试五 使用GDB进行调试的一些小技巧

    上一篇文章学习了如何使用GDB进行函数调用栈的查看:[软件开发底层知识修炼]十六 快速学习GDB调试四 使用GDB进行函数调用栈的查看 本篇文章是GDB调试快速学习系列的最后一篇.将综合前几篇文章做一 ...

最新文章

  1. C/C++ 面试题基础知识
  2. 160 - 18 Brad Soblesky.1
  3. 距离高考出成绩,一年了、、、
  4. PHp批量推送数据太慢,PHP非阻塞批量推送数据
  5. java_web学习(六) request对象中的get和post差异
  6. 彻底理解position与anchorPoint - Wonderffee's Blog(转)
  7. bzoj 1050: [HAOI2006]旅行comf(尺取+最短路)
  8. 配置vps服务器,拨号换ip(一)
  9. 我的全栈之路-Java基础之Java企业级项目开发环境搭建
  10. javascript如何获取html中的控件,Javascript-dom总结(获取页面控件)
  11. Vscode(arduino框架) 开发ESP32 _01_电容Touch和外部中断
  12. Android 实现HTTPS自签名证书(非常详细)
  13. vscode远程连接服务器操作方法
  14. 如何在自己的电脑开服务器(内网穿透)
  15. The error may exist in bshr/mapper/PfmMapper.xml ### The error may involve defaultParameterMap
  16. 2021-WWW-Learning Intents behind Interactions with Knowledge Graph for Recommendation
  17. 趣文:三分钟了解敏捷开发
  18. 【渝粤教育】电大中专计算机职业素养 (12)作业 题库
  19. Android AES加密解密
  20. 侯,旬,月,季,年转换为时间

热门文章

  1. 第五十三期:公司如何选择数据库?DynamoDB、Hadoop和MongoDB 大比拼
  2. 第三十三期:连接池中非常关键的两个参数,到底是干啥用的?
  3. java学习(24):if..else...if
  4. Qt treeWidget 查找指定字段内容的条目并跳转到该条目
  5. Qt ModbusTCP ModbusRTU 使用同步读和异步写
  6. (理论)数据库建模三步骤:概念模型-逻辑模型-物理模型
  7. DHCP的4步租约过程
  8. 使用 ServiceStack 构建跨平台 Web 服务(转)
  9. GridView控件RowDataBound事件中获取列字段值的几种途径
  10. 用 GDI 操作 EMF 文件[6]: GetEnhMetaFileHeader - 获取 EMF 的头文件