Bios与操作系统
操作系统很难定义,[7]但有人称其为“为用户及其应用程序管理计算机资源的软件层”。[8]操作系统包括始终在运行的软件(称为内核),但也可以包含其他软件。[7] [9]可以在计算机上运行的另外两种程序是系统程序(与操作系统相关,但可能不是内核的一部分)和应用程序(所有其他软件)。[9]
操作系统有三个主要目的:[10]
操作系统在不同的应用程序之间分配资源,决定它们何时获得中央处理器(CPU) 时间或内存空间。[10]在现代个人计算机上,用户通常希望同时运行多个应用程序。为了确保一个程序不会独占计算机有限的硬件资源,操作系统会为每个应用程序提供一定比例的资源,无论是时间(CPU)还是空间(内存)。[11] [12]操作系统还必须将应用程序彼此隔离,以保护它们免受另一个应用程序代码的错误和安全漏洞的影响,但要允许不同应用程序之间进行通信。 操作系统提供了一个接口,该接口抽象了访问硬件细节(例如物理内存)的细节,以使程序员的工作更加轻松。 虚拟化还使操作系统能够掩盖有限的硬件资源;例如,虚拟内存可以为程序提供几乎无限内存的错觉,而这超出了计算机的实际内存。[ 操作系统提供通用服务,例如用于访问网络和磁盘设备的接口。这使应用程序可以在不同的硬件上运行而无需重写。操作系统中包含的服务各不相同,而这些功能占大多数操作系统代码的绝大部分。
Bios
BIOS 代表基本输入/输出系统,它是在计算机微处理器上运行的程序,用于在计算机开机时启动计算机。 BIOS 是在操作系统 (OS) 之前加载并在启动过程中执行初始化任务的固件。这些任务包括检查硬盘、RAM 和键盘等系统设备以及加载操作系统。 BIOS 还管理操作系统与打印机、鼠标、键盘和视频适配器等连接设备之间的数据流。
BIOS 是个程序,存储在 BIOS 芯片中,而现在的新式电脑用的基本都是 UEFI 启动,早期的过渡电脑用的都是 EFI 启动。其实 EFI 或 UEFI 的一部分也是存储在一个芯片中,由于它们在表面形式、基本功能上和 BIOS 差不多,所以习惯上我们也把存储 EFI/UEFI 的芯片叫做 EFI/UEFI BIOS 芯片,EFI/UEFI 也叫做 EFI/UEFI BIOS,但在实际上它们和 BIOS 根本是不一样的,所以最好还是把后面的“BIOS”尾巴去掉为好,下面就来具体谈一下 BIOS、EFI 和 UEFI。
!https://pic1.zhimg.com/80/v2-2031780e40860ff89222511597c900b4_720w.webp
BIOS 用于计算机硬件自检、CMOS 设置、引导操作系统启动、提供硬件 I/O、硬件中断等 4 项主要功能,因此 BIOS 程序可以分为若干模块,主要有 Boot Block 引导模块、CMOS 设置模块、扩展配置数据(ESCD)模块、DMI 收集硬件数据模块,其中引导模块直接负责执行 BIOS 程序本身入口、计算机基本硬件的检测和初始化,ESCD 用于 BIOS 与 OS 交换硬件配置数据,DMI 则充当了硬件管理工具和系统层之间接口的角色,通过 DMI,用户可以直观地获得硬件的任何信息,CMOS 设置模块就是实现对硬件信息进行设置,并保存在 CMOS 中,是除了启动初始化以外 BIOS 程序最常用的功能。
BIOS 本身是汇编语言代码,是在 16 位实模式下调用 INT 13H 中断执行的,由于 x86-64 是一个高度兼容的指令集,也为了迁就 BIOS 的 16 位实模式的运行环境,所以即使现在的 CPU 都已是 64 位,如果还是在 BIOS 启动(基本见于 09 年以前的主板),在开机时仍然都是在 16 位实模式下执行的。16 位实模式直接能访问的内存只有 1MB,就算你安了 4G、8G 或者 16G 还是 32G 内存,到了 BIOS 上一律只先认前 1MB。在这 1MB 内存中,前 640K 称为基本内存,后面 384K 内存留给开机必要硬件和各类 BIOS 本身使用,了解了这些,下面谈一下 BIOS 启动计算机的具体过程。
当按下电源开关时,电源就开始向主板和其他设备供电,这时电压还不稳定,在早期的南北桥主板上,由主板北桥向 CPU 发复位信号,对 CPU 初始化;稳定电压后复位信号便撤掉。而对于现在的单南桥主板,则由 CPU 自身调整稳定电压达到初始化的目的,当电压稳定后,CPU 便在系统 BIOS 保留的内存地址处执行跳转 BIOS 起始处指令,开始执行 POST 自检。
在 POST 自检中,BIOS 只检查系统的必要核心硬件是否有问题,主要是 CPU、640K 基本内存、显卡是否正常,PS/2 键盘控制器、系统时钟是否有错误等等。由于 POST 检查在显卡初始化以前,因此在这个阶段如发生错误,是无法在屏幕上显示的,不过主板上还有个报警扬声器,而且如果主板的 8255 外围可编程接口芯片没有损坏的话,POST 报警声音一定是会出来的。可以根据报警声的不同大致判断错误所在,一般情况下,一声短“嘀”声基本代表正常启动,不同的错误则是不同的短“嘀”声和长“嘀”声组合。POST 自检结束后,BIOS 开始调用中断完成各种硬件初始化工作。
EFI,是 Extensible Firmware Interface 的词头缩写,直译过来就是可扩展固件接口,它是用模块化、高级语言(主要是 C 语言)构建的一个小型化系统,它和 BIOS 一样,主要在启动过程中完成硬件初始化,但它是直接利用加载 EFI 驱动的方式,识别系统硬件并完成硬件初始化,彻底摒弃读各种中断执行。EFI 驱动并不是直接面向 CPU 的代码,而是由 EFI 字节码编写成,EFI 字节码是专用于 EFI 的虚拟机器指令,需要在 EFI 驱动运行环境 DXE 下解释运行,这样 EFI 既可以实现通配,又提供了良好的兼容。此外,EFI 完全是 32 位或 64 位,摒弃 16 位实模式,在 EFI 中就可以实现处理器的最大寻址,因此可以在任何内存地址存放任何信息。另外,由于 EFI 的驱动开发非常简单,基于 EFI 的驱动模型原则上可以使 EFI 接触到所有硬件功能,在 EFI 上实现文件读写,网络浏览都是完全可能的。i,BIOS 上的的 CMOS 设置程序在 EFI 上是作为一个个 EFI 程序来执行的,硬件设置是硬件设置程序、而启动管理则是另一个程序,保存 CMOS 又是另一个程序,虽然它们在形式的 Shell 上是在一起的。
EFI 在功能上完全等同于一个轻量化的 OS(操作系统),但是 EFI 在制定时就定位到不足以成为专业 OS 的地位上,首先,它只是一个硬件和操作系统间的一个接口;其次,EFI 不提供中断访问机制,EFI 必须用轮询的方式检查并解释硬件,较 OS 下的驱动执行效率较低,最后,EFI 只有简单的存储器管理机制,在段保护模式下只将存储器分段,所有程序都可以存取任何一段位置,不提供真实的保护服务。伴随着 EFI,一种全新的 GUID 磁盘分区系统(GPT)被引入支持,传统 MBR 磁盘只能存在 4 个主分区,只有在创建主分区不足 4 个时,可以建立一个扩展分区,再在其上建立被系统识别的逻辑分区,逻辑分区也是有数量的,太多的逻辑分区会严重影响系统启动,MBR 硬盘分区最大仅支持 2T 容量,对于现在的大容量硬盘来说也是浪费。GPT 支持任意多的分区,每个分区大小原则上是无限制的,但实际上受到 OS 的规定限制不能做到无限,不过比 MBR 的 2T 限制是非常重要的进步。GPT 的分区类型由 GUID 表唯一指定,基本不可能出现重复,其中的 EFI 系统分区可以被 EFI 存取,用来存取部分驱动和应用程序,虽然这原则上会使 EFI 系统分区变得不安全,但是一般这里放置的都是些“边缘”数据,即使其被破坏,一般也不会造成严重后果,而且也能够简单的恢复回来。
当 EFI 发展到 1.1 的时候,英特尔决定把 EFI 公之于众,于是后续的 2.0 吸引了众多公司加入,EFI 也不再属于英特尔,而是属于了 Unified EFI Form 的国际组织,EFI 在 2.0 后也遂改称为 UEFI,UEFI,其中的 EFI 和原来是一个意思,U 则是 Unified(一元化、统一)的缩写,所以 UEFI 的意思就是“统一的可扩展固件接口”,与前身 EFI 相比,UEFI 主要有以下改进:
首先,UEFI 具有完整的图形驱动功能,之前的 EFI 虽然原则上加入了图形驱动,但为了保证 EFI 和 BIOS 的良好过渡,EFI 多数还是一种类 DOS 界面(仍然是 640480VGA 分辨率),只支持 PS/2 键盘操作(极少数支持鼠标操作),不支持 USB 键盘和鼠标。到了 UEFI,则是拥有了完整的图形驱动,无论是 PS/2 还是 USB 键盘和鼠标,UEFI 一律是支持的,而且 UEFI 在显卡也支持 GOP VBIOS 的时候,显示的设置界面是显卡高分辨率按 640480 或 1024*768 显示,因此画面虽小但很清楚,但是这样会导致屏幕周围大片留黑,不过鱼和熊掌不可兼得,除非 UEFI 默认窗口大小也是最高分辨率。
其次,UEFI 具有一个独特的功能,安全启动,而 EFI 是没有安全启动的,安全启动(Secure Boot),实际上通俗的解释是叫做固件验证。开启 UEFI 的安全启动后,主板会根据 TPM 芯片(或者 CPU 内置的 TPM)记录的硬件签名对各硬件判断,只有符合认证的硬件驱动才会被加载,而 Win8 以后的 Windows 则是在操作系统加载的过程中对硬件驱动继续查签名,符合 Windows 记录的硬件才能被 Windows 加载,这在一定程度上降低了启动型程序在操作系统启动前被预加载造成的风险,但是这也会造成系统安装变得垄断。
无论 EFI 还是 UEFI,都必须要有预加载环境、驱动执行环境、驱动程序等必要部分组成,为了支持部分旧设备(如在 UEFI 下挂载传统 MBR 硬盘,不支持 UEFI 启动的显卡在 UEFI 下仍然支持运行等),还需要一个 CSM 兼容性支持模块、EFI 或 UEFI 都是仅支持 GPT 磁盘引导系统的,下面就具体谈一下 EFI 或 UEFI 启动计算机的过程。
一般地,预加载环境和驱动执行环境是存储在 UEFI(UEFI BIOS)芯片中的,当打开电源开关时,电脑的主要部件都开始有了供电,与 BIOS 不同的是,UEFI 预加载环境首先开始执行,负责 CPU 和内存(是全部容量)的初始化工作,这里如出现重要问题,电脑即使有报警喇叭也不会响,因为 UEFI 没有去驱动 8255 发声,不过预加载环境只检查 CPU 和内存,如果这两个主要硬件出问题,屏幕没显示可以立即确定,另外一些主板会有提供 LED 提示,可根据 CPU 或内存亮灯大致判断故障。
CPU 和内存初始化成功后,驱动执行环境(DXE)载入,当 DXE 载入后,UEFI 就具有了枚举并加载 UEFI 驱动程序的能力,在此阶段,UEFI 会枚举搜索各个硬件的 UEFI 驱动并相继加载,完成硬件初始化工作,这相比 BIOS 的读中断加载速度会快的多,同样如加载显卡的 UEFI 驱动成功,电脑也会出现启动画面,硬件驱动全部加载完毕后,最后同 BIOS 一样,也得去启动操作系统。
在启动操作系统的阶段,同样是根据启动记录的启动顺序,转到相应设备(仅限 GPT 设备,如果启动传统 MBR 设备,则需要打开 CSM 支持)的引导记录,引导操作系统并进入,这里需要注意的是,UEFI 在检测到无任何操作系统启动设备时,会直接进入 UEFI 设置页面,而不是像 BIOS 那样黑屏显示相关信息。
综上对 BIOS 和 UEFI 启动计算机过程的叙述,可以概括为:BIOS 先要对 CPU 初始化,然后跳转到 BIOS 启动处进行 POST 自检,此过程如有严重错误,则电脑会用不同的报警声音提醒,接下来采用读中断的方式加载各种硬件,完成硬件初始化后进入操作系统启动过程;而 UEFI 则是运行预加载环境先直接初始化 CPU 和内存,CPU 和内存若有问题则直接黑屏,其后启动 PXE 采用枚举方式搜索各种硬件并加载驱动,完成硬件初始化,之后同样进入操作系统启动过程。
此外,BIOS 是 16 位汇编语言程序,只能运行在 16 位实模式,可访问的内存只有 1MB,而 UEFI 是 32 位或 64 位高级语言程序(C 语言程序),突破实模式限制,可以达到要求的最大寻址。
网吧:network booting 无盘系统
无盘系统在设计时,负载均衡
无盘系统靠着每次复位镜像的操作,每次开机都相当于做了一个系统还原,你 qq 号啥的都得重新输入,浏览记录啥的也不会保存,甚至一些游戏存档都不会留。流氓软件自然也没了。
为啥更慢呢?为啥 LOW 帧更低呢?
因为无硬盘,本来硬盘在电脑上,需要访问文件,CPU 直接读取就行了。
现在无盘系统变成了 CPU 访问文件——通过网卡发送请求,远端服务器接受请求-远端服务器发送数据。环节多了,延迟也变高了。自然就更慢了。
可能觉得不到 1 秒,挺快的啊,但是把 1 毫秒当做一天来看,本来当天下午就能拿到的数据,现在要等几天,还觉得很快么?这种读取就在一些游戏上能造成细微卡顿。
而且网吧的设备,有多少客户机会给上 2.5G 网口,大部分都是千兆网口,才 100M/S 的速度,2.5G 最高也就 250M/S 的速度,而老一点的 sata 硬盘接口都是 460M/S 起步,M2 接口配合现在的 nvme 固态,速度都是几千算的。不过这个不算主要原因,毕竟日常使用的时候,硬盘需要瞬间读取几百 M 的数据的情况并不是很多。主要还是延迟。尤其是几百几千个文件一起的时候,每个文件延迟一点,连起来那就多了。