为什么应用程序是特定于操作系统的?[计算机原理]

你把WINDOWS程序复制到MAC上使用,会发现无法运行。你可能会说,MAC是arm处理器,而WINDWOS是X86 处理器。但是在2019年,那时候MAC电脑还全是Intel处理器,在同样的X86芯片上,运行MAC和WINDOWS 程序还是无法互相兼容。如果我们深入思考,这应该让我们感到困惑,因为可执行文件本质上是对于CPU的机器码。那问题就是:

为什么都是机器码,而不能迁移?

应用程序为何特定于操作系统的原因。即使两个操作系统使用相同的 CPU 架构,应用程序也可能无法在两个系统上运行。这是因为应用程序不仅与架构相关,还与操作系统相关。这是一个非常重要的结论,它告诉我们,虽然应用程序理论上是直接对于CPU的机器码,但是实际上受到在CPU上运行的操作系统的节制。那我们的程序,在什么时候,执行什么任务的时候,会和操纵系统相关呢?答案是系统调用(SYSTEM CALLS)的时候(聪明的同学可能已经明白怎么回事了,此事在LC3 TRAP陷入程序中亦有记载)就是
应用程序机器码 = 架构机器码 + 操作系统调用机器码 应用程序机器码=架构机器码+操作系统调用机器码 应用程序机器码=架构机器码+操作系统调用机器码
CPU 工作模式

在这里插入图片描述

CPU在现代计算系统中如此重要,如此处于关键地位。所有的程序的执行都要依赖它,这也意味着那些愚笨的程序员,或则恶意的程序员写的代码,如果也一字不落的执行,会对整个计算机系统造成重大危害。所以CPU有两种工作模式: 内核模式(KERNAL MODE) 和 用户模式(USERMODE)

