第一部分:计算机硬件工作原理

1.1 硬件与电压信号

⭐ 老师强调:计算机硬件本质是半导体电路,通过输入电压信号(0/1)进行数据处理和输出。0和1本身不是机器语言,对应的电压信号才是机器识别的语言——电路只认电。

核心原理:

  • 硬件本质是闭合电路
  • 输入电压信号(高电压=1,低电压=0)
  • 电路计算后输出电压信号
  • 多根导线并排可同时表示复杂信号
输入电压(二进制) → 电路处理 → 输出电压(结果)
      ↓                    ↓
  高/低电压信号        计算结果电压信号

⭐ 老师强调:半导体让闭合电路有了"智力"。半导体随电压改变导电率,在导体与绝缘体间切换,不同导线组合作用于不同半导体,呈现不同导电性,输出结果就不同。硅谷即因此得名。

1.2 单入单出 vs 多入多出

类型特点能力
单入单出单根导线仅高/低两种电压信号,信息量有限
多入多出多根导线并排可同时表示复杂信号,实现复杂功能

⭐ 老师强调:单导线仅两态,多线并行才撑得起复杂信号传输处理。越多电压信号同时输入,信息总量越复杂,实现功能也越复杂。

第二部分:驱动层

2.1 为什么需要驱动

⭐ 老师强调:人无法直接控制硬件的电压信号——不知怎么发、控、收电压。因此硬件被封装成驱动层,把硬件操作封装成函数,用户调用函数即可,不必管底层电压。

硬件操作(电压信号)
        ↓
    驱动层(封装成函数)
        ↓
   用户调用函数

2.2 驱动的本质

⭐ 老师强调:所有硬件都自带驱动,只需与驱动对接,而对接必须依靠C语言。硬件驱动会把数据译成电压信号发过去,算完返回的数据其实也是电压信号。

驱动的作用:

  • 屏蔽硬件操作细节
  • 提供函数接口供调用
  • 把输入数据翻译成电压信号
  • 把输出电压翻译成返回数据

⭐ 老师强调:买硬件必定自带驱动,找卖方或官网都能拿到。硬件不管用先排查驱动状态(真坏 vs 假坏),再判硬件故障,避免误判。

第三部分:操作系统内核

3.1 内核的由来

⭐ 老师强调:当多个硬件需要协同工作时(如播放网络视频需网卡、显卡、声卡、内存、硬盘、CPU配合),为简化编程便产生了操作系统内核。

播放视频的硬件协同:

  • 网卡:接收网络数据
  • 内存:暂存数据
  • CPU:总调度
  • 显卡:处理画面(几十万像素点,每秒刷新几十次,CPU跟不上)
  • 声卡:处理声音
  • 硬盘:存储数据

⭐ 老师强调:CPU不直接驱动屏幕——显示信号规模与刷新频率太高,CPU算力被占满,所以需专项硬件(显卡)分流。

3.2 内核的本质

⭐ 老师强调:操作系统内核负责协同调度底层硬件,封装了复杂的硬件协同工作流程。内核把基本操作封装成函数库,供上层调用。

内核产生过程:

硬件驱动 → 协同调度函数 → 函数库封装 → 操作系统内核

⭐ 老师强调:写操作系统内核并不难——先了解硬件驱动,再通过协同调度写出函数,几个月就能写一个简单的。难点在于写出来后没人用(推广难),而非开发难。

3.3 操作系统三层结构

┌─────────────────────────────────────────────┐
│  上层应用 / 用户界面层                       │  ← 用户交互
├─────────────────────────────────────────────┤
│  操作系统内核层                             │  ← 硬件协同调度
├─────────────────────────────────────────────┤
│  硬件驱动层                                 │  ← 硬件操作封装
└─────────────────────────────────────────────┘

⭐ 老师强调:内核相对稳定、不常变化。程序若只依赖内核、不依赖其他层,就能在不同版本的同类型系统上运行——这就是系统兼容的本质。

第四部分:程序运行机制

4.1 程序与C语言的关系

⭐ 老师强调:任何语言编写的程序最终都需被翻译成C语言,才能在操作系统内核层面调用硬件。操作系统底层基本是纯C写的,硬件也认C语言,C与硬件交互最快,没有中间翻译损耗。

语言执行流程:

Java/Python/C++ → 翻译成C语言 → 操作系统内核 → 硬件

⭐ 老师强调:高级语言哪怕再高级,本质也是为了调硬件,必须转成C才能跑。C语言快是因为它离硬件最近。

4.2 主函数(程序入口)

⭐ 老师强调:任何能运行的程序都必须有主函数(main),程序从主函数开始执行。主函数能接收外界或操作系统的刺激(如双击程序)。

主函数特点:

  • 程序入口
  • 可接收参数(如文件路径)
  • 死循环让程序持续运行
  • 退出时改变循环变量中断程序
int main(int argc, char* argv[]) {
    // 程序从这里开始执行
    // argv[] 可接收外部传入的参数
    while (running) {
        // 持续运行
    }
    return 0;
}

⭐ 老师强调:Python、JS等语言看似没主方法,实际也有,只是平时可不写。没写主方法的程序不能独立运行,得依赖其他带主函数的程序"刺激"才跑得起来。

4.3 .exe文件本质

⭐ 老师强调:.exe本质上是压缩包。双击安装实际是操作系统对其解压,生成文件夹。

安装包内容:

  1. 程序文件(一堆.exe等)
  2. 配置文档(按微软标准配置)
  3. 资源文件(图片如logo等)

⭐ 老师强调:后缀名只是个标记,任意后缀都行(如.aa、.mm)。Java、Python等都能打包成exe,靠的是各语言开发团队按系统公开对接标准实现。

4.4 程序启动流程

双击程序
    │
    ▼
系统获取程序名
    │
    ▼
查注册表 → 找到主函数路径
    │
    ▼
启动主函数 → 程序运行

⭐ 老师强调:注册表像系统的"通讯录",图标只留名字,真实位置靠查注册表找到。主方法路径不是靠快捷方式本身直接存的,而是双击时通过注册表映射找到的。

4.5 文件打开机制

⭐ 老师强调:双击文件时,操作系统通过文件扩展名在注册表中查找默认的解析程序,调用该程序的主函数,并将文件路径作为参数传递。

双击文件(如 a.docx)
        │
        ▼
系统取扩展名(.docx)
        │
        ▼
查注册表 → 找到能解析.docx的程序
        │
        ▼
将文件路径传入主函数参数
        │
        ▼
程序按路径读取文件并展示内容

⭐ 老师强调:扩展名与程序是多对多关系。多个程序能解析时,用户选择默认程序后固化下来。双击主函数时,文件路径作为argv参数传入,程序据此去硬盘上找文件并解析。

附录:核心概念关系图

                      用户
                       │
                   双击程序/文件
                       │
                       ▼
              ┌─────────────────┐
              │  操作系统上层    │  ← 用户界面、文件管理
              ├─────────────────┤
              │  操作系统内核    │  ← 硬件协同调度(稳定)
              ├─────────────────┤
              │   驱动层        │  ← 硬件操作封装
              ├─────────────────┤
              │   硬件          │  ← 半导体电路(电压信号)
              └─────────────────┘

语言执行链:Java/Python/C++ → 翻译成C → 内核 → 驱动 → 硬件

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