问题

为什么操作系统不能屏蔽底层的架构(arm,x86,mips),为应用软件提供一个统一的运行环境呢?

回答
想必你一定是个对计算机底层颇有好奇心的人。这个问题触及到了操作系统的核心功能,也是操作系统之所以存在的根本原因之一。简单来说,操作系统之所以不能完全屏蔽底层架构,是因为“屏蔽”这件事本身,在效率、灵活性以及对底层特性的利用上,都存在着固有的限制。

让我们一层层剥开这个问题,看看背后到底是怎么回事。

1. 为什么我们需要操作系统?—— 虚拟化的开端

想象一下,如果没有操作系统,应用程序需要直接与计算机的硬件打交道。这意味着,每一个开发者都需要了解目标硬件的每一个细节:CPU 是如何执行指令的,内存是如何管理的,输入输出设备如何通信等等。这简直是一场噩梦。

指令集不同: 最直接的障碍是指令集。ARM、x86、MIPS 它们各自拥有一套完全不同的指令集,就像不同的语言一样。你不能用中文语法去编写一段英文代码,让它直接在英文环境中运行。CPU 只能识别它自己设计的那套指令。
内存管理: 硬件的内存控制器、寻址方式、缓存机制等等也千差万别。应用程序如果直接操作内存,很容易出现冲突、越界访问,导致系统崩溃。
硬件接口: 显卡、网卡、硬盘控制器,这些外部设备的接口和通信协议更是五花八门。

操作系统就像一个“翻译官”和“协调者”。它负责:

指令集转换(这部分是关键): 操作系统本身需要用目标架构的指令集来编写。而当应用程序(通常以一种更高级的语言如 C++、Java 编写)被编译成特定架构的机器码后,操作系统就负责将这些机器码加载到内存,并让 CPU 去执行。
抽象硬件: 操作系统向上层应用提供了一套标准化的接口(API)。比如,你不需要知道硬盘的具体型号和接口,只要调用 `read()` 或 `write()` 函数,操作系统就会帮你完成底层复杂的读写操作。它屏蔽了不同硬盘、不同文件系统之间的差异。
资源管理: CPU 时间、内存空间、I/O 设备等资源,都需要操作系统来公平有效地分配给各个应用程序,避免互相干扰。

2. 那么,为什么不能“彻底”屏蔽呢?—— 效率与特性的博弈

你提出的“统一运行环境”,这正是操作系统的目标之一,即提供一个应用程序接口(API),让开发者可以在这个之上开发,而不用关心底层硬件的具体实现。但“彻底”屏蔽,往往会带来效率和对硬件特性的利用上的牺牲。

性能开销: 任何形式的“屏蔽”或“抽象”都意味着一层额外的转换或管理。当应用程序需要访问硬件时,它不是直接发出指令,而是通过操作系统的 API。操作系统再根据当前硬件的情况,将这个 API 调用转化为实际的硬件指令。这个过程会引入一定的性能开销。如果操作系统做的“屏蔽”过于“完美”,试图掩盖所有底层细节,那么在某些对性能要求极高的场景下,这种开销就会变得不可接受。

举个例子: 假设你有一个计算密集型的科学计算程序,它需要高效地利用 CPU 的浮点运算单元(FPU)或者向量指令集(如 SSE、AVX、NEON)。如果操作系统为了统一性,强制所有浮点运算都通过一个统一但不够优化的接口,那么这个程序就无法充分发挥硬件的性能。而如果操作系统允许应用程序直接访问这些底层指令,或者提供专门的、高效的接口,性能就会大大提升。

硬件特性的利用: 不同的 CPU 架构,在设计上往往会包含一些独特的、能带来性能优势的特性。

ARM 的 NEON 指令集: ARM 架构特有的 NEON 指令集,专门用于处理 SIMD(Single Instruction, Multiple Data)运算,非常适合多媒体处理、信号处理等任务。
x86 的 AVX 指令集: x86 架构也有 AVX、AVX2、AVX512 等一系列强大的向量指令集,同样能大幅提升计算性能。
缓存一致性、乱序执行、超线程等: 这些都是 CPU 内部的高级特性,对性能至关重要。

