不懂就问,为啥同一个软件不能用在 x86 和 amd 的 CPU 上?

2020-06-26 21:00:28 +08:00
 x97bgt

我的理解是,这两种架构的指令集不一样,但只要操作系统做好封装,那么软件就不用去关心用的是哪种 CPU 架构。用何种架构只要操作系统感知到就可以了。

难道软件需会直接去执行汇编语言吗?

求解惑。

3890 次点击
所在节点    程序员
28 条回复
murmur
2020-06-26 21:06:27 +08:00
这种观点都是 A 黑才说的出来,amd 和 intel 专利交叉授权,没有说啥杀手锏你有我没有,硬说 avx512 算一个,但是不足以作为杀手锏,还有 matlab 这种故意不给 amd 用指令集恶心人的

如果你找到这样的“常用”软件,可以找出来说一下
across
2020-06-26 21:08:28 +08:00
你说的那个叫虚拟机,java c#这种带了“封装”。
c++这种编译器可没有中间层,会翻译成指令的。
uechris
2020-06-26 21:09:22 +08:00
我猜你是在说 ARM 而不是 AMD?
如果不是的话,当我没说(
hahasong
2020-06-26 21:10:20 +08:00
amd 的架构叫 amd64, 也就是 intel 的 x86_64 。运行 x86 软件不是很合情合理
anguiao
2020-06-26 21:10:51 +08:00
你是想说 ARM ? AMD 也是 x86 啊。
然后你说的这个应该叫虚拟机,操作系统不负责这个。
janxin
2020-06-26 21:11:00 +08:00
如果没有特殊指定处理,确实是牙膏厂农企会通用

但是为了某些厂商提供的特性,比如 1L 说的高级矢量扩展 AVX,牙膏厂硬件加速 HAXM 等等不包含在这个范围内的
opiviqo
2020-06-26 21:11:22 +08:00
某指令集 没有你咋写汇编? 你觉得是现有程序 还是 现有编译器?
wdlth
2020-06-26 21:11:58 +08:00
编译型的会生成汇编语言,是平台相关的。
reus
2020-06-26 21:12:40 +08:00
AMD 就是 x86 / x86_64 指令集啊
“同一个软件不能用在 x86 和 amd 的 CPU 上”,这是假命题
有些指令是 AMD 或者 intel 独有的,一般由基础库做探测,并选择不同的分支,很少有应用程序只兼容 intel cpu 的
例如虚拟化的指令,amd 和 intel 的就不同,但虚拟机软件都会让你选择用哪一种,或者自动选择
总之,指令集可以认为一样,操作系统也不会管
汇编语言也要经过汇编器,变成二进制文件,并没有“执行汇编语言”这种说法

以上所有知识都是计算机基础知识,找一本书学习最好,问网友是学不了成体系的知识的。
VDimos
2020-06-26 21:12:53 +08:00
比如?
libook
2020-06-26 21:18:35 +08:00
是想问 x86 和 arm 吧,现在 AMD Ryzen 也是 x86 的。

除了虚拟机、解释器类的程序以外,基本上都是要编译成机器码的,操作系统只是提供资源管理的 API,比如创建进程、申请内存、访问文件系统等等。

由于不同 CPU 指令集的中断地址有差异,所以需要不停的编译器来将源代码按照相应的指令集进行编译,而且有的指令 x86 有、arm 没有,相同的源代码可能可以直接编译为调用 x86 的对应指令,但是在 arm 上只能编译成对应的软解方案。

不是系统开发专业人士,可能说得不准确,请大佬斧正。
hoyixi
2020-06-26 21:18:57 +08:00
大多数软件都通用,因为大部分应用软件就是调用操作系统封装好的通用 API 。

个别软件(或者某软件的个别功能)需要使用 CPU 的特有技术 or 功能,而操作系统没有做适配,那就无法通用
charlie21
2020-06-26 21:25:24 +08:00
你是不是以为罗永浩都可以成立一家公司在做个人电脑 CPU 的领域打败 Intel ?
做好封装就可以了嘛
x97bgt
2020-06-26 22:03:19 +08:00
对的,是 arm,写错了
jinliming2
2020-06-27 02:22:57 +08:00
操作系统只封装资源的管理调度,具体的程序指令还是会直接交给 CPU 去跑的。
SingeeKing
2020-06-27 02:40:16 +08:00
根据我的大概理解,应用程序执行的指令大体上分为两类,一部分是普通的指令,这些确确实实是直接操作 CPU 的,CPU 收到后发现指令没问题就会执行,这种情况操作系统不会介入;而另一类指令是特权指令,这些指令如果直接交由 CPU 执行是会被拒绝的(有一个标志着特权级的标志寄存器),这时如果想要执行这些指令就必须通过系统调用,这时才会引入操作系统介入。

根据上面的描述,如果操作系统不做特殊处理,上面说的第一类指令是直接交由 CPU 执行而 CPU 会直接发现指令无法识别触发异常而不能执行于是这个程序就崩溃了。

不过,根据苹果在 WWDC 上说的,初期苹果肯定会引入一个系统级的「虚拟机」,当监测到程序是 Intel CPU 时代的程序时就会将指令进行「翻译」,转换成 CPU 可以理解的就没问题了,因此就是网上说的会降低一定速度但是不会无法运行。

另外你的「难道软件需会直接去执行汇编语言吗」,答案可以说是肯定的。编译的过程可以简单理解为就是吧写的代码转换成计算机能读懂的指令二进制,而这个二进制指令其实就是汇编(一一对应翻译的关系),所以可以说执行编译好的软件的过程其实就是执行编译后的「汇编代码」
chiu
2020-06-27 07:38:59 +08:00
好像是说 ARM ?
编译型软件最后是编译成执行的指令集,运行在芯片层级上。如果按你说的方式,应该编译出来的结果是对封装好的接口层的调用,运行在统一 API 层之上。
delectate
2020-06-27 09:15:32 +08:00
举个例子就行了。

电动汽车、柴油车、汽油车。
都是能跑起来的车,载货能力、动力、舒适性都近似(上层应用,如车载电器),但是底层不同(能源、动力源),故此不能把柴油加到汽油车里(江河老师,你可长点心吧)。

对于上层应用,根本不需要知道是汽油机还是柴油机,或者动力锂电,只要知道点烟器是 12/24v 就可以了。而对于底层,则是巨大的不同,需要工程师费劲心机写一大堆代码( ECU ),进行各种精心调教(汽车讲究“平台”,几十万几百万的奥迪,也许和十几万的斯柯达是同一个平台)。

那么,如果这个上层应用是针对底层的,那么完全没可能做到通用、兼容(汽车的 ECU 怎么可能互换呢?);如果这个应用是无关紧要的,也许可以互换(比如行车记录仪),但是也要考虑兼容。
flynaj
2020-06-27 10:28:18 +08:00
软件依赖于操作系统更 CPU,不同的操作系统有不同的文件格式,不同的 CPU 有不同的指令集, 你可以看看这个全平台软件 10 多个包 https://syncthing.net/downloads/
qakito
2020-06-27 10:29:54 +08:00
1. 如果是可执行的二进制文件,本身就是机器码;不同架构机器码不同;函数出入栈规范不同;寄存器使用规范不同
2. 如果是可执行的脚本文件,没差
3. 即便是相同的 API,不同架构上也有部分差异,比如部分信号值在不同架构上是不同的(详见 man 7 signal)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/684925

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX