可执行二进制文件和操作系统

Posted

技术标签:

【中文标题】可执行二进制文件和操作系统【英文标题】:Executable binaries and the OS 【发布时间】:2016-05-22 13:16:41 【问题描述】:

我知道可执行文件(例如:Windows 的 .exe)是二进制文件。我知道十六进制文件和汇编等。我也知道操作系统 API。从理论上讲,我可以完全用汇编代码编写一个 Web 浏览器,该代码使用 OS API,用 NASM 汇编它并获得一个可执行文件。但我的问题是,操作系统如何控制应用程序?例如,我可以在 Windows 上有一个可执行文件写入视频内存,并用随机的东西填充屏幕。我已经尝试过了(实际上)并且 Windows 停止了应用程序。它如何控制应用程序?此外,如果我有一个 linux 可执行文件并且我尝试在具有完全相同硬件的 Windows 机器上运行它,理论上它应该可以工作(尽管它不会使用任何 Windows API),因为处理器架构是相同的,但是它不能。操作系统究竟是如何“控制”二进制文件的?

【问题讨论】:

【参考方案1】:

操作系统,特别是 windows 和 linux 保护其他应用程序和操作系统本身免受应用程序的影响。所以有一个保护层,理想情况下应用程序无法以用户身份运行。

你想把像素放在屏幕上,你必须让操作系统为你做这件事。如果操作系统允许通过某种方式(调用 mmap 可能必须以 root 身份运行),那么您可以随意丢弃计算机,是的。计划/设计是不让您直接访问,给您一个虚拟空间,一个沙箱,供您的应用程序在其中运行,您有一个虚拟地址空间和一些您可以随意读写的内存,但是您可以除此之外,您需要被关闭或至少以某种方式处理。

至于你用什么语言编写应用程序是的,如果它是一个普通的 windows 程序或 linux 程序,那么你可以做任何事情来为那个目标生成机器代码,asm,ada,C 等。如果你在说特定的虚拟机(java、python),那么您的选择就会受到更多限制。如果你想做的不仅仅是在你的空间里玩,比如有某种输出而不是返回值,那么你必须以系统需要的方式进行系统调用,这是目标和操作系统特定的。再一次,你得到正确的指令或寄存器或内存结构或操作系统所需的任何东西,以你使用的任何语言或你可以链接的库,然后你的程序的其余部分可以用任何语言,是的,绝对您想使用 nasm 用汇编语言编写 Web 浏览器,这是完全可行的。必须创建操作系统支持的二进制格式,并按照系统需要的方式进行系统调用。

【讨论】:

以上是关于可执行二进制文件和操作系统的主要内容,如果未能解决你的问题,请参考以下文章

Racket如何生成二进制的可执行文件?

Python包安装脚本安装二进制可执行文件

程序编译链接后形成的可执行文件是啥文件

文件系统结构和基础命令

C#如何编译为二进制可执行文件?

可执行文件格式elf和bin