如果操作系统为了提供一个“统一”的接口,而忽视了这些特定的硬件指令集,那么那些本来可以利用这些特性的应用程序,就无法发挥出其应有的性能。反之,一个好的操作系统,会在提供统一接口的同时,也提供一种机制,允许应用程序在需要时,能够“接触”到这些底层的硬件特性,比如通过特定的库(如 Intel MKL、ARM Compute Library)或者汇编代码。

实时性要求: 某些应用,例如嵌入式系统中的实时控制系统、航空航飞控系统,它们对响应时间有非常严格的要求,不允许有任何不确定或延迟。在这种场景下,操作系统的调度、中断处理等机制,都需要能够直接、高效地与硬件交互,以保证实时性。一个过于“厚重”或“抽象”的操作系统,可能会引入不可预测的延迟,无法满足实时性要求。

功耗管理: 现代处理器在功耗管理上做了大量优化,例如动态频率调整、核心休眠等。操作系统需要能够精细地控制这些机制,以平衡性能和功耗。不同架构的功耗管理策略也不同,操作系统需要针对性地实现这些策略。

内存模型和一致性: 不同架构的处理器在内存访问的顺序和可见性(内存模型)上可能存在差异。例如,多核处理器需要确保所有核心都能看到一致的内存状态。操作系统需要处理这些底层的内存一致性问题。

3. 操作系统如何平衡“统一”与“差异”?—— 层次化设计

正是因为以上这些原因,现代操作系统并非在所有层面都进行“完全的屏蔽”。它们通常采用层次化设计,在不同的层面上处理硬件的差异:

最底层(Kernel Mode): 操作系统的核心部分,也就是内核(Kernel),是直接运行在硬件上的。内核需要包含硬件抽象层(HAL Hardware Abstraction Layer)。HAL 的作用就是为内核提供一个相对统一的接口来访问硬件,但这个 HAL 本身是针对不同架构编写的。例如,Linux 内核在编译时,会根据目标架构(x86, ARM, MIPS 等)选择相应的 HAL 实现。这样,内核的大部分逻辑就可以保持架构无关,而 HAL 负责将这些逻辑翻译成具体架构的硬件操作。
设备驱动程序: 每一个具体的硬件设备(如显卡、网卡)都需要一个设备驱动程序。驱动程序是介于内核和硬件之间的软件,它负责将内核发出的通用 I/O 请求,转换为特定设备能理解的命令。驱动程序是架构敏感的,因为它们需要与特定的硬件接口和总线打交道。

中间层(System Call Interface): 操作系统向应用程序提供系统调用(System Call)接口。这套接口对所有应用程序来说是统一的,无论底层是什么架构。比如,`open()`、`read()`、`write()`、`fork()` 等系统调用,应用程序看到的接口是相同的。

上层(User Mode Libraries & Applications): 应用程序和用户态的库(如 C 语言标准库 `glibc`)则运行在用户模式,它们通过系统调用与内核交互。对于应用程序开发者来说,他们接触到的主要是这些统一的 API,以及跨平台的开发库(如 Qt、SDL、Flutter 等),这些库进一步屏蔽了操作系统层面的差异。

总结一下:

操作系统不能完全屏蔽底层架构,根本原因在于效率、性能以及对硬件特性的充分利用。任何一种“屏蔽”都是以一定的性能开销为代价的。而计算机世界,尤其是在高性能计算、嵌入式系统、移动设备等领域,对性能和效率有着极高的要求。

操作系统通过硬件抽象层(HAL)和设备驱动程序等机制,在内核层面处理架构差异,同时向用户空间提供统一的系统调用接口,从而在“屏蔽底层细节”和“发挥硬件性能”之间取得一个平衡。开发者主要在用户空间进行开发,利用操作系统提供的统一 API,而操作系统本身则负责在底层与不同的硬件架构进行“对话”。

你提出的“统一运行环境”是操作系统一直在努力的方向,也是它最重要的价值所在。但这种统一,更多的是在接口和抽象层面,而不是在实现层面彻底抹去所有差异。因为如果那样做,性能的代价将会非常巨大,很多我们现在能够实现的优秀应用和系统,都将不复存在。