在内核模式的时候,CPU被赋予了超级权限,它可以执行指令集中的全部内容。这样他可以完成如下功能:IO,操作计时器,读取内存。 (诸如此类的硬件操作

而用户模式之下,CPU只会执行它的指令集的子集。完成基本的数据移动,复制,条件和循环。这些指令很有用,但是在很多时候不能满足和硬件交互的需求。

你或许已经明白操作系统工作在内核模式,而普通的应用程序工作在用户模式

当普通的应用程序需要和硬件进行交互的时候。就会调用操作系统提供的接口。即操作系统调用。这个时候CPU的工作模式就会从用户模式转换为内核模式。将那些比较危险的操作(内存泄漏之类的啊嗯)代有操作系统完成。

操作系统的特殊接口

可以想见,操作系统通过系统调用提供服务,而这些系统调用通常是特定于操作系统的。所以应用程序基本都是特定于操作系统的。此外,可执行文件的格式也是引发兼容性问题的一个重要因素。操作系统对程序的结构和加载方式有特定的规则,以确保可执行文件的正确运行。此外,运行时环境也是影响因素之一某些编程语言在虚拟机或解释器上运行,使得代码能够跨平台运行。然而,这也带来了兼容性问题。

还有一个重要的原因,就是可执行文件格式,程序不光包含机器码,还有数据(比如运行时需要展示的字符串,图片,音频什么的)不同的操作系统把这些资源和机器码的打包方式和读取方式是不一样的,LINUX使用ELF(可连接和可执行文件格式)WINDOWS使用的PE格式(便携式可执行文件格式)。这也是一大因素,不过,不是我们今天讲的主要内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/960876.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LigerUI在MVC模式下的响应原则

LigerUI是基于jQuery的UI框架,故他也是遵守jQuery的开发模式,但是也具有其特色的侦听函数,那么当LigerUI作为View层的时候,他所发送后端的必然是表单的数据,在此我们以俩个div为例: {Layout "~/View…

BurpSuite--暴力破解

一.弱口令 1. 基本概念 介绍:弱口令(weak password)是指那些容易被他人猜测或通过工具破解的密码。虽然弱口令没有严格的定义,但通常它指的是由简单的数字、字母、常用词语或规律性组合构成的密码。 特点: 密码容易被…

深入探讨防抖函数中的 this 上下文

深入剖析防抖函数中的 this 上下文 最近我在研究防抖函数实现的时候,发现一个耗费脑子的问题,出现了令我困惑的问题。接下来,我将通过代码示例,深入探究这些现象背后的原理。 示例代码 function debounce(fn, delay) {let time…

【PostgreSQL内核学习 —— (WindowAgg(一))】

WindowAgg 窗口函数介绍WindowAgg理论层面源码层面WindowObjectData 结构体WindowStatePerFuncData 结构体WindowStatePerAggData 结构体eval_windowaggregates 函数update_frameheadpos 函数 声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊…

RocketMQ消息是如何存储的?

大家好,我是锋哥。今天分享关于【RocketMQ消息是如何存储的?】面试题。希望对大家有帮助; RocketMQ消息是如何存储的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RocketMQ 使用了一个高性能、分布式的消息存储架构…

MongoDB平替数据库对比

背景 项目一直是与实时在线监测相关,特点数据量大,读写操作大,所以选用的是MongoDB。但按趋势来讲,需要有一款国产数据库可替代,实现信创要求。选型对比如下 1. IoTDB 这款是由清华大学主导的开源时序数据库&#x…

电力晶体管(GTR)全控性器件

电力晶体管(Giant Transistor,GTR)是一种全控性器件,以下是关于它的详细介绍:(模电普通晶体管三极管进行对比学习) 基本概念 GTR是一种耐高电压、大电流的双极结型晶体管(BJT&am…

蓝桥杯python语言基础(4)——基础数据结构(上)

目录 一、列表与元组 (一)列表 (二)操作列表 (三)元组 习题P502 习题P497 二、字符串 (一)字符串的基本操作 (二)字符串的常用方法 (三&…

langchain基础(三)

Chain: 关于三个invoke: 提示模板、聊天模型和输出解析器都实现了langchain的runnable接口, 都具有invoke方法(因为invoke方法是Runnable的通用调用方法) 所以可以一次性调用多次invoke直接得到最终结果:…

数据分析和AI丨应对AI实施挑战,工程领域AI应用的五大方法

工程领域的人工智能 (AI) 已经开始发挥价值,低代码和无代码工具正在使曾经仅属于专业数据科学家的 AI 能力变得大众化。 然而,并非工程领域的每个人都能从中受益,使用新的便捷的 AI 工具提高工作效率并不难&#xff0c…

【Linux探索学习】第二十七弹——信号(一):Linux 信号基础详解

Linux学习笔记: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 前面我们已经将进程通信部分讲完了,现在我们来讲一个进程部分也非常重要的知识点——信号,信号也是进程间通信的一…

games101-(5/6)

光栅化 投影完成之后,视图区域被确定在从[-1,1]的单位矩阵中,下一步就是光栅化 长宽比:ratio 垂直的可视角度:fild-of-view 可以看到的y 轴的范围,角度越小 越接近正交投影 屏幕坐标系 、 将多边形转化成像素 显示…

Linux之详谈——权限管理

目录 小 峰 编 程 ​编辑 一、权限概述 1、什么是权限 2、为什么要设置权限 3、Linux中的权限类别- 4、Linux中文件所有者 1)所有者分类(谁) 2)所有者的表示方法 ① u(the user who owns it)(属主权限&…

oracle比较一下统计信息差异吧

统计信息发生了哪些变化? 从上次收集到最近一次收集有什么不同? set long 999999 longc 99999 line 100 select report, maxdiffpct from table(dbms_stats.diff_table_stats_in_history(SYS,T1,to_timestamp(2025-01-22 09:01:46,YYYY-MM-DD hh24:mi:s…

【现代深度学习技术】深度学习计算 | 参数管理

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…

用WinForm如何制作简易计算器

首先我们要自己搭好页面 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace _7_简易计算…

spring入门其实特别简单,也可以做单机。

直接在官网配置 点右边的"ADD DEPENDENCIES",选“Spring Web” 然后点“GENERATE”,会自动下载一个demo.zip。解压demo.zip,用IntelliJ IDEA打开就能用了。 IntelliJ IDEA打开之后,你得配置你的

智慧消防营区一体化安全管控 2024 年度深度剖析与展望

在 2024 年,智慧消防营区一体化安全管控领域取得了令人瞩目的进展,成为保障营区安全稳定运行的关键力量。这一年,行业在政策驱动、技术创新应用、实践成果及合作交流等方面呈现出多元且深刻的发展态势,同时也面临着一系列亟待解决…

C++封装红黑树实现mymap和myset和模拟实现详解

文章目录 map和set的封装map和set的底层 map和set的模拟实现insertiterator实现的思路operatoroperator- -operator[ ] map和set的封装 介绍map和set的底层实现 map和set的底层 一份模版实例化出key的rb_tree和pair<k,v>的rb_tree rb_tree的Key和Value不是我们之前传统意…

1. Java-MarkDown文件创建-工具类

Java-MarkDown文件创建-工具类 1. 思路 根据markdown语法&#xff0c;拼装markdown文本内容 2. 工具类 import java.util.Arrays; import java.util.List;/*** Markdown生成工具类* Author: 20004855* Date: 2021/1/15 16:00*/ public class MarkdownGenerator {private Str…