wine 如何运行exe 应用

知道了wine 能够运行Windows 应用以后,一直觉得很奇怪,它是如何调起exe 应用的。下文将详细解释。
在此之前,需要了解下Windows/Linux 分别是如何运行应用程序的。
Windows下可执行文件格式为 PE(Portable Executable),后缀一般为.exe;
Linux下可执行文件格式为 ELF(Executable Linkable Format),无后缀。

下面两幅图分别简要描述了两种格式的区别,如果需要进一步了解两种格式具体的内容,可以查阅官方文档。

  1. PE 格式
    https://learn.microsoft.com/zh-cn/windows/win32/debug/pe-format

  2. ELF 格式
    https://refspecs.linuxbase.org/elf/elf.pdf

Windows 下运行应用过程

当我们在双击exe 文件时,Windows 系统会执行操作如下:

  1. 创建进程,主线程;
  2. 系统程序检查.exe 文件头;
  3. 连接器嵌入exe 文件头信息;
  4. 导入所需要的dll;
  5. 初始化运行库;
  6. 执行代码中的main 类似入口函数;

Linux 下运行应用程序

当我们在执行Linux 应用时,Linux系统会执行如下操作:

  1. 内核加载映像(≈二进制文件)并看到它是一个动态可执行文件
  2. 内核加载动态加载器(ld.so)并给它控制权
  3. 动态加载器解决依赖关系并加载它们
  4. 动态加载器将控制权交还给原始二进制文件
  5. 原始二进制文件在_start()中开始执行,最终进入main()。

很显然,如果直接执行exe 文件,Linux 系统是不认可的,因为它不是linux 动态可执行文件。每个可执行文件都有定义的一些头文件,里面包含依赖的动态链接库以及运行地址等信息。以一个简单的helloworld 程序为例,编译成Window 版本和Linux 版本以后。均可以通过工具查看到其依赖:



那么wine 是如何实现在linux 环境中运行exe 的呢。基于Windows 和Linux 不同的运行流程,wine将Windows可执行文件加载到内存中,解析它,找出依赖关系,找出可执行代码的位置(即.text部分),然后最终跳转到该代码。也即实现了 ld-linux-x86-64.so.2 类似的功能。
理论很简单,实现上确实有较大的难度。难度主要集中在以下几个方面:
1、.text 代码段如何能够在linux 正常运行;
编译生成的机器代码,只要CPU架构是一样的,则意味着其指令集也是一样的,按照逻辑来讲,只要CPU 架构是一致的,是可以正常运行。

2、代码段中涉及系统调用的函数,需要由内核去完成,这时候,应用程序代码需要一种方法来 "中断 "自己,将控制权交给内核(这种操作通常称为上下文切换)。在每个操作系统上,操作系统所暴露的函数集和调用这些函数的方式都是不同的。
Linux上:read, write, open, brk, getpid
Windows上:NtReadFile, NtCreateProcess, NtCreateMutant 。

针对Windows ,可以看如下这幅图,当然,在linux 下同样有用户模式和内核模式的跳转。

在wine 实现中,在用户层和内核层的接口处,提供ntdll 的自定义实现。在Wine的最新版本中,它由两部分组成:ntdll.dll(PE库)和ntdll.so(ELF库)。第一个部分是一个薄层,只是将调用重定向到ELF对应部分。ELF对应库包含一个名为__wine_syscall_dispatcher的特殊函数,它执行了一个将当前堆栈从Windows转换到Linux并返回的魔术。因此用户调用创建文件 时,就会有如下的调用过程:

CreateFile(kernal) -> NtCreateFile(ntdll.dll) ->NtCreateFile(ntdll.so)

其中特殊分发函数__wine_syscall_dispatcher 和 __wine_syscall_dispatcher 函数,其实际上是一段针对不同CPU 优化的汇编代码,实现都在针对不同架构处理器的文件中,如:signal_arm.c /signal_arm64.c / signal_x86_64.c /signal_i386.c;

3、Windows 有着众多的dll 和系统API ,并且这些实现是不开源的,可以获取的文档资料也有限制,无法完全去实现部分API;

4、如果有应用(尤其是游戏应用),绕过ntdll,直接调用syscall,那么wine 将无法做到适配。

