Chinaunix

标题: 最近在写一个东西:在windows上跑原生linux程序 [打印本页]

作者: gussing    时间: 2011-09-03 14:07
标题: 最近在写一个东西:在windows上跑原生linux程序
不是cygwin,cygwin的做法是把程序源代码编译称PE格式
也不是coLinux,coLinux是类似win7上的“xp模式“这样东西,还是有虚拟的
我做的这个是跑的原生的程序
基本上就是把写一个驱动,把int 80中断打通
在中断处理函数里把栈上保存的返回地址改成用户态的一个handler函数,然后iretd后
就会转到这个函数里执行
把各种参数包装包装后,再转入cygwin1.dll,就能正常工作了
这是第一阶段做的事情,长期打算是把cygwin1.dll里的内容都搬到内核里去,做完后
就用不着cygwin帮忙里
目前已经能运行bash,gcc也可以工作,不过脚本还跑不起来。等脚本能跑后,就可以照
着LFS等文档建一个“特殊”等发行版出来
这事跟毛先生的兼容内核有些类似,不过是正好反过来的
不知道各位有没有兴趣一起来玩
作者: 鸡丝拌面    时间: 2011-09-03 15:50
sysenter支持吗?
作者: AD8018    时间: 2011-09-03 16:13
本帖最后由 AD8018 于 2011-09-03 16:14 编辑

colinux, andlinux, 不是早就有人搞了吗?
作者: gussing    时间: 2011-09-03 16:26
colinux, andlinux, 不是早就有人搞了吗?
AD8018 发表于 2011-09-03 16:13



    原贴第二句话
作者: 鸡丝拌面    时间: 2011-09-03 17:14
不是cygwin,cygwin的做法是把程序源代码编译称PE格式
也不是coLinux,coLinux是类似win7上的“xp模式“这 ...
gussing 发表于 2011-09-03 14:07



    cyg是编成pe,你这个是怎么搞?像ndiswrapper一样先弄个process再load elf?
作者: gussing    时间: 2011-09-04 00:45
cyg是编成pe,你这个是怎么搞?像ndiswrapper一样先弄个process再load elf?
鸡丝拌面 发表于 2011-09-03 17:14



    没错,核心组件两个:内核态的int 80响应,用户态的elf loader
作者: nketc    时间: 2011-09-04 01:12
和wine反过来?毛的龙井兼容内核反过来?
作者: Missex    时间: 2011-09-04 08:07
不错, 看好楼主的这个东西
作者: gussing    时间: 2011-09-04 11:17
代码我放在http://code.google.com/p/line-is-not-emulator/
另外我的博客上有详细介绍http://www.cnblogs.com/gussing/
作者: mirnshi    时间: 2011-09-04 16:33
这个很有意思。
作者: 鸡丝拌面    时间: 2011-09-04 16:38
lz你的InterruptHandler函数(int80.c)在哪里定义?
handle.asm的_syscallHandlerPtr有赋初值吗?
还有int80.c里的这一段

  1. //判断我们想要添加的中断是否已被占用;
  2.         if(IdtEntry[0x80].OffsetLow  != 0
  3.                 || IdtEntry[0x80].OffsetHigh != 0)
  4.         {
  5.                 //IdtEntry[0x80].DPL = 3;
  6.         }
  7.         else
  8.         {
  9.                 InterlockedIncrement(&gFinishedDPC);
  10.                 return;
  11.         }
复制代码
貌似是错的——为空才是不占用,这里为空就退出了。
作者: gussing    时间: 2011-09-04 18:55
lz你的InterruptHandler函数(int80.c)在哪里定义?
handle.asm的_syscallHandlerPtr有赋初值吗?
还有i ...
鸡丝拌面 发表于 2011-09-04 16:38