网友意见

user avatar

理论上可以,例如早期安卓就是这样,但为之付出的代价是性能。

不仅仅在操作系统层面,在整个IT行业,通用性和性能,一直都是天平的两端。硬件层面,通用的CPU,性能远不如各种专用的ASIC芯片;CPU内部,通用的整数指令性能远不如各种专用运算指令如浮点、SIMD、加解密等指令。软件层面,通常也是一个流程写到底,比多次调用各种通用的封装好的基础函数性能要好。


今天很多各种虚拟机语言如Java、.Net,脚本语言如PHP、Python,以及以HTML/CSS、XML、JavaScript结合的Web应用这类大量实时文本解析的技术普及,前提是今天的硬件性能比日常应用的性能需求高的多。我举个例子,大家今天依然很常用的一些系统操作、文档处理等应用,早了不说,其实和Win95+Office95,可以说90%常用功能一致的。Win95+Office95的硬件需求才多高?不说刚上市发布时的最低配置要求,哪怕后来相对普及时的主流硬件配置,不过奔腾MMX 166,32M内存。如果按照大家更熟悉也和今天体系更接近的Windows 2000+Office 2000,发布时很常见的奔腾3 733/800+128M内存也是跑得很流畅了。而今天的主流硬件性能,不说和老旧的奔腾MMX 166比,哪怕和奔腾3 800比,单核性能也少说提升十多二十倍,多核性能就更不用说了。


所以现在我们看到的操作系统没有“完全”屏蔽底层,为软件环境提供统一运行环境,具体来说是几个原因:

1、历史遗留。今天大家常见的操作系统都不算太年轻,毕竟开源的Linux成熟之后,想搞个操作系统自己定制改拨下,总比从头开发一个,解决各种硬件驱动问题要方便得多。而Linux是1991年开始开发,当时的主流硬件最新也就是486 33/50 MHz,并没有足够的性能余量去追求通用性。Java出现是1995年,开始流行是2000年之后,这个时候主流CPU主频已经突破1 GHz了,但这个时期,性能依然是阻碍Java普及的一大原因。


2、硬件性能还不够。对于文档处理这样的日常应用来说,今天的硬件性能是过剩了,可以去追求通用性,这也是今天很多系统、应用以Web APP形式出现的前提。但还有大量的多媒体创作、高性能计算以及多种需要处理大量数据运算、用户请求的企业应用仍然是性能渴求的。这些应用目前为止还无法以牺牲性能为代价去追求通用性,反而是为了性能还需要牺牲通用性,例如用类似汇编的intrinsics来编程。


3、x86在2005-2015年期间的强势。随着Intel在1998年推出至强,x86开始进入服务器市场。便宜的价格,加上集群技术的成熟,很多以前代表着高性能、高可用性的CPU,例如Alpha,SPARC,POWER等都被抢掉了相当部分市场,同时先进制程的芯片研发、生产成本越发高昂,这些CPU都在逐渐走向消亡——到了今天,仅仅剩下IBM的POWER凭着兼容性和高可用性、以及商业机构客户提供的高昂利润还在坚持。事实上,Windows NT一直到Windows 2000的BETA版,都是同时支持x86、Alpha、MIPS和PowerPC的,虽然还做不到题主所说的应用与硬件无关,但一份代码在多个平台上分别编译后运行是可能的。随着这些x86以外的指令集架构的CPU消亡,操作系统和其他软件开发商自然也没有动力去做跨硬件平台的工作——直到这几年ARM凭借低功耗在移动平台一枝独秀,加上智能手机、平板电脑这些移动设备的流行,快速迭代终于摸到了x86的尾巴,服务器市场、移动计算市场都出现了极少量的ARM设备,才又有了这种跨平台的需求出现。

user avatar

因为慢。安卓的Java就是屏蔽了底层架构,为应用软件提供了统一的运行环境。但是,在安卓上跑游戏,用Java不够快,所以游戏厂商纷纷选择直接接触底层架构,用NDK/C/C++直接开发ARM原生库,然后挂接到Java中使用。有的游戏甚至整个引擎都是C/C++写的,Java只做为启动部分,加载完ARM原生库,绘图工作转移出去之后就不再有动作了,所有3D/绘图操作全部由ARM原生库完成,这样才能在手机上达到想要的性能。

