首先需要解決的就是內(nèi)核態(tài)與用戶態(tài)的進程間通信(interprocess communicatiON, IPC)。而在各種IPC 方法中,最適合此處設(shè)計需要的就是netlink socket 技術(shù)。
Netlink socket 最早出現(xiàn)于Linux 2.2 版的內(nèi)核中,并在2. 4 版以后的版本中作為主要的內(nèi)核與用戶空間的通信方式而被廣泛使用。相對于系統(tǒng)調(diào)用、ioctl 以及proc 文件系統(tǒng)等IPC方法而言,它具有簡單易用、異步通信(適合大數(shù)據(jù)傳輸)、無編譯依賴(可模塊實現(xiàn))、支持多播、支持內(nèi)核發(fā)起會話等優(yōu)點。其中“異步通信、無編譯依賴、支持內(nèi)核發(fā)起會話”
這三點正是本系統(tǒng)需要的關(guān)鍵特性,也是選用該技術(shù)的最主要原因。
Netlink socket 的通信依據(jù)是一個對應(yīng)于進程的標識,一般定為該進程的ID。當通信的一端處于中斷過程時,該標識為0。當使用netlink socket 進行通信,通信的雙方都是用戶態(tài)進程,則使用方法類似于消息隊列。但通信雙方有一端是中斷過程,使用方法則不同。Netlinksocket 的最大特點是對中斷過程的支持,它在內(nèi)核空間接收用戶空間數(shù)據(jù)時不再需要用戶自行啟動一個內(nèi)核線程,而是通過另一個軟中斷調(diào)用用戶事先指定的接收函數(shù),這樣就可以保證數(shù)據(jù)接收的實時性。
當 netlink socket 用于內(nèi)核空間與用戶空間的通信時,在用戶空間的創(chuàng)建方法和一般套接字使用類似,但內(nèi)核空間的創(chuàng)建方法則不同。在內(nèi)核模塊中使用netlink_kernel_create()函數(shù)創(chuàng)建socket 時需要指明接收函數(shù)。之后用戶空間進程創(chuàng)建socket,并將通信標識(一般是該進程的ID)發(fā)送到內(nèi)核空間。這樣內(nèi)核空間獲得了用戶空間進程的通信標識后就可以進行通信了。
當收到電子收款機的銷售軟件向并口打印機發(fā)出的打印請求時,內(nèi)核態(tài)的并口打印模塊需在將數(shù)據(jù)發(fā)送給用戶態(tài)的守護進程之后阻塞打印請求進程。并且,當且僅當接收到守護進程的返回數(shù)據(jù)時,才會喚醒打印請求進程完成打印。
如何實現(xiàn)打印進程的阻塞及喚醒就是最后一個關(guān)鍵技術(shù)點。因為電子收款機只配備一個打印機、不需要復(fù)雜的互斥技術(shù),所以只要使用“簡單睡眠”就可以達到這個目標。