在汇编文件里,line进程启动的第一件事就是把_syscallHandlerPtr赋值
还有这个项,肯定是不为空的,微软塞了一个UnhandleXXX80在里面,所以实际上这段代码是废代码,我没整理好
作者: 鸡丝拌面    时间: 2011-09-05 14:36
回复 12# gussing


    第一点你说得对,我也是这个意思,管他之前是啥,保存然后恢复就可以了,后面的module不该为之前可能的错误埋单。
    第二点关于syscallHandlerPtr的赋值问题,我看了半天终于明白了,在lineexec里调用ASM_DISPATCH_SYSCALL弄个int 0x80把handler写在ebx里传给isr。这个也算是插件法了 ,只不过为啥要用gas呢?一边masm一边at&t,难道又是多个project的拼凑?
作者: 群雄逐兔    时间: 2011-09-05 14:46
都是高手啊
作者: txdgtwpv    时间: 2011-09-05 15:06
太高端了,马克表示关注
作者: unistd    时间: 2011-09-05 16:18
本帖最后由 unistd 于 2011-09-05 16:26 编辑

虽然楼主这个东西我弄不出来,但是不看好商业前景,但是可以作为一个研究项目吧、
没有人因为需要使用Linux程序而在Windows上跑Linux程序,因为直接就用Linux就行。

我想做的实际上是一个新的类似操作系统的语言开发平台。
就像Java,java不仅仅是一个平台,还可以认为它是一个操作系统、开发平台。
我希望这个语言能够和C一样处于中底层,代码效率甚至比C语言还要高,而且要抛弃头文件这样过时的东西,引入java/clr等元数据的概念,只需要引入共享库就可以在代码中使用共享库中的调用。
另外这个语言平台即提供了C标准库,POSIX一样的底层、系统库,还要提供网络、多媒体等现代应用比较多的应用层库。
使用这个语言平台,既可以开发新操作系统,数据库、驱动程序,又可以开发聊天软件、网站、播放器等。
而且必须保持足够的简洁。其实最近发现Go语言就有点类似。。。
作者: noword2k    时间: 2011-09-05 16:46
LZ牛人啊。

不过用中文注释,不利于以后的协同开发啊。
作者: gussing    时间: 2011-09-06 00:11
虽然楼主这个东西我弄不出来,但是不看好商业前景,但是可以作为一个研究项目吧、
没有人因为需要使用Linu ...
unistd 发表于 2011-09-05 16:18



    商业前景的话,确实完全没有 ,我做这个也纯粹是好玩,当时看毛德操他们组做的兼容内核,我就说反着来应该也可以,所以就开始做了

你说的这个语言平台,确实可以往这方面想想。事实上我的这个东西可以做到让windows程序调linux库,做全了后有点点虚拟机的样子。java/.net是用中间码实现平台无关,我这个直接用int 80实现平台无关,想一想如果linux上写了一个程序,直接拿到windows上就能跑(或者反过来也行),还是原生的,那世界得多美好
作者: gussing    时间: 2011-09-06 00:12
LZ牛人啊。

不过用中文注释,不利于以后的协同开发啊。
noword2k 发表于 2011-09-05 16:46



    少数几处是,改天我全去了
作者: gussing    时间: 2011-09-06 00:13
本帖最后由 gussing 于 2011-09-06 00:22 编辑
回复  gussing


    第一点你说得对,我也是这个意思,管他之前是啥,保存然后恢复就可以了,后面的mo ...
鸡丝拌面 发表于 2011-09-05 14:36



    因为我不知道如何用cygwin编译windows驱动。。。
另外,确实是拼凑的,我坦白承认。其中有cygwin的代码,有linux内核里扣出来的,还有glibc里扣出来的,还有一些死了很久的小开源项目。我认为这就是开源精髓,重新造轮子这事做起来虽然爽,但意义不大,能利用前人积累为何不用?所以承认这事不仅不会让我难堪,事实上,我还有点自豪来着。
作者: oooooxxxxx    时间: 2011-09-06 03:37
商业前景的话,确实完全没有 ,我做这个也纯粹是好玩,当时看毛德操他们组做的兼容内核, ...
gussing 发表于 2011-09-06 00:11



    在Windows上弄Linux兼容要比在Linux上弄Windows兼容容易一些吧,Linux都是开源的,不需要逆向工程。不过怎么区分正常的Windows程序与模拟的Linux程序呢?在int80处理的时候是必须的吧?
