diff --git a/basic/03-computer-basic-knowledge-1.md b/basic/03-computer-basic-knowledge-1.md index 07f2129..7acd825 100644 --- a/basic/03-computer-basic-knowledge-1.md +++ b/basic/03-computer-basic-knowledge-1.md @@ -173,29 +173,25 @@ PCIe 由电源,一些辅助信号和若干条 Lane 组成,不同的 Lane 间 软件根据其功能不同也可以分为很多种,有一些软件是直接跟硬件打交道的,而另一些软件则直接跟用户打交道。前者包含操作系统和硬件驱动程序,而后者是我们平时使用的各类应用程序。另外,人们发现,各类软件有很多功能是相同的,于是人们开发了各种各样的“库”这个软件,为各个软件公用。 -操作系统和硬件驱动程序为上层的各类用户软件提供了对各种资源,比如处理器、内存、网络、各种外部设备如打印机等的统一抽象和管理,使得大部分应用程序在大部分不同的硬件上都能正确、安全、高效地运行,简化了应用程序员的工作,同时也将不同资源进行隔离,尽可能防止有缺陷或者恶意的程序影响其他程序运行。 +#### 操作系统概述 -#### 开机 +之前提到过现代 ISA 都提供保护功能,绝大部分的保护都会至少分为两种操作模式,一种叫内核模式(有时候也叫超级用户、特权模式、、系统态、核心态、管态等),一种叫用户模式(也叫目态等);部分ISA还提供更多操作模式。简单理解,内核模式下,程序拥有对硬件软件资源(几乎)全部的访问权限;而用户模式下程序可进行的操作则受到限制,但是允许通过预先定义的接口,通过内核模式下的程序授权完成需要特权的操作。 -当你给你心爱的电脑插上电源,按下开机键,会发生什么事情? +操作系统的核心部分以及部分硬件驱动程序运行在内核模式下,为上层的各类用户软件提供了对各种资源,比如处理器、内存、网络、各种外部设备如打印机等的统一抽象和管理,使得大部分应用程序在大部分不同的硬件上都能正确、安全、高效地运行,简化了应用程序员的工作,同时也将不同资源进行隔离,尽可能防止有缺陷或者恶意的程序影响其他程序运行。 -通常,我们称计算机的启动过程为 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 程序 +::: details 用户模式程序能让整个系统崩溃吗 +有些人可能被不负责任地告知,使用 C 语言的指针非常危险,因为可以对内存任意位置读写,进而导致整个系统崩溃。实际上这对于大部分程序(尤其是初学者写的程序)而言是不正确的,因为其运行在用户模式下,并没有权限读写任意内存,发生这种情况下时,程序只会因为触发保护例外(例外的概念后面有介绍)而终止。 -首先 BIOS(Basic Input Output System,基本输入输出系统)程序将进行称为自检(POST,Power On Self Test)的过程,第一步是进行内存的初始化,因为现在的 BIOS 程序功能非常的复杂,自己就是一个小型操作系统(如可以联网,甚至可以通过 HTTP 下载文件)。 -因为此时内存尚未就绪,CPU 将使用内部的高速缓存作为临时的数据存放的地方为初始化的程序所使用。CPU 将根据内存上的一颗 SPD 存储器的信息,进行训练和学习寻找合适的电气参数(如内存频率和时序等)以保证数据可以正确的在 CPU 和内存之间传输,随后将高速缓存修改为正常工作模式。 +但是这种情况确实存在。第一,早期部分操作系统保护支持不完善;第二,高权限的应用程序滥用权限可以合法地让系统崩溃(甚至是主动触发崩溃);第三,程序总是有漏洞的,而部分漏洞可以用于使系统崩溃,甚至可以进行权限提升,执行任意代码等等。 -随后将进行 CPU 的功能的一些初始化(如调节 CPU 的电压或频率,以及一些功能的启用或关闭),以及检查显卡、磁盘等关键设备是否存在功能异常,并进行一个最基本的,能用就行的初始化。当上述检查和初始化发生错误,或者无法找到合适的参数,程序将操控主机上的 LED 灯珠(如某些主板上具有 DEBUG 灯,或者使用硬盘或电源指示灯)或者通过蜂鸣器(一种迷你的喇叭)的声响发出警告。 -当初始化完毕,主机 LOGO 也就能够显示在屏幕上,随后对各个磁盘进行搜索操作系统的引导程序(其将依次启动内核和操作系统各个必要的服务程序,并进行更高层次的硬件各个功能的初始化和复位,如更高级的电源管理功能,其也通常是与操作系统相关),并根据启动顺序进行启动,将控制权交由操作系统。 +没有绝对的安全,但是可以通过及时打补丁,避免不必要的授权(有些人觉得 Windows 的 UAC,也就是“以管理员运行”的弹窗非常烦人,进而把它禁用,这是非常不可取的)等方式,使得攻击面最小化,进而减少被攻击的可能。 +::: -其中我们着重介绍 Windows 操作系统和 Linux 操作系统。 +下面我们着重介绍 Windows 操作系统和 Linux 操作系统。 #### Windows @@ -229,6 +225,8 @@ 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 标准。 @@ -254,6 +252,8 @@ Windows 有一个臭名昭著的“功能”————蓝屏死机,Blue Scre #### 应用程序 +操作系统大部分情况下只充当资源的管理者,具体的任务还需要更上层的程序依靠操作系统提供的抽象和功能完成。 + ##### 可执行文件 在冯诺依曼机内,数据和指令均被存储在磁盘内。为了存储这些这些信息,将其抽象为一个个文件,比如有的储存图片,有的储存程序,有的储存文字信息。每一类信息,都可以一种或多种文件格式保存在电脑存储中。 @@ -292,6 +292,62 @@ Windows 有一个臭名昭著的“功能”————蓝屏死机,Blue Scre 操作系统正是不断地从等待调度的队列取出进行程序的调度,恢复、执行、冻结,周而复始。 ::: +#### 程序的执行 + +先前已经提过,处理器是一条一条执行机器码的,而直接使用机器码编写程序,工作量非常大,目前应该已经彻底没有这么做的意义了。 + +比机器码稍微高一点的抽象就是汇编语言,汇编语言大体上和机器码呈现一一对应的关系。汇编语言为每一类指令操作分配了一个助记符,例如在 x86 架构下,用于将一个操作数复制到另一个地方的指令就被分配了 `mov` 这么一个助记符,而用于两个操作数相加的指令就被分配了 `add` 这么一个助记符。同时每个指令还有参数,比如 `mov` 指令就有两个参数,一个参数指示复制的目的地,一个参数指示复制的来源。把汇编语言翻译成机器码的过程叫做汇编,而与之相反的过程则叫做反汇编。 + +汇编语言功能强大,但是书写起来令人头疼,因此人们开发出了各种高级语言。除了极个别需要进行特殊的架构相关优化,或者执行特殊的指令的的场景,很少有手写汇编的机会,但是为了分析程序出现错误或者性能不佳的原因,需要程序员能够阅读汇编语言。为了执行高级语言编写的代码,有两种思路: +- 将高级语言预先翻译成汇编语言,再翻译成机器语言,交付执行 +- 预先制作一段叫做解释器的程序,在处理器之上再自行维护一套状态,解释器一行一行读取高级语言源代码,根据源代码改变维护的状态,并进行操作 + +使用这两种思路的高级语言分别被叫做编译型语言和解释型语言,后续章节会有介绍。 + +以编译型语言为例,一段源代码要得到执行,首先需要经过编译和汇编,得到机器码。这还不够,我们还需要一个链接的过程。你可以把链接视为编译的一环,但是由于链接本身处理过程并不像“翻译”,更像“查找”和“填表”。你可能会问,我就一个源程序,链接是和谁“链接”?别忘了,如果你写的是用户模式的应用程序,你是极大概率会用到库函数的,此时链接就是链接到了这些库函数,将你原来生成的机器代码中对这些库函数的引用查询并填写上正确的地址。除此之外,链接也处理整个程序在内存中的放置位置,修改各处内存引用等。 + +对于应用程序,你现在可以启动它了。操作系统会先进行一系列包括权限在内的检查,然后加载程序到内存,可能还需要进行动态链接,然后跳转到指定的第一条指令开始不断运行,直到程序因为非法操作被系统夺回控制权并强行结束,或者程序通过系统提供的接口主动退出为止。 + +而操作系统代码的执行,请看下一节“开机”: + +#### 开机 + +当你给你心爱的电脑插上电源,按下开机键,会发生什么事情? + +通常,我们称计算机的启动过程为 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 许可证,也是自由软件。因此 Linux 被微软诬蔑为“癌症”。但是随着 Linux 生态逐步完善,其在服务器领域大放光彩,微软也逐步改变了对 Linux 的看法。尽管商业化运作并不符合自由软件运动的初衷,开源并不意味着不能做商业。许多商业公司会使用更宽松的许可证,如 MIT 许可,由于其不限制衍生作品需要使用相同的许可证,因此可以保证商业公司能借助来自社区的代码力量,完善自己的专有软件产品。同时也有一些公司使用双重授权,由于许可证是版权所有者与被授权者的协议,因此同一个软件自然可以用不同的许可证发布。一些软件对于社区免费提供以 Copyleft 模式授权的软件,而对于准备开发专有软件的开发者,则收费提供另一套不允许传播源代码,但是没有 Copyleft 许可证“传染性”的授权。 +::: + ## 计算机网络 我们这辈人生活在一个高度信息化的时代中,自打记事开始,很多人就知道网络,并且经常在网上进行查找资料,聊天视频,联机游戏等活动。那么计算机网络究竟是如何组织起来的呢?我们这篇文章将做一些简要的介绍