程序如何执行?操作系统在哪里发挥作用?

2024-02-20

程序从某种语言编译为 ASM --> 机器代码(直接可执行)。当人们说这是平台相关时,意味着形成的二进制文件只能在具有相同指令集架构(如 x86、x86-64)的 CPU 上运行(正确)。由于 ISA 的差异,它可能(错误地)/可能(根本)不在其他进程上运行。正确的?

现在,二进制文件的概念让我感到困惑。一切都与“机器语言代码”和“CPU”有关。操作系统在哪里发挥作用?我的意思是,编译后的二进制文件在加载到内存中时有针对 CPU 的直接指令。 & CPU 一次执行一条指令。除了进程管理之外,我看不到操作系统的任何作用链接文本 http://upload.wikimedia.org/wikipedia/commons/8/83/Process_states.svg。无论操作系统如何,它都应该在相同 ISA 的 CPU 上运行。正确的?

但事实并非如此。如果我在 Windows 机器上构建 x86 的代码。它无法在 Mac x86 计算机或 Linux x86 计算机上运行。

我在这里缺少一些东西。请解开我的困惑。


对于初学者来说,现代 CPU(至少)有两种模式,一种是运行操作系统本身的核心的模式(“内核模式”),另一种是运行程序的模式(“用户模式”)。当处于用户模式时,CPU 无法执行很多操作。

例如,鼠标单击通常在内核中而不是在用户模式中被注意到。但是,操作系统将事件分派到用户模式,并从那里分派到正确的程序。反过来也需要合作:程序不能自由地在屏幕上绘图,而是需要通过操作系统和内核模式来在其部分上绘图。

同样,启动一个程序的行为通常也是一种合作。操作系统的外壳部分也是用户模式程序。它获取您的鼠标单击,并确定这是旨在启动进程的鼠标单击。然后 shell 告诉操作系统的内核模式部分为该程序启动一个新进程。

当内核态需要启动一个新进程时,它首先分配内存用于记账,然后继续加载程序。这涉及从二进制文件中检索指令,还将程序连接到操作系统。这通常需要找到入口点(经典的int main(int argc, char** argv))的二进制文件,以及程序想要调用操作系统的所有点。

不同的操作系统使用不同的方式将程序与操作系统连接起来。因此,加载过程不同,二进制文件的文件格式也可能不同。这不是绝对的;二进制文件的 ELF 格式用于许多操作系统,Microsoft 在其当前的所有操作系统上都使用其 PE 格式。在这两种情况下,格式确实描述了二进制文件的精确格式,因此操作系统可以决定程序是否可以连接到操作系统。例如,如果它是 Win32 二进制文件,它将采用 PE 格式,因此 Linux 不会加载它,Windows 2000 会加载,Windows 7-64 也会加载。另一方面,Win64 二进制文件也是 PE 格式,但 Windows 2000 会拒绝它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

