计算机“拆机”

粗看计算机

计算机的种类其实很丰富,手机、PC、服务器甚至你家的智能家电都是一个计算机。这里以PC作为例子来讲述我眼中的计算机。

拆过或者装过电脑的人都知道,PC包括CPU、内存、硬盘、主板、GPU、USB接口等等,甚至还有TPM模块等安全芯片。但这样去看一台计算机,还是过于简单了。还是得整点原理性的东西。

我将主要讲讲CPU、OS的故事

硬盘

硬盘有常见的机械硬盘、固态硬盘,机械硬盘是通过磁信号来保存数据的,固态硬盘是基于闪存技术,通过电信号来记录数据。硬盘在断电情况下是不会丢失数据的。

我们往往会将OS从硬盘的0位置开始保存(比如机械硬盘中的0磁道0扇区)。实际上,Linux0.11中,在我们按下开机按钮那一刻,我们会先加载0xFFFF的一段代码,它会将从0位置开始的OS给加载起来。为什么是0xFFFF,这就是历史原因以及厂商之间的协商和约定形成的。可以参考《Linux内核设计的艺术》

内存

内存保存了我们实际要跑的正在运行的代码,比如操作系统和你的程序,操作系统最初会保存在硬盘中,就像一个木偶,只有加载到了内存,它才是个活生生的“人”。

内存中的数据是断电时会消失的,它的作用在于它比硬盘速度快,能够更好地与CPU合作完成任务,完成“取指令、执行”的任务。不过后来缓存又出现了。

比如我的内存条是海力士的,上面镶嵌着4颗花了我血汗钱的内存颗粒。

主板

主板是各类硬件之间的链接桥梁,将内存、硬盘、CPU、GPU等等进行了链接。主板本身起到了解耦的过程,将一整个计算机解耦成若干个硬件设备。

主板就像一个桥梁,连接着你我他。沟通的协议有PCIE协议等,非常出名的协议包括NVME,现在常见的固态硬盘都用的这个协议,好处是快,真的很快!现在一般用的都是M.2接口了,几年前还是SATA接口比较多。

CPU

CPU可谓计算机的大脑、灵魂。CPU本身就是一个很长的故事了。

CPU是通过无数多的晶体管组成的,我们表面看过去是一个亮闪闪的硅片,实际上里面的电路复杂的很。

CPU的晶体管CMOS包括了N沟道、P沟道。CMOS管能够帮助我们实现与、或、非三种位运算逻辑。这三种位运算逻辑向上构建起纷纷扰扰的计算机的大千世界。

CPU的硬件电路涉及语言主要是Verilog语言,与C语言等的最大区别在于,Verilog语言中的所有变量都是一个个具体的电路(你可以类别导线),电路与电路之间是没有先后关系的,所有操作是并发完成的。

CPU的工作说简单其实也简单,说复杂就很复杂了。总的来说CPU完成取指令、执行两步操作,不过如今的CPU至少包括了取指令、译码、执行、访存、写回这几步,实际中可能还远远不止。为什么要这么做呢,主要是为了提升CPU内部各个硬件模块之间的各步骤之间的并发程度,提升频率。简单地说就是为了让你CPU在成本基本不变的情况下,通过结构的改进,让CPU跑的更快。

为了进一步提升性能,CPU中增加了ALU旁路、内存旁路等结构,让CPU能够更好地偷懒,不过主要也是为了提升CPU速度。

此外,Intel所基于的CICS指令集为了效仿RISC指令集短小高频的优势,提出了微码的概念,因此多了一层CICS到微码的翻译过程。

什么,速度还不够快?那么就让指令乱序执行吧,但是仍需要保证指令顺序提交,毕竟代码指令的逻辑不能乱。这里有保留站来保存每个运算单元的待执行指令,顺带还需要记录指令间的依赖关系(比如数据依赖等)。如果只有保留站,那么顺序提交其实变得很麻烦,那么我们就增加一个Reorder Buffer,它来接受所有乱序执行的结果,并按照顺序提交指令,也就是说,对于你拿去杯子、喝水两个先后的逻辑不能被乱序成了你先喝水,然后拿起杯子,提交的时候依然按照先拿起杯子后喝水的顺序。

CPU提速的脚步从未停下,后来CPU中又被增加了缓存结构,常见的三级缓存,很多人的CPU都是三级缓存,大小在4M、8M等等。往往三级缓存中的第一级L1是CPU核独享的,而第三级LLC(Last Level Cache)是多个CPU核共享的。缓存与内存之间的映射关系常采用组相连映射,因为实践证明它比全相联、直接相联效果更加Nice。缓存的层级设置以及大小设置也是经验决定的,当然是考虑在尽可能低的成本下,毕竟CPU太贵的话,买的人可能就少了。

