LINE: 在windows上运行原生linux程序 (2) : demo完成
在大约一年前提到过,我想做这样一件事:打通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完成相关推荐
- BML CodeLab重磅更新:在Windows上可原生Linux AI开发
自从微软发布 WSL2(Windows Subsystem for Linux 2)之后,机器学习开发者.数据科学家就可以在 Windows 上做原生 Linux 开发了. 但想正常的使用,其实并不简 ...
- Windows上的原生Linux容器(盆盆的Kubecon课程分享)
您测试过Windows上的Linux容器吗? 这是本周末刚闭幕的Kubecon大会,笔者在课堂上提出的问题. 关于这个问题,大家常有的困惑就是,我们为什么要在Windows上运行Linux容器?您可以 ...
- docker 运行windows程序_如何从Windows上运行任何Linux图形GUI程序?
Win10上的wsl模式虽然解决了运行linux程序的痛点,然而所运行的程序依然受困于Terminal中.比如emacs: 终端版本的emacs 试图获得赏心悦目的视觉效果,比如优美的字体和图形,必须 ...
- linux 正在运行的程序不能拷贝_如何实现在Windows上运行Linux程序,附示例代码
初步了解ELF格式 首先让我们先了解什么是原生Linux程序, 以下说明摘自维基百科 In computing, the Executable and Linkable Format (ELF, fo ...
- 如何实现在Windows上运行Linux程序,附示例代码
如何实现在Windows上运行Linux程序,附示例代码 微软在去年发布了Bash On Windows, 这项技术允许在Windows上运行Linux程序, 我相信已经有很多文章解释过Bash On ...
- 了解如何执行在Linux上运行的应用程序
先决条件 为了从本文中获得最大收益,您应该具有在Windows环境中使用桌面应用程序的经验. 我假设读者对如何使用Linux桌面有基本的了解. 拥有一台运行正常的Linux计算机来探索本文中的概念和示 ...
- 双用户windows linux系统,Windows与Linux合二为一?终于能在windows上运行Linux了!
原标题:Windows与Linux合二为一?终于能在windows上运行Linux了! 目前在PC端操作系统市场份额中,微软旗下的windows系统占据超过50%的比例. 作为微软旗下发布的产品之一, ...
- 运行linux中degui_Windows与Linux合二为一?终于能在windows上运行Linux了!
目前在PC端操作系统市场份额中,微软旗下的windows系统占据超过50%的比例. 作为微软旗下发布的产品之一,windows系统深受用户喜爱.从经典的XP和win7,因其操作简单,运行流畅吸粉无数, ...
- 电脑显示没有被指定在上运行_win10系统运行程序提示“dll没有被指定在windows上运行”的办法...
有关win10系统运行程序提示"dll没有被指定在windows上运行"的操作方法想必大家有所耳闻.但是能够对win10系统运行程序提示"dll没有被指定在windows ...
- linux运行容器,容器与云|如何在 Windows 上运行 Linux 容器
1.概述 现在能够在 Windows 10 和 Windows 服务器上运行 Docker 容器了,它是以 Ubuntu 作为宿主基础的. 想象一下,使用你喜欢的 Linux 发行版--比如 Ubun ...
最新文章
- java对于app版本号比较,Java对比APP版本号大小
- Android发送邮件
- linux posix 线程池_linux多线程--POSIX Threads Programming
- 多台电脑共享一套鼠标键盘的免费方法
- JavaScript 数字前补“0”的五种方法
- Activiti中的log4j(slf4j)的配置
- Unity3D 之武器系统冷却功能的实现方式
- 常用网络测试的命令的实验报告计算机网络,实验二网络常用测试命令实验报告.docx...
- unity 更换standard shader
- myeclipse部署多个应用到不同的weblogic domain中
- matlibplot之条形图
- 大数据-玩转数据-Python几种数据采集
- springboot中 @Imput与@EnableConfigurationProperties区别
- 写博客文档的神器:Typora 、Mathpix Snipping Tool
- 论文阅读--利用完全卷积和空间变换网络从部分二维观测中产生三维超声
- 万字长文!深度剖析《数据安全法》下多方数据协同应用和隐私计算发展趋势
- MongoDB多层嵌套查询
- 您的账户已被停用,请向系统管理员咨询 解决方案(亲测有效)
- hisi3559平台PCIE转USB调试
- 天顺智慧能源,思科,平安科技面试经历分享吧
热门文章
- 单片机重要组成部分还有什么,引脚封装分布知识讲解(二)
- 使用adb命令结束android中的进程,两种方法 kill -9 和 am force-stop的相同与区别
- Hibernate的双向N-N关联(六)
- [渝粤教育] 天水师范学院 离散数学 参考 资料
- 【渝粤教育】国家开放大学2018年春季 0242-22T机械制图 参考试题
- 【渝粤教育】国家开放大学2018年秋季 0269-21T文学概论 参考试题
- 数据预处理第4讲:缺失值填补
- Jmeter逻辑控制器操作,附栗子
- PCB SQL SERVER 枚举分割函数(枚举值分解函数)
- Matplotlib 基本用法