QNX 网络架构

QNX 网络架构

  与QNX中微子RTOS中的其他服务进程一样,网络服务在内核之外执行。无论涉及的网络的配置和数量如何,开发人员都会看到一个统一的接口。这个体系结构允许:

  1. 要动态地启动和停止网络驱动程序
  2. Qnet和其他协议可以在任何组合中一起运行
      我们的本机网络子系统由网络管理器可执行文件(io-pkt-v4、io-pkt-v4-hc或io-pkt-v6-hc)以及一个或多个共享库模块组成。这些模块可以包括协议(例如lsm-qnet.so)和驱动程序(例如devnp-speedo.so)。

Network manager (io-pkt*)

  io-pkt组件是网络子系统中的活动可执行文件。作为一种包重定向器/多路复用器,io-pkt负责根据其命令行上给出的配置加载协议和驱动程序模块(或在启动后通过mount命令加载)。
  使用零拷贝架构,io-pkt可执行文件有效地动态加载多个网络协议或驱动程序(例如,lsm-qnet.so)——这些模块是安装到io-pkt中的共享对象。
  io-pkt栈在架构上与操作系统中的其他组件子系统非常相似。在底层,是提供向硬件传递数据和从硬件接收数据的机制的驱动程序。驱动程序连接到一个多线程的第二层组件(该组件还提供快速转发和桥接功能),该组件将它们连接在一起,并提供一个统一的接口,用于将数据包定向到堆栈的协议处理组件。这包括,例如,处理单个IP和上层协议,如TCP和UDP。
  在QNX中微子中,资源管理器在堆栈的顶部形成一个层。资源管理器充当堆栈和用户应用程序之间的消息传递中介。它提供了一种标准化的接口,包括open()、read()、write()和ioctl(),这些接口使用消息流与网络应用程序通信。由用户编写的网络应用程序链接到套接字库。套接字库将堆栈公开的消息传递接口转换为标准的bsd样式的套接字层API,这是当今大多数网络代码的标准。