什么,速度还不够快?我们发现MMU对虚实地址转换速度很慢,那么就加上TLB把,专门用来保存虚拟地址到物理地址的直接翻译结果,不再需要MMU来慢吞吞的翻译了,我们直接查TLB就行了。不过TLB就好比一个小表格,里面能存的数量有限。最后值得一提的是TLB就好比是页表机制的缓存。

设备通过CPU来访存太慢怎么办?那么就用DMA直接存储器访问,外设和存储器之间直接去做朋友吧,省去CPU这个中间商(赚差价)。

CPU后来还提供了多核。我一个CPU里面比如有4、8个核,没每一个核都好比一个CPU,可以单独执行进程任务。一般10个核这个量级称为多核,再多就叫做众核了。

4个核远比一个强,因为他能同时处理4个任务了。还不够快?那么就有了超线程技术,我们发现CPU核经常有偷懒空转的时候,严格的监工绝不允许CPU核偷懒,那么CPU核你就去做两个任务把,你平时跑A线程,你偷懒的时候就去跑B线程吧。事实上,多线程对闲置的运算单元、访存单元等的进一步利用,不过后来为了支持多线程,CPU厂商往CPU中加入了更多的运算单元(???你这不是在套娃吗?)

什么,你还觉得不够快?那么多花一些大洋去买Intel至强处理器吧,实在不行去买一台超级计算机?。

CPU向上会提供指令集给上层软件具体使用,比如x86指令集、MIPS指令集(被龙芯买断了)、ARM、RISC-V等等。

那么谁来使用硬件指令集呢,当然是操作系统和你开发的程序咯~

CPU扩展和其他

CPU的研发不能止步,Intel对它的CPU后续提出了各种扩展功能,比如SSE(Streaming SIMD Extensions)、MPX等等。包括我最近主要在研究的Intel SGX。

我有一个梦想,希望有朝一日,安全也能够成为主流,大家买产品的时候看A比B多了某某安全功能,然后就都买A。那么就能让我们安全从业人员,尤其是底层安全从业人员能够找到工作,实现自我价值(自闭ing)。

哦,对了。多数CPU也面临着比如Meltdown、Spectre等侧信道攻击,这是前两年的热点话题。

操作系统

操作系统本身是一具木偶,躺在硬盘里面0开始的位置。不过我们按下开机按钮的时候,我们会从0xFFFF的位置将操作系统从硬盘0位置开始放到内存0开始的位置中。

然后会有中断向量表的初始化等等。

最终会有实模式到保护模式的转变。这是一个巨大的蜕变。会构建起中断描述符表IDT、全局描述符表GDT等等,此外关键的还有一个页表机制,页表机制的作用是让每一个进程都能拥有4G的地址空间。你看躺在主板上的内存条它可能也只有4G空间(不好意思,我的是16G),你看到的是物理内存,进程看到的是虚拟内存,虚拟内存是操作系统、编译器给进程提供的内存的抽象,进程自以为拥有4G内存,实际上,大部分所谓的内存还躺在硬盘里,只有最近在使用的躺在物理内存里,这个虚拟地址到物理地址的翻译过程有CPU中的MMU硬件来实现。这里用到了著名的局部性理论。

进程看到的内存布局可以参考我的另一篇博文《Linux内存机制浅见——从内存布局到线程局部存储TLS

操作系统之后会进一步完善中断向量表,比如来自鼠标键盘的硬件中断(也叫异步中断),来自除零错、缺页中断的软中断(也叫异常、同步中断)。还会创建进程0,所有进程的父亲,进而继续创建进程管理机制和进程1等等。有点像道生一,一生二,二生三,三生万物。

最后操作系统会运行你给的软件,然后卖力的工作。

我们联想一下计算机的远古时代,没有分页机制保护模式等等,那个时候所有的程序乱成一锅粥的运行。是不是可以看到操作系统的一个巨大的进步。

Linux系统提供了UGO访问控制,它能够帮助你更好地管理包括你的文件在内的各种大大小小的重要或者不重要的资源。

Android系统是基于Linux内核,额外提供了安卓运行时和库等等,此外在UGO访问控制基础上提供了权限机制,比如你的某个APP申请访问你的相机等等。

软件

有了操作系统和CPU等软硬件,你就可以打开你的浏览器,看看网页,比如我的博客,你也可以打开PUBG、LOL。

其他还有啥

目前想不到了。希望大家支持国产,中国第一台自主的计算机,龙芯CPU+统信OS+某某的外机似乎已经开始商用了。我们中科院软件所基础软件实验室的CPU、OS也在努力推进中,虽然我们的第一代CPU据说跑了Linux没几分钟就冒烟了。

龙芯最新的处理器号称已经达到了Intel、AMD主流的性能水平,网友们纷纷表示龙芯Yes。不过国产CPU似乎扩展特性不太有,安全扩展特性更不太有。

但是,总之。龙芯Yes,国产CPU Yes!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值