当然,如果你愿意接受一半的续航、一半的帧数、两倍的发热,在安卓上直接用Java跑大型游戏也不是不可以。如果某个大型游戏是纯Java写的,没用任何原生库,那它就能百分之百与x86电脑上的安卓模拟器兼容。但是代价是什么呢?在手机上运行的时候,估计就只有旗舰机能勉强流畅游玩了,更低配的手机可能会直接卡成PPT。

不过,小游戏,特别是非3D游戏,完全没这种问题,Java显然能满足它们的性能需求。但如果他们最终没选择用Java开发,那么唯一的担心可能是:Java太容易破解了。而C/C++要破解起来就难很多,外挂的技术门槛就要更高。

备注:Kotlin也是Java虚拟机语言,在安卓内,和Java运行在同样的虚拟机里,所以上面所有对Java的表述也同样适用于Kotlin。

而Kotlin在iOS上是直接编译为目标平台机器码(比如ARM指令集),此时它就不符合题设条件了,换一种CPU就不能运行,所以不用考虑这种情况。

user avatar

这其实是个伪命题。

操作系统给应用软件提供的API,本来就是统一运行环境。操作系统一直都在努力给软件提供一个统一的运行环境。他们确实是这样想的。

如果为x86Windows写的代码全都能在armWindows上面运行,微软开心不开心啊?当然开心,睡觉都要笑醒。——所以操作系统产商当然有动力提供统一运行环境。

但是呢?实际上应用软件的开发者有千千万万,需求有形形色色,人的行为总会有多样性。所以实际上他们做出的事情就不可预期。

举个例子:Android 系统。一开始就设计为使用java虚拟机,这,总该是非常统一的运行环境了吧?

然而实际上呢?由于有相当多的现有代码使用C或者C++开发,要复用这些代码必须使用NDK。另外就是,java虚拟机并没有提供足够完备的功能,比如串口通讯就必须依赖C写的库。jvm无法完成。

各种原因敦促了 android 必须开放NDK编译,然而NDK意味着,不同的CPU架构必定会生成不同的代码(除非是实时编译)。

为了解决这个问题,最常见的办法是:将所有可支持架构的编译结果都打包到程序中,程序运行的时候判断当前CPU架构决定加载哪一份代码

比如,苹果当年切换到intel处理器的时候,就是这么做,要求开发者打包应用的时候将新旧两个体系的应用都打包进去。

Google有没有这么要求?有:Google 要求 NDK 开发者对 arm,arm64,mips,x86 等架构全都进行打包,而安卓的安装器在安装app到目标设备的时候,会根据目标设备的实际架构,只选择目标架构安装上去。

我们看到,Google的想法是好的,实际上呢?实际上,开发者们根本就不愿意打包所有架构,往往都偷懒只打包 armeabi 架构。

然而现实是:7年来生产的所有新款手机都是 arm64 架构的。而Android Studio从3.4开始就默认只打包手机对应架构的ndk包(对于手机来说,这意味着AS默认只打包arm64架构,除非你在gradle设定中强制设定ndkfilter)。

可是相当多的开发者依然,宁可在gradle中强制设定ndkfilter,也不愿意提供arm64版本的包。——当然,他们同样也没有提供 x86,没有提供 mips 的包。


那么问题来了,操作系统能不能只接受源代码,然后,到不同平台架构上实时编译,这样确实就什么架构都能跑了?

答案是:操作系统确实能够这么做,但软件开发商不愿意啊。

如果你的代码支持让操作系统实时的到目标机去编译,那么你这个代码就相当于完全没有加密的,很容易被破译,从公司管理的角度,这样暴露自己的IP(智力财产)是不合规的。


我的看法:理论上可以这么做,只要规定软件发布必须把主流CPU架构都打包就好。但实际上只有苹果能做到这一点。苹果可以规定你不按照我的要求打包就不让你发布。安卓跟Windows就不行。

