在大约一年前提到过,我想做这样一件事:打通windows上的int 80中断,让原生的linux程序也可以在windows上跑。中间因为公司项目紧,再加上idt的一个小问题困惑了我很久,所以搁置了一段时间。最近觉得周末实在闲的慌又把这项目捡起来了,并且在某次抽烟的时候突然想到“每个处理器都有自己的idt表”这一小常识,idt的问题也就很顺利的解决了。接下来的事情就变得很顺了,按照原定计划先把所有的系统调用转到用户态然后从cygwin1.dll里再过一遍,大约熬了两天夜,一个小小的demo就完成了。

代码参考了很多的开源项目,比如cygwin, glibc, linux kernel, 还有一个死了很久的项目 LINE。这事说起来也好玩,我最初想做这个项目的时候,压根没到sourceforge上去找过,包括实现原理,项目名称等都是自己想出来的。结果做了一半到sourceforge上一搜,居然有个一摸一样想法的东西早在2001年就存在了,连名字都想的一样。然后再到google上一搜,无数人都想到过类似的方案了,而且名字无一例外的打算叫成“LINE”。不得不说在开源的世界里想真正的创点新还真是困难。所幸sourceforge上的这个项目老的不成样了,是2001年的,看代码只能在win98上跑,而且是半成品,连编译都通不过,所以我做的这些事情也不是完全没价值。

不过看我这个项目仍然继承了sourceforge上这个LINE的很多东西,比如把系统调用反射回用户态这事,我原来的打算是插一个APC反射回去,看了下他们的做法,是直接把调用栈上保存的返回地址改成了用户态的一个SyscallHandler,有点类似缓冲区溢出注入的技术,这个方法毫无疑问的更合理更优雅。再比如,绝大多数的系统调用转回到用户态后只是简单的把参数包一包就转cygwin上去了,这部分代码属于纯体力劳动,我就很不客气的也照抄过来了。总之,之前我把这个项目定性为我的“创新”,现在我把它定性为LINE项目的后续开发,虽然少了重新发明轮子的快感,不过坦白我也已经过了追求这种快感的年龄了。

在开发过程中碰到的主要问题有三个:idt的问题,某些较新的linux系统调用没法实现的问题,以及路径问题。我之前设置int 80中断的时候,都是在一个IOCTL里直接就调sidt指令,以为这么做就能改掉系统idt表,实际上由于每个处理器有自己的idt表,这么干只能改IOCTL发起者所在处理器上的idt表,到了运行调试的时候一个int 80中断的发起者到底是不是在该处理器上根本没法保证,所以有很长一段时间里我就处于这么一个状况:设置好idt后一调试,好的;再调试,异常了。搞的我很莫名其妙。后来我在IOCTL处理函数里往每个处理器都插一个DPC,然后在DPC里改idt,这种时好时坏的情况就再也没发生了。

等到用户态的响应函数写的差不多,简单的linux程序比如hello world等都能跑了后,我就开始从原生linux上抓真正的程序过来试。结果一跑问题就来了:linux 2.5.29 及以后的版本新增了几个系统调用set_thread_area, get_thread_area 等等,是为了对NPTL做支持,这几个函数没办法在windows上模拟出来(至少我现在没想到办法),所以我就留空了,直接返回-ENOSYS (事实上190号以后的系统调用我全留空了)。但是现在的glibc还非用它不可,set_thread_area返回-ENOSYS后,glibc就直接打印error退出了。没办法,我只好在虚拟机上装了个redhat 6.0, 然后把那上面的程序和类库考出来用。RH 6.0 那可是史前时代的东西了,不会用到那么高级的东西,应该能跑。

最后还剩一个问题:windows的路径和*nix的路径表示完全不一致,比如linux上的程序想打开/lib/libc.so.6这个文件,在windows上根本就找不到。解决这个问题的方法倒是简单粗暴:我在open等文件操作的系统调用里做了一个小改动,凡是以‘/’打头的路径名,我就把第一个’/’去掉让他变成相对路径,然后再用windows的open函数就能顺利的打开了。直到目前为止这个小技巧还是奏效的,从RH 6.0上拷过来的基本命令都能跑,有图为证:

当然,这东西现在还只是demo而已,问题还不少。比如跑bash还是有点小问题:bash能启动,但是在bash里打ls命令又是文件未找到。再比如只能在32位机器上跑,再比如很不稳定等。总之,后续还有很多工作要做。

源代码目前还没脸放出来,等整理完后会放到google code上,沿用GPL v2。

转载于:https://www.cnblogs.com/gussing/archive/2011/08/25/2153412.html

