Linux電子收款機

Linux電子收款機

linux電子收款機以使用linux 作業系統、並口印表機的電子收款機為平台,將印表機設備視為檔案,通過對該檔案的寫操作來實現列印功能。通常情況下,對檔案系統的監控是通過系統調用劫持來實現的。但是1) linux 2.6 版本之後的核心,系統調用表的地址已經不能導出,系統調用劫持的實現難度加大;2) 劫持 sys_write 系統調用後,所有的檔案寫入操作都會被劫持,對系統的性能有較大影響;3) 修改後的列印數據必須存入銷售軟體進程的用戶記憶體空間,才能調用檔案驅動模組write 函式將其列印出來。而侵入銷售軟體進程將大大降低系統的獨立性和可靠性。

linux電子收款機進程間通信,linux電子收款機列印進程,linux電子收款機write 操作,

linux電子收款機進程間通信

首先需要解決的就是核心態與用戶態的進程間通信(interprocess communication, ipc)。而在各種ipc 方法中,最適合此處設計需要的就是netlink socket 技術。  netlink socket 最早出現於linux 2.2 版的核心中,並在2. 4 版以後的版本中作為主要的核心與用戶空間的通信方式而被廣泛使用。相對於系統調用、ioctl 以及proc 檔案系統等ipc方法而言,它具有簡單易用、異步通信(適合大數據傳輸)、無編譯依賴(可模組實現)、支持多播、支持核心發起會話等優點。其中“異步通信、無編譯依賴、支持核心發起會話”  這三點正是本系統需要的關鍵特性,也是選用該技術的最主要原因。  netlink socket 的通信依據是一個對應於進程的標識,一般定為該進程的id。當通信的一端處於中斷過程時,該標識為0。當使用netlink socket 進行通信,通信的雙方都是用戶態進程,則使用方法類似於訊息佇列。但通信雙方有一端是中斷過程,使用方法則不同。netlinksocket 的最大特點是對中斷過程的支持,它在核心空間接收用戶空間數據時不再需要用戶自行啟動一個核心執行緒,而是通過另一個軟中斷調用用戶事先指定的接收函式,這樣就可以保證數據接收的實時性。  當 netlink socket 用於核心空間與用戶空間的通信時,在用戶空間的創建方法和一般套接字使用類似,但核心空間的創建方法則不同。在核心模組中使用netlink_kernel_create()函式創建socket 時需要指明接收函式。之後用戶空間進程創建socket,並將通信標識(一般是該進程的id)傳送到核心空間。這樣核心空間獲得了用戶空間進程的通信標識後就可以進行通信了。

linux電子收款機列印進程

當收到電子收款機的銷售軟體向並口印表機發出的列印請求時,核心態的並口列印模組需在將數據傳送給用戶態的守護進程之後阻塞列印請求進程。並且,若且唯若接收到守護進程的返回數據時,才會喚醒列印請求進程完成列印。  如何實現列印進程的阻塞及喚醒就是最後一個關鍵技術點。因為電子收款機只配備一個印表機、不需要複雜的互斥技術,所以只要使用“簡單睡眠”就可以達到這個目標。

linux電子收款機write 操作

linux 作業系統將設備看作檔案,每個linux 的設備驅動程式都定義了一個 file_operation結構,結構中的各個成員是驅動模組中定義函式的指針, 通過這些函式具體實現對檔案的open, read, write 等操作。因此,只要將並口列印驅動模組的file_operation 結構常量——lp_fops的write 成員的值由lp_write 替換為指向攔截函式的指針就能實時地攔截並口印表機的列印操作。  這裡需要實現兩個關鍵函式:  1)lp_write_from_kernellp_write_from_kernel 函式實現核心空間的緩衝區數據的列印功能。來自守護進程的修改後列印數據是保存在核心空間的,因此不能調用原有的lp_write 函式進行列印。具體的實現可依照lp_write,只要將調用copy_from_user 函式的地方改為調用memcpy 函式即可。  2)lp_interceptlp_intercept 函式函式用於替換lp_write,攔截並口列印驅動的write 操作,實現列印數據截取與修改:當電子收款機的銷售軟體調用並口列印驅動的write 函式時,將寫緩衝區的列印數據傳送給守護進程;待守護進程返回修改後的列印數據(附加了稅控碼),調用lp_write_from_kernel 將其列印出來。

相關詞條

熱門詞條

聯絡我們