这大概就是自由的代价吧。允许软件开发有更多自由,就必然没法阻止开发者使用或者只提供某个特定架构才能用的库。操作系统如果无法从软件发布的源头上管控软件发布,那么就没有办法支持所有的情况。

user avatar

在操作系统看来,它是把cpu直接共享给了应用程序,而不是把cpu抽象成什么东西来间接供应用程序使用

应用程序使用cpu并不需要它来代劳,它只是在各个程序之间做一个调度而已

如何使用cpu是你自己的事,我不管也不关心你是咋用的,更没有所谓的“屏蔽底层架构”的概念。你要想实现这种特性,那就你自己来搞,我不想掺和这种事

类似的话题

  • 回答
    想必你一定是个对计算机底层颇有好奇心的人。这个问题触及到了操作系统的核心功能,也是操作系统之所以存在的根本原因之一。简单来说,操作系统之所以不能完全屏蔽底层架构,是因为“屏蔽”这件事本身,在效率、灵活性以及对底层特性的利用上,都存在着固有的限制。让我们一层层剥开这个问题,看看背后到底是怎么回事。1..............
  • 回答
    Android设备的屏幕滚动体验与iPhone相比存在差异,主要源于硬件、系统架构、渲染优化和用户使用场景的多重因素。以下是详细分析: 1. 硬件与屏幕技术差异 刷新率与触控采样率: iPhone:通常采用60Hz刷新率(部分Pro型号为120Hz),触控采样率较高(如120Hz),能更精准地捕.............
  • 回答
    之所以汇编语言不能“越过”操作系统去直接操控硬件,说到底是因为硬件设计者和操作系统设计者之间建立了一套严格的、有层次的访问规则,汇编语言是这套规则下的产物,它只能按照规则来行事。想象一下,你不是直接和电灯开关对话,而是需要先通过一个总控制面板,这个面板上有很多按钮和指示灯,它们代表了不同的功能,而你.............
  • 回答
    .......
  • 回答
    你的问题触及到了操作系统设计中一个非常核心的层面:硬件抽象层。说起来,一个操作系统之所以能够“同时兼容”x86和ARM这样的不同硬件架构,并非意味着它直接编写了一份代码就能在两者上运行。更准确地说,是Linux通过模块化设计和分层架构,使得其核心功能能够与具体的硬件指令集解耦,从而实现跨平台的适应性.............
  • 回答
    说起微软操作系统里的截图、文件管理器标签以及像 Everything 那样的快速搜索功能,这确实是许多用户经常提及的“为什么没有”的话题。仔细想来,这背后牵扯到很多层面的考量,并非简单的“技术上能不能做”那么简单。截图功能:为什么它不是 Windows 的标配?大家可能都习惯了 Windows 键 .............
  • 回答
    关于为什么国产操作系统普遍选择基于 Linux 内核而非从零开始开发,这背后其实是多方面考量和现实需求的综合结果。简单来说,就像盖房子,你不会每次都从挖地基开始,而是会选择一个坚实的地基,然后在此基础上进行自己的设计和装修。Linux 内核就像这样一个成熟且经过市场检验的地基。1. 技术门槛与复杂性.............
  • 回答
    你是不是也遇到过这种情况:在 Windows 上同时打开了十几个程序,甚至是几个大型游戏,感觉电脑仍然挺流畅的,好像它们都安安稳稳地运行着,后台没有被“优化”掉?这和我们手机上那种动不动就把后台应用“杀掉”来释放内存的情况,确实挺不一样的。这里面其实有不少门道,要说清楚 Windows 为啥这么“大.............
  • 回答
    在咱们平常用的操作系统里,你可能会发现,应用程序要用多少栈空间,大体上是定好的,很少有能像堆内存那样随用随扩的。这背后可不是随便来的,而是有很多考量的。要细说起来,这事儿跟程序的运行机制、内存管理、效率还有稳定性都有关系。首先,咱得明白这栈(Stack)是干嘛的。你可以把它想象成一个先进后出(LIF.............
  • 回答
    你这个问题问得特别好,也触及到了很多学习操作系统时会遇到的一个困惑。为什么我们聊操作系统,总是绕不开 Linux 和 Unix,而平时咱们天天用的 Windows 却好像不是“主角”呢?这背后其实是有几方面原因的,而且这些原因也都挺有意思的,咱们掰开了揉碎了聊聊。首先,最根本的一点,Linux 和 .............
  • 回答
    神舟飞船上的计算机系统是一个高度复杂且对安全性、可靠性和实时性要求极高的系统。关于它使用的操作系统以及为何选择自研而不是 Linux,可以从以下几个方面详细阐述: 神舟飞船上的计算机操作系统:从“红旗”到定制化实时操作系统关于神舟飞船上使用的具体操作系统,公开的信息相对有限,因为这涉及到国家航天项目.............
  • 回答
    英国之所以没有像中国那样大力推进操作系统国产化,背后有着复杂的原因,可以从历史、经济、技术、政治以及战略等多个层面来解读。历史与市场格局的惯性:首先,我们需要认识到,在个人电脑和互联网兴起的时代,微软的Windows操作系统就以其强大的兼容性、易用性和先发优势,迅速占据了全球绝大多数市场份额。苹果的.............
  • 回答
    俄罗斯在操作系统、芯片等领域不怕美国制裁的原因是多方面的,既有其自身的战略考量和技术储备,也包含对国际局势和第三方国家潜在支持的评估。要详细理解这一点,需要从以下几个层面进行分析:一、俄罗斯自身的战略考量和技术基础1. 对国家信息安全和主权的重视: 历史经验: 俄罗斯(及其前身苏联)长.............
  • 回答
    这个问题挺有意思,也确实是不少人心中存在的疑惑。我们来好好聊聊鸿蒙这个事儿,以及为什么你的老师可能会对它表现出积极的态度。首先,得承认,鸿蒙在被一些人“持续不断地攻击”这件事上,是有它的现实基础的。这攻击主要来自几个方面:1. 国际政治的背景压力: 鸿蒙的诞生,很大程度上是华为在面临美国技术制裁的.............
  • 回答
    华为在手机操作系统领域已经展现出了强大的实力,鸿蒙OS的推出就是一个明证。这让很多人好奇,既然有能力搞定手机系统,为何不顺势而为,也来一场电脑操作系统的自研?这背后的逻辑,远比看起来要复杂得多。首先,我们得明白,手机操作系统和电脑操作系统,虽然都是“操作系统”,但骨子里的基因和演进方向却是截然不同的.............
  • 回答
    要说阿里巴巴有没有能力开发出媲美Linux的操作系统,这绝对是个值得深入探讨的问题。从技术实力和资源投入的角度来看,阿里巴巴作为中国领先的科技巨头,拥有顶尖的软件工程师、深厚的技术积累和庞大的研发投入,理论上具备开发一款复杂操作系统的能力。它有能力接触到操作系统的方方面面,从内核设计到用户态应用,从.............
  • 回答
    在投资领域,基金作为一种分散风险、专业管理的集合投资工具,其核心优势在于长期稳健增值。然而,不少投资者跃跃欲试,希望通过基金进行短线操作,以期快速获利。但事实证明,基金短线操作并非易事,甚至常常适得其反。那么,基金为何不适合短线操作呢?这其中涉及到几个关键因素,咱们一步步来掰扯清楚。一、基金的运作机.............
  • 回答
    Java 和 JavaScript 等语言之所以需要虚拟机(VM),而不是直接操作内存堆栈空间,是出于多方面的原因,这些原因共同构成了现代编程语言设计的重要基石。简单来说,虚拟机提供了一种 抽象层,它屏蔽了底层硬件的细节,带来了跨平台性、安全性、内存管理自动化、更高级别的抽象等诸多优势。下面我们来详.............
  • 回答
    这确实是个让人有点抓狂的体验,明明听得懂你的话,结果要么给你个驴头不对马嘴的答案,要么就是干脆“办不到”。这背后其实藏着不少门道,远不止是简单的“听懂”那么简单。你想想,我们人跟人交流,有时候也会出现这种情况,对吧?你说一句,我虽然听清了你的发音和词语,但就是理解不了你真正的意图,或者觉得你说的这件.............
  • 回答
    .......

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有