QNX 网络架构_第1张图片

  在驱动程序层,有用于以太网通信的接口(所有以太网驱动程序都使用),以及用于来自无线驱动程序的802.11管理帧的堆栈接口。堆栈的hc变体还包括一个单独的硬件加密API,该API允许堆栈在加密或解密安全链接的数据时使用加密卸载引擎。可以使用。将驱动程序(构建为动态链接的dll,并以devnp作为前缀—用于新类型驱动程序,devn用于旧驱动程序)加载到堆栈中,使用io-pkt 的-d选项。
  在以太网或IP层提供连接到数据流的api允许协议在堆栈进程中共存。协议(如Qnet)也构建为dll。协议直接链接到IP层或以太网层,并在堆栈上下文中运行。它们以lsm(可加载的共享模块)为前缀,您可以使用-p选项将它们加载到堆栈中。tcpip协议(-ptcpip)是一个堆栈可以识别的特殊选项,但是它不链接(因为已经内置了IP堆栈)。您仍然使用-ptcpip选项将附加参数传递给应用于IP协议层的堆栈(例如,-ptcpip前缀=/alt使IP堆栈注册/alt/dev/socket作为其资源管理器的名称)。
  需要来自位于堆栈进程外部的应用程序的交互的协议可能包括它自己的资源管理器基础结构(这就是Qnet所做的),以允许通信和配置发生。
  除了驱动程序和协议,堆栈还包括用于包过滤的挂钩。支持过滤的主要接口有:

  • Berkeley Packet Filter (BPF) interface
      一个套接字级别的接口,它允许您读写包,但不允许修改或阻塞包,并且您可以通过在应用层使用套接字接口进行访问(参见http://en.wikipedia.org/wiki/Berkeley_Packet_Filter)。这是基本的原始数据包拦截和传输选择的接口,并为堆栈进程域之外的应用程序提供对原始数据流的访问。
  • Packet Filter (PF) interface
      一个读/写/修改/阻塞接口,它完全控制那些被上层接收或从上层传输的包,并且与io-net过滤器API关系更密切。

线程模型

  默认的操作模式是io-pkt为每个CPU核创建一个线程。
  io-pkt堆栈在第2层是完全多线程的。但是,只有一个线程可以获得的“堆栈上下文”去处理上层包。如果多个中断源需要同时进行服务,则可以通过多个线程进行服务。在任何时候,只有一个线程将服务于一个特定的中断源。通常,网络设备上的中断表示有要接收的数据包。负责处理接收的同一个线程可能稍后将接收到的包发送到另一个接口。例如,第2层桥接和IP包的“ipflow”快速转发。
  堆栈使用线程池来服务从系统的其他部分生成的事件。这些事件可能是:

  1. 超时
  2. ISR事件
  3. 由堆栈或协议模块生成的其他内容
      可以使用命令行选项来控制线程接收包时的优先级。客户端连接请求以浮动优先级模式处理。(线程优先级与访问堆栈资源管理器的客户端应用程序线程的优先级匹配)。一旦一个线程收到一个事件,它检查事件类型,看看它是一个硬件事件,堆栈事件,或“其他”事件:
  4. 如果该事件是硬件事件,则为硬件提供服务,对于接收包,线程确定是否需要桥接或快速转发。如果是这样,线程执行适当的查找,以确定数据包应该排队等待哪个接口,然后负责传输它,然后返回检查硬件是否需要再次服务。
  5. 如果包是针对本地堆栈的,则线程在堆栈队列上对包进行排队。然后,线程返回并继续检查和服务硬件事件,直到没有其他事件为止。
  6. 一旦一个线程完成了对硬件的服务,它就会检查当前是否有一个堆栈线程正在运行,以服务可能由于其操作而生成的堆栈事件。如果没有堆栈线程在运行,该线程就成为堆栈线程并循环运行,处理堆栈事件,直到没有事件为止。然后返回到线程池中,处于“等待事件”状态。
    &emps; 这种将线程从硬件服务线程直接更改为堆栈线程的功能消除了上下文切换,并极大地提高了接收性能(for locally terminated IP flow)。

协议模块

  网络协议模块负责实现特定协议(如Qnet)的细节。
  每个协议组件都打包为一个共享库(例如,lsm-qnet.so)。一个或多个协议组件可以并发运行。
例如,构建文件中的以下行显示了io-pkt-v4通过-p协议命令行选项加载Qnet协议:io-pkt-v4 -dne2000 -pqnet
NOTE:io-pkt管理器包括TCP/IP栈*
  Qnet是QNX中微子本地网络协议。它的主要目的是扩展操作系统强大的消息传递(message-passing)IPC——在微内核上网络透明的IPC。Qnet还提供了服务质量策略,以帮助确保可靠的网络事务。

驱动模块

  网络驱动模块负责管理特定网络适配器的细节(例如,一个NE-2000兼容的以太网控制器)。每个驱动程序都打包为一个共享库,并安装到io-pkt组件中。
  一旦io-pkt
运行,您可以使用mount命令在命令行上动态加载驱动程序。例如,以下命令启动io-pkt-v6-hc,然后装入Broadcom 57xx芯片组适配器的驱动程序:io-pkt-v6-hc & mount -T io-pkt devnp-bge.so。 所有的网络设备驱动程序都是共享对象,它们的名字都是devnp-driver.so的形式。
NOTE:io-pkt-管理器还可以加载遗留的io-net驱动程序。这些驱动程序的名称以devn-开头
  一旦加载了共享对象,io-pkt将对其进行初始化。然后,驱动程序和io-pkt有效地绑定在一起——驱动程序将调用io-pkt*(例如,当数据包从接口到达时),而io-pkt*将调用驱动程序(例如,当需要将包从应用程序发送到接口时).
  要卸载遗留的io-net驱动程序,可以使用umount命令。例如:umount /dev/io-net/en0 要卸载一个新风格的驱动程序或一个遗留的io-net驱动程序,使用ifconfig销毁命令:ifconfig bge0 destroy。

你可能感兴趣的:(QNX)