无线界面层

科技工作者之家  |   2020-11-17 17:34

无线界面层(英语:Radio Interface Layer,缩写为RIL),是操作系统的一层界面,它负责提供界面,来控制移动电话的调制解调器(Modem)与无线电。

简介简单的说,RIL(Radio Interface Layer),就是将应用程序的通信请求发送给CP的中间层,其包括两个部分,一个是Java层RILJ,一个是C++层(不妨看作是CP对应的HAL层)RILD。

RILJ属于系统Phone进程的一部分,随Phone进程启动而加载;而RILD守护进程是通过Android的Init进程进行加载的。

RIL结构下图是一个Android RIL的一个结构图。整个通信过程有四个层:

最上层的是应用程序,如通话,短信以及SIM卡管理,它们主要负责将用户的指令发送到RIL Framework(以后统称RILJ);

RILJ为上层提供了通用的API,如TelephonyManager(包括通话,网络状态; SubscriptionManager(卡状态)以及SmsManager等,同时RILJ还负责维持与RILD的通信,并将上层的请求发送给RILD;

RILD是系统的守护进程,对于支持通话功能的移动平台是必不可少的。RILD的功能主要功能是将RILJ发送过来的请求继续传递给CP,同时会及时将CP的状态变化发送给RILJ;

Linux驱动层:kernel驱动层接受到数据后,将指令传给CP,最后由CP发送给网络端,等网络返回结果后,CP将传回给RILD;

RILJ与RILD(RILD与CP的通信)都是通过一个个消息进行数据传递。消息主要分两种:一种是RILJ主动发送的请求(solicited),常见的有RIL_REQUEST_GET_SIM_STATUS(获取SIM卡状态),RIL_REQUEST_DIAL(拨打电话),RIL_REQUEST_SEND_SMS(发送短信),RIL_REQUEST_GET_CURRENT_CALLS(获取当前通话状态),RIL_REQUEST_VOICE_REGISTRATION_STATE(获取网络状态); 另一种则是从CP主动上报给RIL的消息(unsolicited),如网络状态发生变化时,CP会上报RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED,有新短信时,会上报RIL_UNSOL_RESPONSE_NEW_SMS,有来电时会上报RIL_UNSOL_CALL_RING。

上层如何得知RILJ状态变化为方便上层实时监听网络状态、通话状态以及CP的状态变化,RIL提供了一个专门的监听接口IPhoneStateListener.aidl,上层需要监听上述状态变化时,只需要实现上述接口,并在Android系统服务TelephonyRegistry中对上述接口实现进行注册。另外,也可以在TelephonyManager中对RIL状态进行监听。

RILJ与RILD如何通信RILJ在创建过程中,会启动两个线程:RILSender和RILReceiver,RILSender负责将指令发送给RILD,而RILReceiver则负责从读取从RILD发送过来的数据。RILJ与RILD的通信通道就是在RILReceiver中建立起来的。

RILD与CP如何进行通信RILD与CP(可以看做是两个运行在不同CPU上的进程通信)交换数据方式一般有两种情况。如果AP与CP集中在一个芯片上,如高通的平台就是将AP与CP集中在一块芯片上,这时通常采用共享内存的方式实现跨进程通信;而如果不是在同一块芯片,而是AP与CP分别采用不同厂商的平台,则一般采用字符设备(character devices) 进行通信。总的说来,共享内存的方式在速度上要优于字符设备。

Android RIL与Windows Mobile RILAndroid RIL被实现为HAL,相对于windows mobile中被实现为驱动的方式,Android RIL模块的内聚性更为理想,可维护性也将更强,你也可以把Android Ril看做一个中间件。Android RIL部分的开发工作,只需要拿到相应的radio文件描述符,就可以进行操作,无需关注radio的I/O驱动实现。

Windows Mobile RILRIL在微软推出的移动操作系统Windows Mobile中占有重要的地位。在Windows Mobile装置中,RIL让上层控制语音电话或资料传输的应用程序能够与控制GSM/GPRS或CDMA20001X的调制解调器沟通。RIL提供系统界面,让Windows Mobile操作系统中的CellCore层,能与与无线调制解调器硬件使用的无线通讯堆叠沟通。RIL也提供了抽象界面,容许OEM厂商将不同的调制解调器整合进他们的系统中。通过RIL,系统容许所有不同的无线电装置都能够在单一的CellCore元件下运作。1

Android RILAndroid的RIL层主要分成两个部分:RIL Daemon和Vendor RIL。

RIL Daemon由C/C++写成,负责透过socket承接来自于电话框架(Telephony frameworks)的请求,并且将请求找到对应的函数后转往Vendor RIL。另外也负责将来自Vendor RIL的回应回报给电话框架。

Vendor RIL为各数据芯片的供应商所提供。在RIL Daemon定义了各种不同的函式,而各芯片开发商(如:高通公司)则实做RIL Daemon定义的各种函式,再修改RIL Daemon汇入的函式库以驱动自己的硬件。简单来说,Vendor RIL负责承接来自于RIL Daemon的指令,将之做基本处理后传递给数据芯片做其他的控制。另外,Vendor RIL 也会同步监听调制解调器以获得调制解调器“主动回报”、或“处理完后回报”的指令,并将之做初步解析后经由RIL Daemon回传到电话框架。

RIL可分成两大指令:之一为RIL传递讯息给数据芯片并接收数据芯片执行完后的结果的指令(Solicited commands),之二为数据芯片主动回报的指令(Unsolicited commands)。2

Android RIL与Windows Mobile RIL对比两者在与应用通信上的实现对比

WindowsMobile RIL在实现与应用的通信时提供了RIL Proxy,在这个层面中它定义了大量的RIL_***()函数来作为电话服务请求。这一点与Android RIL的实现比较相似,Android RIL中在ril.h内提供了一系列的宏来定义电话服务请求。

在Android中的rild功能类似于windows mobile RIL的RIL proxy。它同样也是起到一个中介的作用,为上层接口向下传递请求,并上传回响应。在windows mobile RIL中要为每一个应用程序客户提供一份Ril Proxy实例。

对于这两种操作系统平台,RIL所定义的所有请求是不可更改的。

两者在线程结构与回调机制上的对比

在windows mobile的设计中,request与response被设计为异步执行的,他们分别使用两个队列来对它们的异步行为进行管理,执行命令下发和上报命令处理的过程也互不影响,下发命令与命令的相应响应之间的依赖关系由应用程序来捏合。

在android ril中的request与response设计与windows mobile不同,它的命令与响应之间是同步的过程。也就是说一条命令被下发后,将等待执行结果,并进行处理,再上向上层发。而不是直接异步的进行处理和向上发送。

本词条内容贡献者为:

王沛 - 副教授、副研究员 - 中国科学院工程热物理研究所