本地過程調用

本地過程調用LPCLocal Procedure Call,通常也被稱為輕量過程調用或者本地進程間通信) 是一種由Windows NT內核提供的內部進程間通信方式。通過這一方式,同一計算機上的進程可以進行輕量的通信。在Windows Vista中,ALPCAdvanced Local Procedure Call,高級本地進程通信)替代了LPC。ALPC提供了一個高速可度量的通信機制,這樣便於實現需要在用戶模式下高速通信的用戶模式驅動程序框架(UMDF,User-Mode Driver Framework)。

本地過程調用接口是Windows NT未公開原生API的一部分。這樣的API不能夠直接使用,但是可以通過如下方式間接使用:

  • 使用Microsoft 遠程過程調用 API進行本地通信,例如,在同一計算機上實現不同處理器之間的通信
  • 調用Windows API中由LPC實現的部分(如下)。

實現

編輯

LPC由內核的「端口」對象實現,這樣可以確保安全(由訪問控制表規定持有特定的安全標識符才可以訪問)並可以驗證連結另一端進程的身份。程序也可以對每一個信息設定安全標識符,並測試對應信息的變化,以實現每一條消息的安全性。

服務端和客戶端之間典型的連接由下列過程表示:

  1. 服務端進程建立命名伺服器連接端口對象,並等待客戶端連接;
  2. 客戶端通過向這一端口發送消息來建立連接;
  3. 如果服務端同意建立連接,便會建立兩個無名端口
    • 客戶端連接端口:客戶線程由此向服務端發送數據;
    • 服務端連接端口:服務端由此向客戶端發送數據;每個客戶端都分配一個獨立的接口;
  4. 服務端持有一個服務連接端口的句柄,同時客戶端也持有一個客戶連接端口的句柄,這樣進程間通信的通道就建立了。

本地過程調用支持以下三種交換信息的方式:

  • 針對較短訊息(小於256位元組):系統內核在進程間直接複製消息,從發送方的地址空間拷貝消息至系統地址空間,之後再將消息拷貝至接收方的地址空間。
  • 針對較長消息(大於256位元組):這需要在發送方和接收方之間建立一個共享內存區域。發送方首先將消息存放在共享內存中,再向接收方發送一個通知(可以通過如上發送短消息的方式實現),之後再由接收方從共享內存中讀取這一消息。
  • 當消息的數據量過大,難以放入共享內存時,服務端可以直接讀取和寫入客戶端的地址空間。

高級本地過程調用(ALPC)擁有比以往的本地過程調用(LPC)更優的性能。因為LPC只能通過同步請求/應答機制通信,而ALPC還可以使用IOCP實現通信。這樣,ALPC就可以在消息數量和進程數量間保持一定平衡,保證了端口的高速通信。此外,ALPC還允許信息的批量傳輸,減少了進程在用戶模式內核模式之間的切換次數。

典型應用

編輯

本地過程調用在Windows NT及其衍生系統中得到了廣泛應用。在Win32子系統中,LPC應用於客戶端和子系統伺服器之間的通信(CSRSS)。在Windows NT 3.51版本中引入了快速LPC以提高調用速度。然而由於NT4.0中將部分關鍵服務端移入內核模式(win32k.sys)以提高系統效能,這一方法已基本被摒棄。

本地安全認證子系統服務(LSASS),會話管理器(SMSS)以及服務控制管理器均使用LPC端口和客戶進程直接通信。Winlogon安全引用監視器與LSASS進程之間的通信同樣使用了LPC。

正如前文提到的,當消息在同一計算機內傳輸時,Microsoft RPC將調用LPC進行通信。許多僅在同一計算機內進行通信的服務採用LPC作為唯一的通信方式。遠程對象連接與嵌入分佈式組件對象模型的實現也在很多地方使用了LPC作為本地通信的方式。

參見

編輯

附註

編輯

參考文獻

編輯
  • Dabak, Prasad; Borate, Milind; Phadke, Sandeep (1999), Undocumented Windows NT, Hungry Minds, ISBN 0-7645-4569-8 
  • Russinovich, Mark; Solomon, David; Ionescu, Alex (2009), Windows® Internals (5th ed.), Microsoft Press, ISBN 0-7356-2530-1 

外部連結

編輯