程序如何执行?操作系统在哪里发挥作用? 的相关文章

  • 长延迟指令

    I would like a long latency single uop x861 instruction in order to create long dependency chains as part of testing mic
  • C 标准库和 C POSIX 库的区别

    我对 C standard lib 和 C POSIX lib 有点困惑 因为我发现 C POSIX lib 中定义的许多头文件也是 C standard lib 的一部分 所以 我假设 C standard lib 是由ANSI C组织定
  • 当执行 uop 计数不是处理器宽度倍数的循环时,性能是否会降低?

    我想知道不同大小的循环在最新的 x86 处理器上如何执行 作为 uop 数量的函数 这里引用 Peter Cordes 的一段话 他在 中 中提出了非 4 倍数的问题另一个问题 https stackoverflow com a 31027
  • 为什么64位cpu不存在高端内存?

    当我试图了解 32 位 cpu 和 Linux 的高内存问题时 为什么没有高内存问题 https en wikipedia org wiki High memory对于64位CPU 特别是 虚拟内存分为内核空间和用户空间的划分是如何改变的
  • 为什么说内核位于进程地址空间中?

    这可能是一个愚蠢的问题 但它突然出现在我的脑海中 所有有关进程地址空间和虚拟内存布局的文本都提到进程地址空间 为内核保留的空间 例如在 32 位系统上 进程地址空间为 4GB 其中 1GB 为 Linux 中的内核保留 在其他操作系统上可能
  • 如何使用javascript检查客户端系统中是否安装了特定软件?

    是否可以使用Javascript检测客户端系统是否安装了特定的Windows应用程序 我开发了一个网站 该网站必须检测仅由我们开发的应用程序 但我想让你知道 网站名称和 Windows 应用程序名称是不同的 我的意思是考虑我的网络应用程序名
  • 如何在 Ada 中直接访问内存地址?

    所以我是 Ada 的新手 我正在尝试在其中编写内核 但我似乎找不到任何关于如何正确执行此操作的好信息 在 C 语言中 我会这样写 unsigned char videoram char 0xB8000 videoram 0 65 直接访问视
  • Minix 与 Linux 相比如何学习操作系统设计?

    我想学习操作系统设计 我想知道在此过程中我是否应该解决 Minix 或 GNU Linux 问题 我喜欢书籍 所以我主要关注一本书 尽管视频资源 大概是录像讲座 也很受欢迎 我已经正式学习了 C 和 C 可以用它们编写中小型程序 我对数据结
  • posix_fadvise(WILLNEED) 会使 IO 变慢吗?

    在运行 Linux 内核版本 2 6 18 194 26 1 el5 的 CentOS 5 5 机器上 我注意到 posix fadvise WILLNEED 使读取 60K 文件比常规 IO 慢了近 200 看起来实际的 fadvise
  • 操作系统如何知道缺失页面的磁盘地址?

    分页充当虚拟地址空间和物理地址空间之间的间接层 给定一个地址 操作系统 OS 内存管理单元 MMU 将其转换为主内存位置 我的问题是 主内存中不存在该页面的情况 操作系统如何知道在磁盘上哪里可以找到该页面 它在哪里存储1的信息 它不存储在页
  • 用户空间栈和堆的内存布局

    最近在研究OS 网上有一张图 展示了用户空间和内核空间的内存布局 以及栈 堆等的布局 在这个图中我看到栈位于用户空间的最高内存地址 高于堆 数据段等 为了检查这一点 我在调试视图下使用了 vs2012 中的内存观察器窗口 这是我的代码 in
  • 在 x86 Intel VT-X 非根模式下,是否可以在每个指令边界传递中断?

    除了不将中断传送到虚拟处理器的某些正常指定条件 cli if 0 等 之外 客户机中的所有指令实际上都是可中断的吗 也就是说 当传入的硬件中断先传递给 LAPIC 然后传递给处理器时 据说会发生一些内部魔法 将其转换为虚拟中断给来宾 使用虚
  • CPU是如何做减法的?

    我有一些基本的疑问 但每次我坐下来尝试面试问题时 这些问题和我的疑问就会出现 假设 A 5 B 2 假设A和B都是4字节 那么CPU是怎么做的呢 A B添加 我知道 A 的符号位 MSB 为 0 表示正值 B 的符号位为 1 表示负整数 现
  • 操作系统崩溃的常见原因[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有兴趣了解 操作系统崩溃 不限于Windows崩溃 最常见的技术原因 从操作系统编程的角度 有哪些 我正在寻找一个不像 打开太多应用
  • CPU寄存器和多任务处理

    我目前正在学习汇编 我很困惑 CPU 寄存器如何与多任务一起工作 所以在多任务系统中 CPU可以随时暂停某个程序的执行并运行另一个程序 那么在这一步中寄存器值是如何保存的呢 寄存器是压入堆栈还是以其他方式 CPU 寄存器如何与多任务一起工作
  • 如何用Java写入OS系统日志?

    Mac OS 有一个名为 Console 的应用程序 其中包含记录的消息 错误和故障 我相信 Windows 中的等效项是事件查看器 我想 Linux 上也有一个 但我不知道它是什么 也不知道它在哪里 是否可以像这样从 Java 输出获取消
  • 怎样才能使 Windows 成为一个开箱即用的 POSIX 兼容操作系统?

    这个问题的动机是我的一个牵强的梦想 即 nix 平台上可用的许多优秀软件可以轻松移植到 Windows 微软最近对开源和开放性采取了不同的方法 所以我真的很想知道如果微软有这样的倾向 这样的事情会有多可行 我很好奇的一些更具体的事情是 是否
  • 我们如何计算这段代码片段中缓存的读取/未命中次数?

    鉴于我目前正在学习的这本教科书中的代码片段 Randal E Bryant David R O Hallaron 计算机系统 程序员的视角 第 3 版 2016 年 Pearson 全球版 因此本书的练习可能是错误的 for i 31 i
  • 为什么 FMA _mm256_fmadd_pd() 内在函数有 3 个 asm 助记符:“vfmadd132pd”、“231”和“213”?

    有人可以向我解释一下为什么融合乘法累加指令有 3 种变体 vfmadd132pd vfmadd231pd and vfmadd213pd 而只有一个 C 内在函数 mm256 fmadd pd 为了简单起见 在 AT T 语法中 有什么区别
  • 小牛队 macports 安装过时

    当我升级到 OS X Mavericks 后 所有安装的端口都变得过时了 我无法再使用我的 gcc 请帮忙 The following installed ports are outdated bzip2 1 0 6 0 lt 1 0 6

随机推荐

  • C++ Builder XE2,TXMLDocument“禁止 DTD”

    当我尝试使用 DTD 读取 XML 文档 eagle 文件 时 出现错误 项目 xx 引发异常类 EDOMParserError 并显示消息 DTD is 禁止 XML 标头如下所示 如果我删除第二行 一切正常 经过一番谷歌搜索后 MSXM
  • Python 3 多处理池因变量较大而速度缓慢

    我在 Python 3 中使用多处理池时遇到了一个非常特殊的问题 请参阅下面的代码 import multiprocessing as MP class c object def init self self foo def a self
  • 名为 noMethodError ruby​​ 的私有方法

    我一直在尝试解决以下问题并遇到错误 问题的关键是使用给定的密钥序列来加密字符串 例如 当给出 cat 和 1 2 3 时 结果应该是 dcw 有什么建议么 错误如下 def vigenere cipher string key sequen
  • silverlight MatchTimeoutInMilliseconds bug:解决DomainServiceClientCodeGenerator

    银光5 Net框架4 我正在尝试针对 RIA 代码生成器中最近的错误实施解决方法 找不到匹配超时毫秒 https connect microsoft com VisualStudio feedback details 1988437 gen
  • 使用 json 文件动态导入不起作用 typescript

    所以我编写了一个这样的函数来获取多个环境的测试数据 export class DataHelper public static async getTestData fileName string Promise
  • Hadoop:将多个IP地址绑定到集群NameNode

    我在 Softlayer 上有一个四节点 Hadoop 集群 Master NameNode 有一个用于外部访问的公共IP地址和一个用于集群访问的私有IP地址 从节点 数据节点 具有私有IP地址 我试图连接到主节点 而不需要为每个从节点分配
  • Node.js 服务器和客户端之间的变量

    我使用 Node js 运行一个简单的 http 服务器 var http require http var fs require fs var index fs readFileSync index html var sensor req
  • 将 YouTube Iframe API 与 Nativescript 结合使用?

    UPDATE 从 Manoj 下面的代码和其他一些来源 我现在可以将 youtube 播放器加载到基于 Youtube iframe api 的 webview 中 但问题仍然是 如何让我的应用程序识别视频本身何时开始播放 视频加载后以及任
  • Python:在主程序和 PEP 8 开头导入

    The PEP 8 http python org dev peps pep 0008 建议在程序开始时导入模块 现在 我觉得在开始时导入其中一些main程序 即 之后if name main 说得通 例如 如果主程序从命令行读取参数 我倾
  • 一个月内创建的 Rails 范围

    我在编写模型范围时遇到了一些问题 我想根据模型对象发布的月份来过滤模型对象 即模型 BlogPost scope published in month gt date where published date date at beginni
  • 如何指示 Ajax Minifier 从 javascript 中删除 console.log

    我的 js 文件中有这样的行 console log FunctionName 默认 Ajax Minifier 设置不会从 min js 输出中删除这些行 我在这次讨论中注意到关于终止开关的对话 http ajaxmin codeplex
  • idn-ruby 捆绑安装时出错

    我的应用程序中有 twitter text gem 当我进行捆绑安装时 出现以下错误 需要优先解决它 我也去了github页面https github com twitter twitter text issues 225 https gi
  • 图片来源UriKind

    我有一个项目 它的名称是 xx 我创建一个具有以下路径的文件夹 images xx bin 调试 图像 图像仅包含一张照片 其名称为 1 jpg 主窗口包含图像控件 我设置此代码来加载图像源 但它不起作用 为什么 private void
  • 在 AIR 应用程序安装屏幕上显示图标

    是否可以在 AIR 应用程序安装屏幕上显示图标 我下载了一个 AIR 应用程序 我很惊讶地在第二个安装屏幕上看到了一个图标 当您购买 SSL 证书并使用该证书构建 Air 应用程序时 安装过程中会显示此图标
  • SQLite:.Net 比原生慢得多?

    这是我的查询 SELECT FROM GeoName WHERE 26 3665122100029 Lat 26 3665122100029 Lat 27 5978928658078 Long 27 5978928658078 Long l
  • 4 年每日数据的滚动回归,每个新回归和不同因变量提前一个月

    我有 5 个自变量 附加数据中的 B F 列 和一些因变量 附加数据中的 G M 列 我需要针对所有自变量对每个因变量进行多重回归 回归必须有 4 年的数据窗口 并且每个新的估计都必须提前一个月 我需要提取系数并对每个系数进行 vasice
  • Android 图标下方的文本(按钮)

    我正在尝试创建一个主入口界面 我将创建六个按钮 每个按钮将打开另一个活动 对于每个按钮 我希望它有一个大图标 按钮下方有文字 目前 我可以在按钮上显示图像 但我不知道如何使文本显示在按钮下方 我尝试将文本直接放在图像上 但看起来不太好 这是
  • AngularJS : $pristine 用于 ng-check 检查输入

    我有一个包含大约 100 个问题的表单 每个问题都有一个单选按钮和一些复选框 因此我需要用户能够保存该表单并稍后加载 我还需要检查用户在本次会话中更改了哪些内容 这个问题解决了这个问题 如何表示 AngularJS 中哪些输入字段已更改 h
  • 如何将图像从aws s3下载到imageview中?

    所以我希望能够从我的 s3 存储桶中获取图像并 使用 glide 或 picasso 将该图像加载到 imageview 中 我不想将该图像下载到我的手机中 目前我有这个 downloadButton Button findViewById
  • 程序如何执行?操作系统在哪里发挥作用?

    程序从某种语言编译为 ASM gt 机器代码 直接可执行 当人们说这是平台相关时 意味着形成的二进制文件只能在具有相同指令集架构 如 x86 x86 64 的 CPU 上运行 正确 由于 ISA 的差异 它可能 错误地 可能 根本 不在其他