LINE: 在windows上运行原生linux程序 (2) : demo完成相关推荐

  1. BML CodeLab重磅更新:在Windows上可原生Linux AI开发

    自从微软发布 WSL2(Windows Subsystem for Linux 2)之后,机器学习开发者.数据科学家就可以在 Windows 上做原生 Linux 开发了. 但想正常的使用,其实并不简 ...

  2. Windows上的原生Linux容器(盆盆的Kubecon课程分享)

    您测试过Windows上的Linux容器吗? 这是本周末刚闭幕的Kubecon大会,笔者在课堂上提出的问题. 关于这个问题,大家常有的困惑就是,我们为什么要在Windows上运行Linux容器?您可以 ...

  3. docker 运行windows程序_如何从Windows上运行任何Linux图形GUI程序?

    Win10上的wsl模式虽然解决了运行linux程序的痛点,然而所运行的程序依然受困于Terminal中.比如emacs: 终端版本的emacs 试图获得赏心悦目的视觉效果,比如优美的字体和图形,必须 ...

  4. linux 正在运行的程序不能拷贝_如何实现在Windows上运行Linux程序,附示例代码

    初步了解ELF格式 首先让我们先了解什么是原生Linux程序, 以下说明摘自维基百科 In computing, the Executable and Linkable Format (ELF, fo ...

  5. 如何实现在Windows上运行Linux程序,附示例代码

    如何实现在Windows上运行Linux程序,附示例代码 微软在去年发布了Bash On Windows, 这项技术允许在Windows上运行Linux程序, 我相信已经有很多文章解释过Bash On ...

  6. 了解如何执行在Linux上运行的应用程序

    先决条件 为了从本文中获得最大收益,您应该具有在Windows环境中使用桌面应用程序的经验. 我假设读者对如何使用Linux桌面有基本的了解. 拥有一台运行正常的Linux计算机来探索本文中的概念和示 ...

  7. 双用户windows linux系统,Windows与Linux合二为一?终于能在windows上运行Linux了!

    原标题:Windows与Linux合二为一?终于能在windows上运行Linux了! 目前在PC端操作系统市场份额中,微软旗下的windows系统占据超过50%的比例. 作为微软旗下发布的产品之一, ...

  8. 运行linux中degui_Windows与Linux合二为一?终于能在windows上运行Linux了!

    目前在PC端操作系统市场份额中,微软旗下的windows系统占据超过50%的比例. 作为微软旗下发布的产品之一,windows系统深受用户喜爱.从经典的XP和win7,因其操作简单,运行流畅吸粉无数, ...

  9. 电脑显示没有被指定在上运行_win10系统运行程序提示“dll没有被指定在windows上运行”的办法...

    有关win10系统运行程序提示"dll没有被指定在windows上运行"的操作方法想必大家有所耳闻.但是能够对win10系统运行程序提示"dll没有被指定在windows ...

  10. linux运行容器,容器与云|如何在 Windows 上运行 Linux 容器

    1.概述 现在能够在 Windows 10 和 Windows 服务器上运行 Docker 容器了,它是以 Ubuntu 作为宿主基础的. 想象一下,使用你喜欢的 Linux 发行版--比如 Ubun ...

最新文章

  1. java对于app版本号比较,Java对比APP版本号大小
  2. Android发送邮件
  3. linux posix 线程池_linux多线程--POSIX Threads Programming
  4. 多台电脑共享一套鼠标键盘的免费方法
  5. JavaScript 数字前补“0”的五种方法
  6. Activiti中的log4j(slf4j)的配置
  7. Unity3D 之武器系统冷却功能的实现方式
  8. 常用网络测试的命令的实验报告计算机网络,实验二网络常用测试命令实验报告.docx...
  9. unity 更换standard shader
  10. myeclipse部署多个应用到不同的weblogic domain中
  11. matlibplot之条形图
  12. 大数据-玩转数据-Python几种数据采集
  13. springboot中 @Imput与@EnableConfigurationProperties区别
  14. 写博客文档的神器:Typora 、Mathpix Snipping Tool
  15. 论文阅读--利用完全卷积和空间变换网络从部分二维观测中产生三维超声
  16. 万字长文!深度剖析《数据安全法》下多方数据协同应用和隐私计算发展趋势
  17. MongoDB多层嵌套查询
  18. 您的账户已被停用,请向系统管理员咨询 解决方案(亲测有效)
  19. hisi3559平台PCIE转USB调试
  20. 天顺智慧能源,思科,平安科技面试经历分享吧

热门文章

  1. 单片机重要组成部分还有什么,引脚封装分布知识讲解(二)
  2. 使用adb命令结束android中的进程,两种方法 kill -9 和 am force-stop的相同与区别
  3. Hibernate的双向N-N关联(六)
  4. [渝粤教育] 天水师范学院 离散数学 参考 资料
  5. 【渝粤教育】国家开放大学2018年春季 0242-22T机械制图 参考试题
  6. 【渝粤教育】国家开放大学2018年秋季 0269-21T文学概论 参考试题
  7. 数据预处理第4讲:缺失值填补
  8. Jmeter逻辑控制器操作,附栗子
  9. PCB SQL SERVER 枚举分割函数(枚举值分解函数)
  10. Matplotlib 基本用法