热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux兼容内核的三个重要源泉

文章标题:Linux兼容内核的三个重要源泉。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类

    我们要开发、构建的Linux兼容内核并非无源之水,也不需要从零开始“重新发明轮子”。正如牛顿所说要“站在巨人肩膀上”一样,我们也应该充分利用别人已经取得的成就、特别是开源社区已经取得的成就。
    除Linux本身以外,兼容内核主要的源泉有三个,那就是Wine、NdisWrapper、以及ReactOS。三者都是在Sourceforge立项的开源项目,源代码可从www.sourceforge.net下载。
    下面对三个源泉分别作一简单的介绍。

    Wine

    按Wine项目自己的说法,Wine是“Wine Is Not an Emulator”的缩写。这使人不免想起GNU的“Gnu is Not Unix”。许多人对此可能一笑了之,觉得这是文字游戏或者幽默。可是笔者却觉得这背后其实自有深意。GNU说它不是Unix,意思是说虽然它基本上就是Unix,或者非常像Unix,可是你不能按Unix的各种标准来要求它,有些地方它与真正的Unix是点差别的。这是一种“有言在先”式的声明。而Wine为什么说它不是仿真器呢?这反映了Wine的设计者生怕别人误以为Wine是个仿真器。这主要是因为“仿真器”这个词容易使人误解,以为是对CPU机器指令的仿真,那是效率非常低的。所以这实际上是在申辩,说Wine的效率不低。当然,Wine的效率比普通意义上的仿真确实要高得多。

    那么Wine到底是什么呢?

    ? 对于Windows应用软件而言,Wine为其提供对Windows运行环境的仿真,所以Wine也可以理解为“WIN Emulator”。这也正是Windows应用软件能够在Linux上运行的条件与原因。不过这种仿真并不是对CPU指令的仿真,而是对Win32 API函数调用的仿真。

    ?对于Linux及其内核而言,Wine是内核与Windows应用软件之间的一个中间层。它一方面为Windows应用软件提供各种动态连接库(DLL),使应用软件通过Win32 API进行的库函数调用得以落实,一方面将应用软件和动态连接库原本对Windows内核所作的系统调用翻译成对Linux内核的系统调用,把它们转嫁到Linux内核上来。

    ?对于许多作为Windows操作系统组成部分的动态连接库、服务/守护程序、工具程序而言,Wine是这些软件在Linux上的移植、实际上是仿制。在“关于Linux兼容内核的知识产权问题”一文的第二部分中,笔者把Windows上的软件分成五类,这些软件都属于第五类,即由微软开发,又理应属于操作系统、跟Windows相捆绑的那部分软件。

    Wine完全不触及Linux内核,所有的操作都是在内核外面进行。有些操作本来应该在内核中实现,但是因为不触及内核,就只好设法在内核外面、即用户空间中设法补偿。但是,在内核外面用Linux系统调用来实现Windows系统调用,就好像要用一种高级语言来实现另一种高级语言一样(比方说,用Cobol来实现Fortran),往往会导致相当笨拙的实现,有些甚至根本就实现不了。这是因为,Linux或者Windows的每一个特定的系统调用就好像高级语言的一种语句,我们固然可以把它看成是个黑盒子,但是要让两个这样的黑盒子在输入参数和条件,计算结果和副作用等等各方面都完全一样是很困难的。诚然,Linux的系统调用是很丰富、很灵活、“表现力”很强的,有点像是C语言,这给通过Linux系统调用实现Windows系统调用提供了一个良好的基础。但是,即便如此,也还存在不少的困难。下面我们通过一个例子加以说明。

    Windows系统在打开文件等等操作中返回一个Handle(翻译成“句柄”,笔者觉得不是很好,但又想不出更好的词),语义上这是用于一个指针数组的下标。每个进程都有这么一个数组,所以Handle原则上不是全局的、而是局限于具体进程的。也许读者马上就会联想到打开文件号,二者似乎完全相同,因而应该可以用Linux的打开文件号来实现Windows的Handle。不过Windows的Handle并不是只用于文件,而是用于所有各种“对象(Object)”,这且不说,这里要说的是个更大的麻烦。在创建子进程时,Windows内核允许有选择地“遗传”Handle。当然,Linux内核在创建子进程时也可以遗传打开文件号,这似乎又是一样的。可是麻烦来了。在Windows系统中,打开一个文件时就通过参数规定,这个打开了的文件以后是否可以遗传;在创建子进程时,则又通过参数规定,是否要遗传那些事先规定可以遗传的已打开文件、即Handle(见“Advanced Windows”,p17)。应该说,这是个不错的主意。而Linux呢?遗传的是1、2、3三个打开文件号。对内核有所了解的朋友不难想到,要在Linux内核中作一些扩充,以实现Windows的这种遗传机制,是不难的,甚至是很容易的。可是,如果要在内核外面实现呢?读者不妨动动脑筋。如果有很简洁的方法,不妨通知一下笔者,让笔者有个表达钦佩和祝贺的机会。

    至于设备驱动,既然不触及内核,自然就不可能解决设备驱动的问题。当然,对于Linux上已经有了相应设备驱动程序的那些外设(例如硬盘),可以把Windows应用程序对这些外设的操作“重定向”到相应的Linux设备上来。可是问题在于那些在Windows上有驱动模块(.sys文件),而Linux上还没有相应驱动模块的那些设备,对这些设备怎么办呢?

[1] [2] [3] [4] 下一页


推荐阅读
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 本文介绍了在Windows系统上使用C语言命令行参数启动程序并传递参数的方法,包括接收参数程序的代码和bat文件的编写方法,同时给出了程序运行的结果。 ... [详细]
  • 本文介绍了使用Python解析C语言结构体的方法,包括定义基本类型和结构体类型的字典,并提供了一个示例代码,展示了如何解析C语言结构体。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
author-avatar
燕过无痕GY_274
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有