wine 如何运行exe 应用相关推荐

  1. Linux Deepin 20 运行exe的办法非官方汇总wine、winehq、deepin-wine、crossover:heidisql、wechat、potplayer

    简介 OS: Deepin linux 20.01 5.7 amd64 desktop 目的:运行安装在win上的heidisql portable(只有windows版本),开发者也想编译成exe, ...

  2. Mac运行exe的几种方法,欢迎补充!

    Mac运行exe的几种方法,欢迎补充! 1. 用wine直接运行exe.安装wine后有个放exe的文件夹,双击后会自动包装运行.看起来挺方便的,就怕暂用资源比较大: http://www.youtu ...

  3. 深度linux运行wine,如何在Deepin深度桌面环境下直接运行exe安装Wine

    此方法基于深度酒. Wine软件是一个在Linux系统环境下使用Win平台软件的环境插件. URL.1: 这是Wine的官方内容 URL.2: 这是Deepin官方社区提供的内容: tid = 174 ...

  4. 【转】在Ubuntu中运行Exe程序

    在Ubuntu中运行Exe程序 原文地址: https://jingyan.baidu.com/article/d45ad148a78cbe69552b8089.html 标签:ubuntu 1 2 ...

  5. deepin安装windows虚拟机_Deepin Linux V20系统通过安装wine实现运行windows程序

    Wine是一个虚拟机,能够在多重操作系统上运行(Linux,Mac等):wine软件是能在linux环境中使用win平台软件的一个环境插件. 安装方法: 1.添加仓库 以root身份修改/etc/ap ...

  6. android wine教程_技术|如何在 Android 上借助 Wine 来运行 Windows Apps

    Wine(一种 Linux 上的程序,不是你喝的葡萄酒)是在类 Unix 操作系统上运行 Windows 程序的一个自由开源的兼容层.创建于 1993 年,借助它你可以在 Linux 和 macOS ...

  7. 在Mac上运行.exe文件

    有问题,多谷歌, 方法一是BootCamp 关于BootCamp的详细资料,可以在Apple的官方网站上面查看 方法二是虚拟机 VMvare和Viralbox是大家常用的 方法三 用crossover ...

  8. mac上安装vbox虚拟机运行win7系统,mac上运行exe

    想在mac运行exe,发现有三种方法: 1. 虚拟机安装win镜像 2. wine或者crossover软件 3. Parallels Desktop 2尝试了发现很多exe都不能运行,3文件很大操作 ...

  9. WineBottler for Mac (Mac运行exe程序) 使用教程

    怎样才可以在Mac运行win的.exe程序?winebottler mac下载是一款可以让你在Mac上安装Windows软件的工具.有了wine mac 用户可以在Mac上安装IE浏览器.NotePa ...

最新文章

  1. java Windows7 下环境变量设置
  2. 修改所有列_宝塔面板安装完的一些列操作
  3. error MSB8008: 指定的平台工具集(v110)未安装或无效。请确保选择受支持的 PlatformToolset 值...
  4. 选取文档元素的API
  5. ModelAndView视图解析器小结
  6. Detectron2和MMDetection的学习笔记
  7. linux 火狐浏览器插件,Linux系统Firefox(火狐浏览器)插件挂机
  8. C# asp.net页面通过URL参数传值中文乱码问题解决办法
  9. asp.net2.0 GridView 导出到 Excel
  10. How to check number of Active connections in SQL server?
  11. picasa2中文版,picasa2中文,picasa2中文版下载,picasa2中文版本
  12. matlab 数据正态性检验
  13. 希尔贝壳受邀参会IEEE SLT 2021
  14. linux卸载飞行模式驱动,解决:Ubuntu飞行模式 使用硬件开关关闭
  15. 最喜欢的动画片《长江7号爱地球》
  16. 《拆掉思维里的墙》简评和部分摘录
  17. 618电商平台鏖战,天猫618才是绝对主场
  18. java-Stringbuffer
  19. 下载Intell IDea
  20. win7摄像头软件_5款用起来超爽的Windows高效软件

热门文章

  1. 花式读取Android CPU使用率
  2. WIN10待机睡眠不关USB电源、进不了睡眠S3、没有电源选项、节电模式、电脑漂,已解决
  3. scrapy+selenium爬取某招聘网站的职位、公司、面试评论
  4. linux程序打印cr3寄存器,CR0,CR3寄存器
  5. Python实现矩阵乘法
  6. Jmeter参数化(Txt文件格式)
  7. 基于java的社区志愿者服务系统——计算机毕业设计
  8. SQL Server 中的函数
  9. 微软要给我30万美元的额外奖励,被我拒了!
  10. asus官方android升级包,华硕ROG游戏手机3刷机包(官方最新固件升级包CN-17.0823)...