嵌入式系統休眠喚醒自動運行程序的方法設計
為了提高系統的啟動速度,通常采用基于休眠技術的方式來實現嵌入式系統的快速啟動[1]。例如,在一些數字電視中,采用休眠技術以后的啟動時間要比原來的啟動時間約快1/3[2]。但基于休眠技術的啟動方法有其不足之處:在保存內存內容時只能把內存中的信息以快照的形式保存到磁盤或其他外部存儲設備,原來系統內某些正在運行的動態進程及進程本身的執行過程不能被完全保存下來,從而導致系統重新啟動后此部分進程不能正常運行;基于休眠技術的啟動方式一旦以快照的形式保存后其里面的內容將無法改動?;诖?,本文運用一種新方法,實現了基于休眠的嵌入式操作系統啟動后,可自動運行任何形式的目標腳本和應用程序。
1 休眠喚醒后程序自動運行的方法
最新的Linux2.6內核都支持休眠和待機機制,PC系統中的實現方式有suspend2、swsusp、TuxOnIce等技術,既可以把鏡像文件保存到交換分區,也可以保存到一個文件[3]。Linux中這些休眠的具體實現方式有內核方式和軟件方式兩種,但兩種方式都把休眠過程分為兩個階段:(1)SUSPEND階段:保存當前系統各種狀態到非易失性存儲設備并關機;(2)RESUME階段:系統重新啟動,引導后恢復已保存的狀態[4]。一般嵌入式操作系統的休眠過程如圖1所示,休眠后恢復過程如圖2所示。
本文提出一種基于休眠開關如圖3所示的喚醒后程序自動運行方法。此方法的系統整體框架分為自動執行引擎、開關控制進程、休眠開關和配置文件4個部分。
1.1 自動執行引擎
自動執行引擎采用守護進程實現的方式。所謂守護進程就是Daemon進程,是Linux中的后臺服務程序,是一個生存期較長的進程,通常獨立于控制終端并且周期性地執行某種任務或等待處理某些事件的發生[5]。守護進程常常在系統引導裝入時啟動,在系統關閉時終止。把要運行的目標腳本和應用程序放到守護進程中,并定義一個全局變量Autoflg作為標志位。運用此模塊的目的是讓其在操作系統后臺運行,通過標志位實時監控目標腳本和應用程序的運行狀態。守護進程的整體結構圖如圖4所示。
守護進程模塊分主調函數生成守護進程的Daemon程序和主調函數程序兩部分,通過執行這兩個程序最終生成在操作系統后臺一直運行的守護進程。其執行的程序框圖如圖5所示。
1.2 開關控制模塊
此模塊的功能是控制守護進程中的Autoflg標志位,此標志位是在守護進程中的主調函數程序中設置的,用來控制目標腳本和應用程序的運行狀態。其具體程序框圖如圖6所示。
1.3 休眠模塊
此模塊實現守護進程和控制模塊之間的通信,采用系統調用的方式,目的是通過控制模塊的執行來控制守護進程中標志位的變化,而這種控制是通過在內核中插入信號傳遞模塊來實現。
1.4 配置文件
配置文件(即方法執行)過程:
(1)執行時首先運行守護進程,但要通過Autoflg標志位保證目標腳本和應用程序處于不運行狀態。
(2)運行控制標志位函數修改Autoflg,讓其保證目標腳本和應用程序可以運行。
(3)執行快速啟動,系統執行快速啟動程序同時確保保存到磁盤或其他存儲設備中的標志位是處于可以使目標腳本和應用程序運行的狀態。
(4)因為基于休眠的快速啟動方法是以快照的方式把內存內容保存到磁盤或其他存儲設備中,并且一旦執行,里面的內容將無法修改,所以以后每次操作系統啟動時都能保證守護進程的正常運行,同時也能保證守護進程中的標志位處于能夠使目標腳本和應用程序處于運行的狀態,從而使目標腳本和應用程序能夠正常運行。
(5)為了提高CPU的運行速度和整個系統的使用效率,本方法設置守護進程在每次啟動目標腳本和應用程序后都自動退出。因為設置守護進程的目的就是在每次操作系統啟動時,使其啟動目標腳本和應用程序,待這項工作完成以后,它的使命也隨之完成(即從系統的運行速度和運行效率角度來看,已沒有其存在的必要性)。
2 實驗分析
為了確保本文所提方法的實用性和可靠性,把其應用到海爾數字電視上進行了驗證,并對驗證結果進行了詳細的分析。
實驗環境如下:
(1)硬件環境:MSTAR 6I98電視主板:主頻為700 MHz,內存為512 MB,Flash為256 MB,總線為I2C、PCI。
(2)軟件環境:電視主板中運行Linux-2.6.28.9嵌入式操作系統,串口控制臺服務器為Linux操作系統。
首先對海爾數字電視采用基于休眠的技術對其操作系統進行改進,實現數字電視的快速啟動。但當采用休眠方式啟動后,發現一些應用程序(如/applications/df_
logo、/applications/bin/haier_board)都無法正常運行。對此采用ps命令行查看其進程是否存在,發現某些進程(如df_logo)在控制臺上有顯示,但在實際情況中不能正常運行,而有些進程(如haier_board)根本就沒有顯示。
經研究表明,這些腳本或應用程序不能正常啟動的原因是:logo文件的執行過程或haier_board應用程序中的一些動態界面的顯示過程在休眠時不能夠完全保存到休眠文件中,從而導致在休眠啟動后雖然用命令行查看這些程序的進程在控制臺上有顯示,而電視界面不能按正常的方式顯示。為了解決這個問題,把本文方法應用到操作系統中,最后結果顯示:df_logo和haier_board兩個應用程序在系統啟動完成后即能正常啟動運行,其效果和采用非休眠方式啟動的效果一樣,而且電視界面也能夠正常顯示。
實驗步驟如下:
(1)把不能正常運行的應用程序和腳本文件(df_logo、haier_board)編寫成目標腳本并把它放到指定目錄下;(2)編寫內核模塊,并用系統調用的方式把模塊插入到內核,用交叉編譯生成新的內核和模塊的.ko文件;(3)編寫守護進程函數,并用交叉編譯生成可執行文件;(4)編寫控制模塊(控制模塊里包含可以使操作系統實現快速啟動的函數),并用交叉編譯生成可執行文件;(5)重新燒寫新的內核;(6)在/etc/init.d/文件夾的相應文件里加一句加載上述模塊的語句,使其在系統每次啟動時都能夠自動加載到內核;(7)為此模塊建立設備文件;(8)執行守護進程可執行文件,使其在操作系統后臺運行;(9)執行控制模塊的可執行文件,使其在改變標志位后立即執行快速啟動程序,從而保證系統以后每次重啟后都能夠自動運行目標腳本和應用程序。
本文提出了一種新的方法,實現了基于休眠的嵌入式操作系統啟動后,自動運行任何形式的目標腳本和應用程序。






評論