From bcaaa3f40a0f6547966e5230ea45f3b1fbdeca85 Mon Sep 17 00:00:00 2001 From: Li Bohai Date: Fri, 29 Nov 2024 08:17:15 +0800 Subject: [PATCH] feat: update basic-2 and fix typos (#35) 1. program execution 2. licenses introduction 3. OS overview 4. fix typo (#37) --------- Co-authored-by: HolgerHuo <50446405+HolgerHuo@users.noreply.github.com> Co-authored-by: AnterCreeper --- basic/03-computer-basic-knowledge-1.md | 165 +++++++++++++++++++------ 1 file changed, 130 insertions(+), 35 deletions(-) diff --git a/basic/03-computer-basic-knowledge-1.md b/basic/03-computer-basic-knowledge-1.md index 07f2129..d66b944 100644 --- a/basic/03-computer-basic-knowledge-1.md +++ b/basic/03-computer-basic-knowledge-1.md @@ -138,12 +138,16 @@ Intel 常年为 x86 的丑陋感到自卑。有一天在 HP 的“蛊惑”, #### GPU ![GPU](/assets/basic/03-computer-basic-knowledge-1/GTX980tiFE.jpg) -图 9. Graphic Process Unit, 也叫做显卡,有独立显卡和集成显卡两种,前者以一种通过 PCIe 接口连接的扩展卡或直接独立集成在主板(通常存在于笔记本或者一体机内)的形式存在,而后者直接存在于处理器 SoC 内部(故名集成)。 +图 9. Graphics Processing Unit, 也叫做显卡,有独立显卡和集成显卡两种,前者以一种通过 PCIe 接口连接的扩展卡或直接独立集成在主板(通常存在于笔记本或者一体机内)的形式存在,而后者直接存在于处理器 SoC 内部(故名集成)。 ![GPU_Internal](/assets/basic/03-computer-basic-knowledge-1/GPU_Teardown.jpg) -图 10. 一张独立显卡内部(图源自 TechPowerUp,途中显卡型号为 RTX4090),包含居中镜面的硕大的 GPU 核心,供电电路(具有标志性的电感,以实现降压,通常一个电感为一相大致提供 20A~40A 左右。图中有 26 个,故可以粗略估计出该卡大致峰值允许的功耗在 500W 左右)和围绕着核心的若干个显存芯片(通常称为显存颗粒,图中为 12 个,每个位宽 32bit 即 32 根数据线,合计 12\*2=24GB 大小 384bit 位宽)用于存储图像和计算数据。最左侧是四个视频输出接口,底部金色的 PCIe 接口接触点(通常成为金手指)插入主板上的插槽,与 CPU 相连。 +图 10. 一张独立显卡内部(图源自 TechPowerUp,图中显卡型号为 RTX4090),包含居中镜面的硕大的 GPU 核心,供电电路(一相包含一个电感以实现降压,通常每一相大致提供 20A~40A 左右。图中有 26 个电感(通常制作成方形的,体积较大比较明显),故可以粗略估计出该卡大致峰值允许的功耗在 500W 左右)和围绕着核心的若干个显存芯片(通常称为显存颗粒,图中为 12 个,每个位宽 32bit 即 32 根数据线,合计 12\*2=24GB 大小 384bit 位宽)用于存储图像和计算数据。最左侧是四个视频输出接口,底部金色的 PCIe 接口接触点(通常成为金手指)插入主板上的插槽,与 CPU 相连。 GPU 用于图形处理加速和视频输出(因此如果使用独立显卡输出,显示器视频线需要连到显卡的接口,而不是主板上的),同时包含了各类专用的加速单元(见第二章详细介绍)。(省流:可以用来玩原神) -后用于大量并行处理,如 AI,科学计算等等。虽然 GPU 的计算能力远远大于 CPU,但是各自特色分明: CPU 擅长控制和逻辑,单核处理能力强的多,适合各种通用的场合; 而 GPU 仅适用于并行且逻辑简单的计算,以其独特的架构取胜。 +后用于大规模并行计算,如 AI,科学计算等等。虽然 GPU 的计算能力远远大于 CPU,但是各自特色分明: CPU 擅长控制和逻辑,单核处理能力强得多,适合各种通用的场合; 而 GPU 仅适用于并行且逻辑简单的计算,以其独特的架构取胜。 + +::: info 显卡与 GPU +严格来说,GPU 是显卡上面主要的计算芯片,也可集成在 CPU 中,但是人们经常混用两个概念,我们在此也不严加区分。 +::: #### 主板 @@ -173,29 +177,51 @@ PCIe 由电源,一些辅助信号和若干条 Lane 组成,不同的 Lane 间 软件根据其功能不同也可以分为很多种,有一些软件是直接跟硬件打交道的,而另一些软件则直接跟用户打交道。前者包含操作系统和硬件驱动程序,而后者是我们平时使用的各类应用程序。另外,人们发现,各类软件有很多功能是相同的,于是人们开发了各种各样的“库”这个软件,为各个软件公用。 -操作系统和硬件驱动程序为上层的各类用户软件提供了对各种资源,比如处理器、内存、网络、各种外部设备如打印机等的统一抽象和管理,使得大部分应用程序在大部分不同的硬件上都能正确、安全、高效地运行,简化了应用程序员的工作,同时也将不同资源进行隔离,尽可能防止有缺陷或者恶意的程序影响其他程序运行。 +#### 保护和抽象 -#### 开机 +现代 ISA 都提供保护的功能。保护的功能主要是限制对资源的访问,比如虚拟内存技术,低权限的程序只能看到设定好范围的物理内存空间的内容,且是否可以修改,是否可以作为代码执行(回想冯诺依曼架构的内容,代码和数据并没有严格区分)也受到控制。除此之外,处理器提供了特权指令,如访问外部设备,修改保护权限,改变处理器工作模式等等,这些指令的使用也必须受到限制。 -当你给你心爱的电脑插上电源,按下开机键,会发生什么事情? +绝大部分的保护都会至少分为两种操作模式,一种叫内核模式(有时候也叫超级用户、特权模式、系统态、核心态、管态等),一种叫用户模式(也叫目态等),部分 ISA 还提供更多操作模式(比如 x86 提供权限从高到低 r0-r3 四个模式,但是主流操作系统只使用 r0 和 r3 两个模式,RiscV 提供机器、系统和用户三个模式)。简单理解,内核模式下,程序拥有对硬件软件资源(几乎)全部的访问权限;而用户模式下程序可进行的操作则受到限制,但是允许通过预先定义的接口,通过内核模式下的程序授权完成需要特权的操作。 -通常,我们称计算机的启动过程为 BOOT,来自于一个单词 BOOTSTRAP(靴子)。 -BOOTSTRAP 的意思是 靴带,来自短语:“Pull oneself up by one’s bootstrap”——用靴带将自己拉起来 +保护的功能既保护了整个计算机系统不受无意编写有缺陷程序和部分恶意编写的程序的破坏,也能更方便地提供抽象。比如操作系统借助硬件提供的虚拟内存技术,让应用程序拥有完整的虚拟地址空间,应用正序不再需要关心自己被加载到内存的哪个部分,只需要让操作系统完成地址映射和转换即可;又比如操作提供统一的文件访问接口,让应用程序不论是读写硬盘,读写软盘还是读写磁带都只需要使用统一的文件读写接口即可完成。 -通常在 CPU 或南桥(一个用于辅助 CPU 的芯片,包含了大量低速外设的控制逻辑)中存在着一个极其简易的待机控制电路,其只要在插上电后便会获得电源供应就会运转起来,等待外部的各种信号。 -当按下开机键的时候,信号经由嵌入式控制器传送至电源控制电路,随后其将启动内部的振荡器为 CPU 的工作提供时钟信号,并将 CPU 复位线以及外设复位线置位(在随后的 Advanced 教程中会具体说明),并启动主板上的电源降压单元。当降压单元稳定后其会输出 PWRGD(POWER GOOD)信号通知其取消 CPU 复位,CPU 开始进入工作状态。 -CPU 刚启动的时候,CPU 将从固定的位置内获取第一条指令,该地址被映射到 BIOS 芯片,通常是一颗容量在几 MB 至几十 MB 的闪存。 +##### 进程 -![BIOS](/assets/basic/03-computer-basic-knowledge-1/BIOS.jpg) -图 12. 图中为来自华邦公司的 25 系列 SPI NOR Flash,型号 W25Q32BVSIG,容量 32Mbit,存有 BIOS 程序 +一个进程(Process)包含了一个程序运行的全部状态和属性。这也是冯诺依曼机的核心思想,当你获得了程序在内存以及寄存器中的状态也就得到了一切。一个例子是休眠,计算机可冻结并将内存写回硬盘并关机,随后在下次开机后恢复,维持原先的程序运行。 +操作系统对各个进程分配资源,相互隔离并不断地进行时分复用(硬件上存在一个可编程的计时器每隔固定的间隔触发中断将处理器控制权交由操作系统),以实现一个系统上同时进行多任务(早期的如 DOS 系统只能同时进行一个程序)。 -首先 BIOS(Basic Input Output System,基本输入输出系统)程序将进行称为自检(POST,Power On Self Test)的过程,第一步是进行内存的初始化,因为现在的 BIOS 程序功能非常的复杂,自己就是一个小型操作系统(如可以联网,甚至可以通过 HTTP 下载文件)。 -因为此时内存尚未就绪,CPU 将使用内部的高速缓存作为临时的数据存放的地方为初始化的程序所使用。CPU 将根据内存上的一颗 SPD 存储器的信息,进行训练和学习寻找合适的电气参数(如内存频率和时序等)以保证数据可以正确的在 CPU 和内存之间传输,随后将高速缓存修改为正常工作模式。 +##### 线程 -随后将进行 CPU 的功能的一些初始化(如调节 CPU 的电压或频率,以及一些功能的启用或关闭),以及检查显卡、磁盘等关键设备是否存在功能异常,并进行一个最基本的,能用就行的初始化。当上述检查和初始化发生错误,或者无法找到合适的参数,程序将操控主机上的 LED 灯珠(如某些主板上具有 DEBUG 灯,或者使用硬盘或电源指示灯)或者通过蜂鸣器(一种迷你的喇叭)的声响发出警告。 -当初始化完毕,主机 LOGO 也就能够显示在屏幕上,随后对各个磁盘进行搜索操作系统的引导程序(其将依次启动内核和操作系统各个必要的服务程序,并进行更高层次的硬件各个功能的初始化和复位,如更高级的电源管理功能,其也通常是与操作系统相关),并根据启动顺序进行启动,将控制权交由操作系统。 +线程(Thread)是轻量级的进程,一个进程可建立多个线程子程序任务同时执行。一般进程具有处理器和内存地址的隔离,而一个进程下的线程仅有处理器的隔离,虚拟内存地址是共用的,不同线程之间的通信成本要比进程之间小很多。 + +##### 例外 + +例外(Exception),有些时候翻译为异常(此处异常通常指代 abnormality,对于硬件系统中通常异常不等于错误),通常后者称呼使用更多(后续使用异常这一称呼)。 +通常异常的产生代表的是发生了一些例外情况,因此往往也代表着移交控制权,可以发生在硬件层面,也可以发生在软件层面。 +硬件层面的异常通常包含有: -其中我们着重介绍 Windows 操作系统和 Linux 操作系统。 +1. 来自硬件的中断(Interrupt),比如键盘按下了一个键,或外设如网卡已经获取数据并已将其写入了内存,随后发出中断令处理器切换至相应的处理程序进行响应; +2. 陷阱(Trap),包括调试陷阱,以及来自软件主动请求的系统调用(以前也称软件中断)。前者可用于程序的调试(或者程序运行中对某些状态进行捕获),而后者目的通常是向 OS 发出某些请求如打开文件等; +3. 故障(Fault),通常是可以恢复的,也可能是有意为止的,可由硬件,也可由软件造成,发生后将调用内核内的故障处理程序处理并随后回到现场继续执行原先的代码,如发生了缺页,除法除数为 0,硬件发生了故障等,在不能处理时也会导致程序终止; +4. 终止(Abort),也就是不可以恢复的严重问题,比如机器检查(一般是严重的硬件错误导致)、双重故障(也就是在处理故障时发生了另一个故障,一个简单的例子是缺页处理程序被交换出去,导致发生缺页时找不到缺页处理程序,从而发生另一个缺页故障)等。 + +#### 操作系统概述 + +操作系统的核心部分以及部分硬件驱动程序运行在内核模式下,为上层的各类用户软件提供了对各种资源,比如处理器、内存、网络、各种外部设备如打印机等的统一抽象和管理,使得大部分应用程序在大部分不同的硬件上都能正确、安全、高效地运行,简化了应用程序员的工作,同时也将不同资源进行隔离,尽可能防止有缺陷或者恶意的程序影响其他程序运行。 + +部分几乎被所有软件使用的库、与内核进行通信并提供人机交互的管理程序等运行在用户模式的程序也被视为操作系统的一部分,而且这部分程序占据的比例不小,和操作系统内核一道进行资源的抽象和管理。 + +总的来说,操作系统就是一个管理者,为上层应用提供资源和服务,根据其权限和当前系统资源利用情况处理上层应用的请求。 + +::: details 用户模式程序能让整个系统崩溃吗 +有些人可能被不负责任地告知,使用 C 语言的指针非常危险,因为可以对内存任意位置读写,进而导致整个系统崩溃。实际上这对于大部分程序(尤其是初学者写的程序)而言是不正确的,因为其运行在用户模式下,并没有权限读写任意内存,发生这种情况下时,程序只会因为触发保护例外(例外的概念后面有介绍)而终止。 + +但是这种情况确实存在。第一,早期部分操作系统保护支持不完善;第二,高权限的应用程序滥用权限可以合法地让系统崩溃(甚至是主动触发崩溃);第三,程序总是有漏洞的,而部分漏洞可以用于使系统崩溃,甚至可以进行权限提升,执行任意代码等等。 + +没有绝对的安全,但是可以通过及时打补丁,避免不必要的授权(有些人觉得 Windows 的 UAC,也就是“以管理员运行”的弹窗非常烦人,进而把它禁用,这是非常不可取的)等方式,使得攻击面最小化,进而减少被攻击的可能。 +::: + +下面我们着重介绍 Windows 操作系统和 Linux 操作系统。 #### Windows @@ -229,15 +255,17 @@ will support anything other than AT-harddisks, as that's all I have :-(. 严格来说,Linux 只是一个“操作系统内核”,并没有包含用户态的程序,而一般来说,一个完整的操作系统需要包含用户态的一些基础设施,比如供更上层应用程序使用的库函数,以及用于管理其他软件和硬件,但不必放进内核态的程序。目前说 Linux 操作系统,一般指的是基于 Linux 内核衍生的各大发行版。大多发行版采用了来自 GNU 这个组织制作的各类辅助基础设置,故全名为 GNU/Linux。各种 Linux 发行版为 Linux 内核配置了一系列用户态程序,这样才能构成一个完整的操作系统。 +在本章剩余部分,如未特别提及所述对象为 Linux 内核,Linux 即指以 Linux 为内核的操作系统。 + 与 Windows 内核(名字是 NT 内核)不同,Linux 内核并不直接提供图形界面,只提供了最基本的各个接口,Linux 发行版的图形界面属于用户态程序,且是选配的。因此对于一个不需要图形界面的服务器,完全可以省下这一笔空间。与 Windows 不同,在 Linux 发行版中,Linux 内核和系统的其他组建完全都是由一个个软件包组成的,如果你不需要某个功能,完全可以将相应的软件包移除。也可以用其他功能类似的软件包替换某个软件包。系统具有高度可定制性。 Linux 是一种类 Unix 操作系统,API 符合 POSIX 标准。 -::: info 历史的注记 +::: details 历史的注记:微软与 Linux 微软在 21 世纪初将 Linux 称作“癌症”,认为 Linux 侵犯了知识产权,试图在客户中培育对 Linux 的恐慌,并以专利威胁起诉 Linux 开发者。然而十年后,微软表示“We love Linux”,可能是因为 Linux 在服务器市场占有率已经很高了。不过,由于微软曾经和网景和 Sun(Java)上"Embrace, extend, and extinguish"的 3E 战略垄断扼杀的黑历史,大家依然对微软的举动保持警惕。 ::: -::: info 历史的注记 +::: details 历史的注记:蓝屏死机 Windows 有一个臭名昭著的“功能”————蓝屏死机,Blue Screen of Death,非常的生动形象(:。这是 NT 内核在遇到不可恢复的错误时产生的错误提示信息,系统将进行冻结并重启把正在进行的事情搞砸(我论文还没保存呢!),由于蓝色色调本身较冷,以及早期 Windows 给人以不稳定的印象,这个界面因此变得声名狼藉。而对于 Linux,这个情况被称为 panic。Linux 内核并不会出现蓝屏,一方面是 Linux 的错误分级相对良好,驱动常年迭代更新,在一些不重要的错误情况(注: 曾经有过某些 Windows 驱动开发者为了便于调试,在任何错误的条件下使用蓝屏的手段以导出状态进行调试。这一特性被继承到了实际用户手上)下允许内核“带病运行”(这不一定是好事),另一则是由于 Linux 无法直接提供图形界面,因此内核错误信息只显示在非图形界面的终端上,使用图形界面的用户只能看到大写锁定键的灯光一直闪烁,看不到任何提示信息。最近 Linux 内核开发者试图在内核严重错误时绘制一个黑色界面,并展示一个二维码作为错误提示信息。 ::: @@ -249,38 +277,65 @@ Windows 有一个臭名昭著的“功能”————蓝屏死机,Blue Scre #### 移动操作系统 +没错,你的手机上也是有操作系统的 + - Android: Google 开发的基于 Linux 内核的操作系统,Google 自己在上面开发了 AOSP 一套基础设施环境。 - iOS: 苹果公司的产品,2007 年随 iPhone 横空问世,基于 Darwin 内核开发,封闭性较强。 #### 应用程序 +操作系统大部分情况下只充当资源的管理者,具体的任务还需要更上层的程序依靠操作系统提供的抽象和功能完成。 + +##### 桌面程序与命令行程序 + +有些程序有漂亮的图形界面进行人机交互,有些程序则只处理字符流的输入输出。这两种程序分别被成为桌面程序和命令行程序。详细介绍请看后续课程讲义。 + +##### 库 + +操作系统当然也可以使用库,但是大部分库都为应用程序所使用,因此这一小节放在了应用程序下面。 + +之前提及,很多代码是被大量重复使用的,这些代码被做成了库。库作为一种特殊的应用程序,在各种平台上面被广泛使用。库可以是以源代码形式或者封装好的机器码的形式存在。库可以是在程序编译时一同编译并连接,也可以是提前编译好,并在程序编译后以静态或者动态的方式与程序链接在一起。 + +#### 程序的执行 + +##### 机器码与汇编 + +先前已经提过,处理器是一条一条执行机器码的,而直接使用机器码编写程序,工作量非常大,目前应该已经彻底没有这么做的意义了。 + +比机器码稍微高一点的抽象就是汇编语言,汇编语言大体上和机器码呈现一一对应的关系。汇编语言为每一类指令操作分配了一个助记符,例如在 x86 架构下,用于将一个操作数复制到另一个地方的指令就被分配了 `mov` 这么一个助记符,而用于两个操作数相加的指令就被分配了 `add` 这么一个助记符。同时每个指令还有参数,比如 `mov` 指令就有两个参数,一个参数指示复制的目的地,一个参数指示复制的来源。把汇编语言翻译成机器码的过程叫做汇编,而与之相反的过程则叫做反汇编。 + +##### 编译 + +汇编语言功能强大,但是书写起来令人头疼,因此人们开发出了各种高级语言。除了极个别需要进行特殊的架构相关优化,或者执行特殊的指令的的场景,很少有手写汇编的机会,但是为了分析程序出现错误或者性能不佳的原因,需要程序员能够阅读汇编语言。为了执行高级语言编写的代码,有两种思路: + +- 将高级语言预先翻译成汇编语言,再翻译成机器语言,交付执行 +- 预先制作一段叫做解释器的程序,在处理器之上再自行维护一套状态,解释器一行一行读取高级语言源代码,根据源代码改变维护的状态,并进行操作 + +使用这两种思路的高级语言分别被叫做编译型语言和解释型语言,后续章节会有介绍。 + +##### 链接 + +以编译型语言为例,一段源代码要得到执行,首先需要经过编译和汇编,得到机器码。这还不够,我们还需要一个链接的过程。你可以把链接视为编译的一环,但是由于链接本身处理过程并不像“翻译”,更像“查找”和“填表”。你可能会问,我就一个源程序,链接是和谁“链接”?别忘了,如果你写的是用户模式的应用程序,你是极大概率会用到库函数的,此时链接就是链接到了这些库函数,将你原来生成的机器代码中对这些库函数的引用查询并填写上正确的地址。除此之外,链接也处理整个程序在内存中的放置位置,修改各处内存引用等。 + ##### 可执行文件 在冯诺依曼机内,数据和指令均被存储在磁盘内。为了存储这些这些信息,将其抽象为一个个文件,比如有的储存图片,有的储存程序,有的储存文字信息。每一类信息,都可以一种或多种文件格式保存在电脑存储中。 程序代码也是以一种文件的形式存储,称为可执行文件,具有其特定的储存编码方式,记录了程序启动的方式和环境需求。Windows 中其格式被称为可移植可执行文件(PE),而 Linux 下则称为 ELF(Executable and Linkable Format)。PE 格式也被用于 EFI 程序和 vmlinuz(压缩的 Linux 内核镜像)封装。 当执行可执行文件时,操作环境(比如 bash 或者 Windows 资源管理器 explorer.exe)会请求 OS 读取该文件并加载准备所需的环境(如创造进程,准备文件描述符,准备虚拟地址空间并建立映射,进行动态链接等)。 -##### 进程 - -一个进程(Process)包含了一个程序运行的全部状态和属性。这也是冯诺依曼机的核心思想,当你获得了程序在内存以及寄存器中的状态也就得到了一切。一个例子是休眠,计算机可冻结并将内存写回硬盘并关机,随后在下次开机后恢复,维持原先的程序运行。 -操作系统对各个进程分配资源,相互隔离并不断地进行时分复用(硬件上存在一个可编程的计时器每隔固定的间隔触发中断将处理器控制权交由操作系统),以实现一个系统上同时进行多任务(早期的如 DOS 系统只能同时进行一个程序)。 +##### 动态链接 -##### 线程 +为了节省空间,动态链接的技术被发明。比如 Windows 中你应该见过很多后缀名是 `.dll` 的文件,Linux 下也有很多后缀名是 `.so` 的文件,macOS 中也有后缀名是 `.dylib` 的文件,这些都是动态链接库。动态链接可以发生在使用库的程序被加载时,操作系统按照程序预先提供的信息动态地将二者链接在一起;也可以可以是程序运行之后借助操作系统提供的功能自己按需进行链接。 -线程(Thread)是轻量级的进程,一个进程可建立多个线程子程序任务同时执行。一般进程具有处理器和内存地址的隔离,而一个进程下的线程仅有处理器的隔离,虚拟内存地址是共用的,不同线程之间的通信成本要比进程之间小很多。 +动态链接可以很好地提升程序的灵活性和可扩展性,很多软件的插件以动态链接库的形式提供。 -##### 例外 +关于动态链接库相关错误的排除,请看后续讲义故障自查相关章节。 -例外(Exception),有些时候翻译为异常(此处异常通常指代 abnormality,对于硬件系统中通常异常不等于错误),通常后者称呼使用更多(后续使用异常这一称呼)。 -通常异常的产生代表的是发生了一些例外情况,因此往往也代表着移交控制权,可以发生在硬件层面,也可以发生在软件层面。 -硬件层面的异常通常包含有: +##### 程序的加载与结束 -1. 来自硬件的中断(Interrupt),比如键盘按下了一个键,或外设如网卡已经获取数据并已将其写入了内存,随后发出中断令处理器切换至相应的处理程序进行响应; -2. 陷阱(Trap),包括调试陷阱,以及来自软件主动请求的系统调用(以前也称软件中断)。前者可用于程序的调试(或者程序运行中对某些状态进行捕获),而后者目的通常是向 OS 发出某些请求如打开文件等; -3. 故障(Fault),通常是可以恢复的,也可能是有意为止的,可由硬件,也可由软件造成,发生后将调用内核内的故障处理程序处理并随后回到现场继续执行原先的代码,如发生了缺页,除法除数为 0,硬件发生了故障等,在不能处理时也会导致程序终止; -4. 终止(Abort),也就是不可以恢复的严重问题,比如机器检查(一般是严重的硬件错误导致)、双重故障(也就是在处理故障时发生了另一个故障,一个简单的例子是缺页处理程序被交换出去,导致发生缺页时找不到缺页处理程序,从而发生另一个缺页故障)等。 +对于应用程序,你现在可以启动它了。操作系统会先进行一系列包括权限在内的检查,然后加载程序到内存,可能还需要进行动态链接,然后跳转到指定的第一条指令开始不断运行,直到程序因为非法操作被系统夺回控制权并强行结束,或者程序通过系统提供的接口主动退出为止。 -::: info 例子 +::: details 例子 当你在一台笔记本上播放 PPT 的时候,按下空格键,计算机发生了什么? 键盘是由一个矩阵网络实现,嵌入式控制器每隔几 ms 进行扫描,以查看有哪些键被按下。此时,它发现了变化,随后其产生了一个信号经过一系列组件,最终到达 CPU 产生了一个外部中断(同时在一个寄存器内记录了这个中断的来源,每种来源都有一种代号)。 @@ -292,6 +347,46 @@ Windows 有一个臭名昭著的“功能”————蓝屏死机,Blue Scre 操作系统正是不断地从等待调度的队列取出进行程序的调度,恢复、执行、冻结,周而复始。 ::: +而操作系统代码的执行,请看下一节“开机”: + +#### 开机 + +当你给你心爱的电脑插上电源,按下开机键,会发生什么事情? + +通常,我们称计算机的启动过程为 BOOT,来自于一个单词 BOOTSTRAP(靴子)。 +BOOTSTRAP 的意思是 靴带,来自短语:“Pull oneself up by one’s bootstrap”——用靴带将自己拉起来 + +通常在 CPU 或南桥(一个用于辅助 CPU 的芯片,包含了大量低速外设的控制逻辑)中存在着一个极其简易的待机控制电路,其只要在插上电后便会获得电源供应就会运转起来,等待外部的各种信号。 +当按下开机键的时候,信号经由嵌入式控制器传送至电源控制电路,随后其将启动内部的振荡器为 CPU 的工作提供时钟信号,并将 CPU 复位线以及外设复位线置位(在随后的 Advanced 教程中会具体说明),并启动主板上的电源降压单元。当降压单元稳定后其会输出 PWRGD(POWER GOOD)信号通知其取消 CPU 复位,CPU 开始进入工作状态。 +CPU 刚启动的时候,CPU 将从固定的位置内获取第一条指令,该地址被映射到 BIOS 芯片,通常是一颗容量在几 MB 至几十 MB 的闪存。 + +![BIOS](/assets/basic/03-computer-basic-knowledge-1/BIOS.jpg) +图 12. 图中为来自华邦公司的 25 系列 SPI NOR Flash,型号 W25Q32BVSIG,容量 32Mbit,存有 BIOS 程序 + +首先 BIOS(Basic Input Output System,基本输入输出系统)程序将进行称为自检(POST,Power On Self Test)的过程,第一步是进行内存的初始化,因为现在的 BIOS 程序功能非常的复杂,自己就是一个小型操作系统(如可以联网,甚至可以通过 HTTP 下载文件)。 +因为此时内存尚未就绪,CPU 将使用内部的高速缓存作为临时的数据存放的地方为初始化的程序所使用。CPU 将根据内存上的一颗 SPD 存储器的信息,进行训练和学习寻找合适的电气参数(如内存频率和时序等)以保证数据可以正确的在 CPU 和内存之间传输,随后将高速缓存修改为正常工作模式。 + +随后将进行 CPU 的功能的一些初始化(如调节 CPU 的电压或频率,以及一些功能的启用或关闭),以及检查显卡、磁盘等关键设备是否存在功能异常,并进行一个最基本的,能用就行的初始化。当上述检查和初始化发生错误,或者无法找到合适的参数,程序将操控主机上的 LED 灯珠(如某些主板上具有 DEBUG 灯,或者使用硬盘或电源指示灯)或者通过蜂鸣器(一种迷你的喇叭)的声响发出警告。 +当初始化完毕,主机 LOGO 也就能够显示在屏幕上,随后对各个磁盘进行搜索操作系统的引导程序(其将依次启动内核和操作系统各个必要的服务程序,并进行更高层次的硬件各个功能的初始化和复位,如更高级的电源管理功能,其也通常是与操作系统相关),并根据启动顺序进行启动,将控制权交由操作系统。 + +#### 软件的许可 + +软件著作权也是知识产权的一种,受到国内外著作权法的保护。通常,软件的授权分为两种模式,一种是保留所有权利,限制源代码的取得和分发(这样授权的软件暂且称为专有软件);另外一种是附条件开放源代码的取得和分发(这样授权的软件暂且不太严谨地叫做开源软件)。在使用软件时,一定要注意软件的授权模式,避免侵权。对于保留所有权利的软件,注意不要与他人分享软件副本、激活码等信息;而对开放源代码获取和分发的软件,一般都可以自由分发其副本,这些软件一般也不会有“激活码”等反盗版技术保护措施。但是如果你需要基于这些软件的代码开发衍生软件,则需要注意: + +- 一般都需要保留原作者的署名和版权声明 + +- 对于以 GPL 等 Copyleft 性质的许可证授权的软件,你的代码也需要以同样或者符合原来许可证规定的许可证开源。这种特性也被称为传染性。 + +::: warning 盗版软件 +一般来说,不按照授权的方式使用软件就可以算盗版软件。你可能因为经济原因或者看垄断大公司不爽,或者是单纯因为自己技术高超,而使用盗版软件。但是需要注意的是,使用盗版软件存在法律风险,同时,网上来路不明的盗版软件可能还会带来安全风险(尽管正版软件商有时候也会干一些见不得人的勾当)。因此请尽量避免使用盗版软件。如果经济条件等不允许,可以使用开源软件替代品。本系列教程也不会有关于盗版软件的任何教程和推荐,如果读者发现,欢迎提出,我们将会立即修改或删除。 +::: + +::: details 自由软件运动与 Copyleft +有一些人认为,把软件变为私有财产,会阻碍技术交流,导致很多重复工作,不利于技术的进步(很多反对著作权法的声音也是类似的观点)。在上个世纪八十年代,开启了一场自由软件运动,提出了“四项基本自由”,致力于自由软件的传播与发展。自由软件运动并不是反著作权 Copyright,反而是借助了著作权相关法律的力量,推出了 Copyleft 类型的许可证。这种许可证授予被授权者充分的自由,唯一不允许做的就是把软件变为不自由的软件,前面提到的“传染性”就保证了这一点,即自由软件的衍生软件必须还是自由软件。 + +最开始,微软为代表的大公司极力阻碍自由软件运动。尽管 Linus 本人并不是自由软件运动的信徒,但是他领导的 Linux 内核项目使用了 GPL v2 许可证,也是自由软件。尽管商业化运作并不符合自由软件运动的初衷,开源并不意味着不能做商业。许多商业公司会使用更宽松的许可证,如 MIT 许可,由于其不限制衍生作品需要使用相同的许可证,因此可以保证商业公司能借助来自社区的代码力量,完善自己的专有软件产品。同时也有一些公司使用双重授权,由于许可证是版权所有者与被授权者的协议,因此同一个软件自然可以用不同的许可证发布。一些软件对于社区免费提供以 Copyleft 模式授权的软件,而对于准备开发专有软件的开发者,则收费提供另一套不允许传播源代码,但是没有 Copyleft 许可证“传染性”的授权。 +::: + ## 计算机网络 我们这辈人生活在一个高度信息化的时代中,自打记事开始,很多人就知道网络,并且经常在网上进行查找资料,聊天视频,联机游戏等活动。那么计算机网络究竟是如何组织起来的呢?我们这篇文章将做一些简要的介绍