作者: gussing    时间: 2011-09-06 10:30
在Windows上弄Linux兼容要比在Linux上弄Windows兼容容易一些吧,Linux都是开源的,不需要逆向工程 ...
oooooxxxxx 发表于 2011-09-06 03:37



    事实上他们是有参考的,主要是Wine和Reactos两个项目,所以难度没相信中那么大
作者: 鸡丝拌面    时间: 2011-09-06 14:26
在Windows上弄Linux兼容要比在Linux上弄Windows兼容容易一些吧,Linux都是开源的,不需要逆向工程 ...
oooooxxxxx 发表于 2011-09-06 03:37



    目前的int80实现很简单,也没有区分,因为win下木有用到int80
作者: gussing    时间: 2011-09-06 14:35
本帖最后由 gussing 于 2011-09-06 14:36 编辑
目前的int80实现很简单,也没有区分,因为win下木有用到int80
鸡丝拌面 发表于 2011-09-06 14:26



    re, sysenter或int 2E
sysenter是没可能占用了,int 2E也没人想动它。。。
不过进入下一阶段的话,int 80就没那么简单了,fs里的那一堆东西都得设置,不设置没法调nt的系统服务历程。这事也快做完了,还剩一点点。
作者: captivated    时间: 2011-09-06 15:00
啊, mark一个。
作者: wsgtrsys    时间: 2011-09-06 17:29
这个要支持
作者: 蜡笔小新他爸    时间: 2011-09-06 23:19
我,站内PM
作者: 李大双    时间: 2011-09-08 12:39
不明白,只能帮顶了
作者: gussing    时间: 2011-09-08 12:47
在内核里写系统调用的路已经打通了,除了NPTL,剩下的就是体力活了
作者: 鸡丝拌面    时间: 2011-09-08 15:13
在内核里写系统调用的路已经打通了,除了NPTL,剩下的就是体力活了
gussing 发表于 2011-09-08 12:47



    对cgywin没研究,原来是直接传给cygwin1.dll?现在怎么搞?直接把linux的syscall map到native api?
作者: armips    时间: 2011-09-08 17:39
这个不错,mark
作者: gussing    时间: 2011-09-09 10:32
对cgywin没研究,原来是直接传给cygwin1.dll?现在怎么搞?直接把linux的syscall map到native ap ...
鸡丝拌面 发表于 2011-09-08 15:13



    原来是把系统调用转回用户态,现在是直接在内核态实现系统调用,看这贴
http://www.cnblogs.com/gussing/archive/2009/10/30/1593187.html
作者: 鸡丝拌面    时间: 2011-09-09 14:44
原来是把系统调用转回用户态,现在是直接在内核态实现系统调用,看这贴
gussing 发表于 2011-09-09 10:32



    我x,我就在你blog上找着新实现的说明,没想到一竿子支到09年 ,你打算分析cgywin1.dll的实现而后在kernel里作相应处理咯?这个可不只是体力活,你太自谦了
作者: gussing    时间: 2011-09-09 14:57
我x,我就在你blog上找着新实现的说明,没想到一竿子支到09年 ,你打算分析cgywin1.dll ...
鸡丝拌面 发表于 2011-09-09 14:44


有架子后,剩下什么都是体力活
作者: 鸡丝拌面    时间: 2011-09-09 15:09
有架子后,剩下什么都是体力活
gussing 发表于 2011-09-09 14:57



   
作者: gussing    时间: 2011-10-03 22:32
修改了putty当console,总算不用管cmd.exe那一坨了
但是颜色还是不能显示,修改窗口大小后不能即时变
另外发现line的bug无数,比如管道支持的很不好,导致./configure和make状况无数
总之短时间是没法弄好了。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2