没有合适的资源?快使用搜索试试~ 我知道了~
漫谈Wine之一:Wine的系统结构.pdf
需积分: 49 19 下载量 71 浏览量
2009-12-27
18:35:41
上传
评论
收藏 155KB PDF 举报
温馨提示
试读
11页
漫谈Wine之一:Wine的系统结构 漫谈Wine之一:Wine的系统结构
资源推荐
资源详情
资源评论
1
漫谈 Wine 之一:
WINE 的系统结构
毛德操
我们所要开发的 Linux 兼容内核主要的一个源泉就是 Wine。另一方面,我们之所以要
开发兼容内核的的重要原因之一,就是因为 Wine 不能很好地解决在 Linux 内核上运行
Windows 应用的问题。为此,我们应该对 Wine 进行比较深入的研究,取得对 Wine 的深入
理解,特别是要搞清两个问题:1)Wine 是什么样的?2)为什么 Wine 是那样的?如此才能
明白我们为什么要开发兼容内核,以及我们将怎样来开发兼容内核。当然,对 Wine 的研究
不应该孤立地进行,而必须把它放在 Linux 和 Windows 两个操作系统的背景下来开展。为
此目的,我将撰写一些漫谈 Wine 的文章,围绕着上述的两个问题作一些介绍和分析,以期
引起广泛的讨论和参与,然后再进入具体的开发阶段。这些文章将采用一事一议的方式,有
的以介绍为主,有的以分析为主;有的围绕预定的题材,有的针对网友们提出的问题。
1.概述
Wine 是 Windows 应用软件与 Linux 内核之间的适配层,体现为一个 Wine 服务进程
(wineserver)和一组动态连接库(相当于 Windows 的众多 DLL)。此外,Wine 的 GUI 用户界面
仍依赖于 X11,由动态连接库 x11drv 和 X11 服务进程构成。其中 x11drv 是作为 Wine 与 X11
之间的界面,而 X11 服务进程本来就存在,因为 GNOME 也要通过 X11 服务进程操作图形
界面。这样,在运行某个 Windows 应用时,系统中至少有 3 个进程与之有关:
z 应用进程本身。所有对 DLL 的调用均在该进程的上下文中运行。需要得到 Wine 的服
务,或者通过 Wine
间接提供的其他(特别是内核)服务时,应用进程经由 Wine 所提供的
各种动态连接库逐层往下调用。在 Wine 内部,这个进程往往需要通过 socket 和 pipe
与 Wine 服务进程通信,以接受服务进程的管理和协调;另一方面又可能经由另一个动
态连接库 x11drv 通过别的 socket 与 X11 服务进程通信,向其发送图形操作请求并接收
键盘和鼠标输入。
z Wine 服务进程。其主要的作用有:提供 Windows 进程间通信与同步的手段;Windows
进程和线程的管理,注册表服务,包括文件在内的各种 W32“对象”的管理;等等。
z X11 服务进程。图形的显示,以及键盘和鼠标输入。
这些进程以及动态连接库的关系如下图所示:
Linux 内核
WINE 动态连接库(集合)
wineserver
Windows 应用
Xserver
2
在这三个进程中,对桌面系统而言,Xserver 本来就存在,并非因为用了 Wine 才引入的,
所以我们先关注其余两个进程。但是,从整个桌面系统的性能与效率来看,特别是对于图形
/图像操作十分频繁的应用(如游戏)而言,Xserver 也是个瓶颈,所以我们将来还要回到这个
问题上来,不过那是后话。
实际上,具体的 Windows 应用进程是从另一个进程,即 Wine 的作业装入程序 wine 转
化过来的。用户一开始时启动的是 wine,而具体的 Windows 程序名是个参数,是由 wine
为具体目标程序的运行建立起与 Wine 服务进程的连接、装入目标程序,并转入目标程序运
行的。
只要没有特别说明,下面讲到的“服务进程”都是指 Wine 服务进程。
2.Wine 服务进程
服务进程 wineserver 的存在独立于具体的 Windows 应用,所有的 Windows 应用在启动
时都要建立起与服务进程的 socket 和 pipe 连接。所以,一般而言服务进程在启动具体
Windows 应用之前就应存在。不过,如果不存在,则作业装入程序 wine 会先启动服务进程
运行,再与之建立连接。
在某种意义上,可以认为服务进程是在为 Windows 应用程序提供“远地过程调用
(RPC)”、即跨进程的系统调用;其作用可以从它的过程调用表,即函数指针数组 req_handlers[ ]
看出个大概:
static const req_handler req_handlers[REQ_NB_REQUESTS] =
{
(req_handler)req_new_process,
(req_handler)req_new_thread,
(req_handler)req_terminate_process,
(req_handler)req_terminate_thread,
……
(req_handler)req_load_dll,
(req_handler)req_unload_dll,
……
(req_handler)req_create_event,
(req_handler)req_create_mutex,
(req_handler)req_create_semaphore,
……
(req_handler)req_create_file,
(req_handler)req_alloc_file_handle,
(req_handler)req_get_handle_fd,
(req_handler)req_flush_file,
(req_handler)req_lock_file,
(req_handler)req_unlock_file,
……
(req_handler)req_create_socket,
(req_handler)req_accept_socket,
(req_handler)req_set_socket_event,
(req_handler)req_get_socket_event,
3
(req_handler)req_enable_socket_event,
(req_handler)req_set_socket_deferred,
……
(req_handler)req_open_console,
(req_handler)req_read_console_input,
(req_handler)req_write_console_output,
……
(req_handler)req_output_debug_string,
(req_handler)req_continue_debug_event,
(req_handler)req_debug_process,
(req_handler)req_debug_break,
……
(req_handler)req_set_key_value,
(req_handler)req_get_key_value,
(req_handler)req_load_registry,
……
(req_handler)req_create_timer,
(req_handler)req_open_timer,
(req_handler)req_set_timer,
(req_handler)req_cancel_timer,
……
(req_handler)req_get_msg_queue,
(req_handler)req_send_message,
(req_handler)req_get_message,
……
(req_handler)req_create_window,
(req_handler)req_link_window,
(req_handler)req_destroy_window,
(req_handler)req_set_foreground_window,
(req_handler)req_set_focus_window,
(req_handler)req_set_global_windows,
…… 共有将近 200 个函数
};
可见,服务进程参与了对进程/线程、进程间通信/同步(互斥)、文件、窗口、定时器、
控制台、注册表等等资源的管理与服务。
服务进程对于进程、进程间通信等等的管理(与服务)与 Linux 内核所提供的管理并不冲
突,而是对内核的补充。这是因为 Linux 内核所提供的是对于 Linux 进程/线程的管理,而
Windows 应用所期待的是对于 Windows 进程/线程的管理。服务进程之所以需要存在,其原
因之一,就是为了要在(由 Linux 内核所所提供的)Linux 进程管理的基础上建立起对于
Windows 进程/线程的管理。所以,服务进程只提供其中附加的部分,例如进程/线程的调度
就是由 Linux 内核提供的,而与服务进程无关。服务进程本身也是一个 Linux 进程,但不是
Windows 进程。同样,对别的资源的管理也有类似的问题。
如果用一句话来概括服务进程存在的理由,那就是“核内差异核外补”
。所谓“核内差
剩余10页未读,继续阅读
资源评论
风声边界
- 粉丝: 193
- 资源: 59
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- unity读取excel工具 使用3.5即可
- Matplotlib 是一个 Python 的绘图库 Matplotlib 绘图指南与功能介绍.docx
- 基于TMS320F2808设计光伏并网发电模拟器AD09设计硬件(原理图 PCB)+CCS软件源码 +说明文档.zip
- 在微电网中采用粒子群算法在matlab环境下进行了仿真,最后给出了微网各微源的最优机组组合方式和最佳电能交易计划 (注释完全,可
- 在matlab中通过yalmip平台调用cplex求解器,可用于求解MILP问题,适合于综合能源系统优化求解(注释完全,可直接运
- MT8852B labview 驱动,MT8852B labview 代码,蓝牙测试仪MT8852B代码,蓝牙低功耗测试
- 导照片2.0(只适合索尼微单)
- KMP算法python代码实现与使用场景.docx
- 基于MATLABCPLEX 的机组最优组合,成功求解表格化,图示化的机组组合结果(注释完全,可直接运行)(文档加Matlab源码
- postgresql-9.5.3-1-windows-x64
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功