fd = open("/dev/qemu_pipe", O_RDWR);
const char* pipeName = “”;
ret = write(fd, pipeName, strlen(pipeName)+1);
if (ret < 0) {
//error
}
… ready to go
这里的pipeName是要使用的服务名程,这里支持的服务有
- tcp:
提供一个非内部模拟器的NAT router,我们只能使用这个socket进行读写,接受,不能够进行连接非本地socket。
- unix:
打开一个Unix域socket在主机上
- opengles
连接到OpenGL ES模拟进程,现在这个实现等于连接tcp:22468,但是未来可能会改变。
- qemud
连接到qemud服务在模拟器内,这个取代了老版本中通过/dev/ttys1的连接方式.
在内核中代码,向外提供了一个对于qemu_pipe,其中包含了我们如何与其进行交互。
由于QEMU Pipe发送数据的时候使用的是裸包,其速度要比TCP的方式快很多。
通信协议的实现
对于指令的传输,要对指令进行编解码。emugen,通过这个工具可以进行编码解码类的生成。在GLES1.1,GLES2.0,EGL之中定义了一些代码生成时,需要用到的文件。用来定义生成代码的文是.types,.in,.attrib。对于EGL的声明则是在renderControl。对于EGL的文件都是以‘renderControl’开头的,这个主要是历史原因,他们调用了gralloc系统的模块来管理图形缓冲区在比EGL更低的级别。
EGL/GLES函数调用被通过一些规范文件进行描述,这些文件描述了类型,函数签名和它们的一些属性。系统的encoder静态库就是通过这些生成的文件来构建的,它们包含了可以将EGL/GLES命令转化为简单的byte信息的通过IOStream进行发送。
模拟器的绘制
模拟器接收渲染指令的位置,
在android/opengles.cpp控制了动态的装载渲染库,和正确的初始化