摘要:很多初学者一提到计算机,满脑子都是机箱、显示器、键盘鼠标。但如果你立志成为一名嵌入式软件工程师,就必须穿透表象看本质。本文从信息表示、程序分类、计算机组成、存储体系四大维度,带你建立完整的计算机硬件认知模型。文章最后会揭示冯·诺依曼体系留给程序员的两大“灵魂遗产”。
正文
1. 重新定义“计算机”:别被显示器骗了
绝大多数人对电脑的认知是:显示器+键盘+鼠标。但这是一个严重的认知误区。
在嵌入式工程师眼里,计算机的核心从来不是那些输入输出设备,而是那个不起眼的主机(或主控芯片)。
通用计算机:PC、服务器(追求算力与通用性)。
专用计算机:嵌入式设备(如单片机、树莓派、手机SoC)。它们虽然长得千奇百怪,但底层的逻辑完全一致。
2. 信息表示:万事万物终归于0和1
现实世界是连续的模拟信号,而IT世界是离散的数字信号。
抽象过程:我们并不关心事物的所有属性,只抽取我们关心的属性,并用数字来表示。
二进制的必然性:在众多数制(10进制、12进制、60进制)中,二进制因为其物理实现最简单(高电平/低电平,通/断),成为了IT世界的基石。
一个深刻的哲理:二进制数学的发明人莱布尼茨,深受中国《周易》八卦(阴与阳)的启发。可以说,伏羲八卦是二进制思想的“接生婆”。
3. 程序的分类与层次结构(决定你的职业方向)
计算机 = 硬件 + 软件。而程序,是连接二者的桥梁。
根据运行环境的不同,程序分为两种,这直接决定了你是做底层还是做应用:
裸机程序:直接跑在硬件上,没有操作系统支持。典型代表:单片机程序、BIOS、操作系统内核。
应用程序:必须运行在特定的操作系统之上,比如微信、游戏。
两种系统层次结构:
两层结构(硬件 + 裸机程序):这是嵌入式底层开发者的战场。要求你必须懂硬件原理图、懂汇编、精通C语言。
四层结构(硬件 -> 内核 -> 功能库 -> 应用):这是Linux/Windows开发者的世界。越往上走,离硬件越远,越偏向业务逻辑。
给新手的建议:无论你想去哪个层,C语言、系统编程、网络编程、数据结构都是无法绕开的“内功”。C语言是所有高级语言的基础,它拥有“上帝视角”,可以直接操作内存。
4. 计算机的组成:CPU与内存的“双核”真相
书上总说计算机由五大部件组成,但我们需要记住两个核心部件:CPU和内存。
我们可以用人体的器官来做一次降维打击式理解:
CPU(大脑):负责运算和控制。
内存(海马体):负责临时记忆。掉电即消失,但速度极快。
硬盘(大脑皮层):负责永久记忆。速度慢,但容量大。
主板(骨架):负责连接各部件。
嵌入式工程师的硬核认知:
计算机最核心的部件不是一个CPU,而是CPU和内存这两个。因为程序存储思想决定了:CPU执行的指令,必须先存在于内存中。
5. 一个经典的“炒菜”模型:彻底搞懂指令执行
笔记中“奴隶炒菜”的比喻非常精妙,我们可以将其映射为计算机的经典工作流程:
奴隶 = CPU。
抽屉 = 内存单元(每个都有唯一编号,即地址)。
纸条上的指令 = 机器指令。
取纸条 = 取指。
看纸条 = 译码。
拿菜/放菜 = 取数据/存数据。
CPU访问一次抽屉(内存)能拿多少个字节?
这取决于CPU的字长(单位是位)。比如32位CPU,一次能访问4个字节(32bit);64位CPU一次能访问8个字节。这就是为什么64位系统比32位系统处理大数据更快。
6. 计算机的存储体系:钱花在哪,性能就在哪
理解计算机的关键在于理解存储层次。从CPU内核到遥远的硬盘,速度与成本呈反比:
寄存器 (Registers):位于CPU内部,速度与CPU同频,成本极高,容量极小(KB级)。
高速缓存 (Cache):介于CPU和内存之间,用于缓解速度不匹配的问题(SRAM,KB-MB级)。
内存 (RAM):主力战场,掉电易失(DRAM,GB级)。
外存 (硬盘/Flash):永久存储,容量巨大(TB级),但速度比内存慢几个数量级。
嵌入式工程师感悟:在写驱动或优化代码时,如果能充分利用Cache(数据局部性原理),性能可能提升数倍;如果频繁触发缺页中断或访问Flash,系统可能卡顿。
7. 冯·诺依曼的两大灵魂遗产
冯·诺依曼被称为“现代计算机之父”,他留下了两条铁律,至今仍在指引我们编程:
贡献一:二进制思想
IT世界的一切信息,归根结底都是二进制位 + 上下文。
内存里存的1100 1101,如果上下文告诉CPU这是uint8_t,那就是数字205;如果上下文告诉这是char,那可能是一个字符。
这就是为什么C语言要有数据类型——数据类型就是告诉编译器,如何解释这串二进制位。
贡献二:程序存储思想(这是现代计算机的“灵魂”)
程序执行前,预先存放在内存里;CPU要执行的指令,不是从硬盘直接读,而是从内存中取指。
只要修改内存里的指令序列,计算机就能干不同的事情,这正是计算机“万能”的本质。
写在最后:给嵌入式新人的一点建议
学习计算机原理,不要死记硬背。抓住“CPU + 内存 + 总线”这条主线,理解数据流和指令流是如何流转的。
当你将来在C语言中写出int *p = (int *)0x40000000;时,你心里应该清楚:我正在告诉CPU,去物理内存地址0x40000000处,取出4个字节(32位上下文),当作一个有符号整数来处理。
这就是计算机工作原理在代码层面的终极体现。
原创不易,如果这篇文章帮你建立了对计算机的初步认知,欢迎点赞、收藏、转发,让更多初学者看到!