QNX操作系统是一个类Unix实时操作系统,遵从POSIX规范,驱动程序具有良好的可移植性。
编写任何驱动程序都会遇到同样的一个问题:应用程序与驱动程序之间是如何进行交互的。其实这个问题很简单,QNX有大量资料说明这一点。
当客户端调用fd = open(“dev/mydevice”,O_RDWR)打开设备mydevice,并期望从设定的地址上读写数据时,这个问题就产生了。实际上QNX提供了一套灵活的消息交互机制,大致上可以分为以下三个步骤:
第一,加载驱动程序,创建服务线程,把底层IO函数与POSIX函数进行连接,在命名空间注册设备名,通过Event loop或Thread
pool等待消息的接收,同时使父进程在后台运行以加载其他应用程序。
第二,当应用程序调用open()函数时,process manger受到请求在命名空间中找到名为dev/mydevice的resource
manger,QNX内核库打开它,应用程序通过返回的句柄与之建立连接。
第三,随后当调用read (fd, buf, 512)函数时,内核库发送了一个_IO_READ的消息,此时之前建立的Event loop或Thread
pool就可以接收到这个消息,通过判断消息的类型调用到相应的IO函数,比如:
int io_read (resmgr_context_t *ctp, io_read_t *msgRESMGR_OCB_T*ocb);
其实可以看出来了,fd, buf, 512这几个参数主要就是通过io_read_t *msg这个参数传过来的。其实client主要指定了一个设备