專利名稱:嵌入式操作系統(tǒng)鏡像啟動的啟動優(yōu)化方法
技術領域:
本發(fā)明涉及基于嵌入式操作系統(tǒng)啟動領域,特別是涉及一種嵌入式操作系統(tǒng)鏡像啟動的啟動優(yōu)化方法。
背景技術:
手機等嵌入式系統(tǒng)由于考慮到人的忍耐度,所以在啟動的時候不能花較長的時間。為了使用上的方便,要盡量縮短手機操作系統(tǒng)的引導和啟動時間,雖然內(nèi)核經(jīng)過很大程度的裁減,并且各種功能模塊都盡量做了優(yōu)化,但是由于硬件條件的限制,如果不對引導和啟動作特殊的設計,還是會造成啟動時間過長。
現(xiàn)在主要采用兩種技術來縮短這個時間。一,固化各種不可擴展硬件的設置,盡量標準化可擴展設備的接口,節(jié)約設備檢測時間。二,延時裝載技術,既LazyLoading,這種技術不加載當前非必需的模塊,這些模塊可以在啟動后待機時間內(nèi)加載,或者在具體用到之后再加載,把啟動時間打散,從而縮短對用戶來說至關重要的反應時間。
對第一種技術來說,目前以及在將來較短一段時間內(nèi)最主要的還是固化不可擴展硬件的設置,因為首先現(xiàn)在手機的可擴展設備還很少,其次硬件條件限制較多,所以把一些固定的設置固化在操作系統(tǒng)內(nèi)部應該是比較理想的措施。而考慮到將來的發(fā)展趨勢,手機將可以連接越來越多的外設,而且這些外設都必須是即插即用的,所以不可能固化它們的設置。但是如果給所有的手機外設制定一套標準接口,則啟動時最多只需加載一個標準的公用接口模塊即可,大大節(jié)省了啟動時間,并節(jié)約了存儲空間。
對于第二種技術來說,由于操作系統(tǒng)將在很多地方采用“組件化”的技術,故而非常方便Lazy Loading。并且為了進一步縮短反應時間,將“動態(tài)設置”必需模塊,根據(jù)對用戶的使用習慣等條件的統(tǒng)計,把一些用戶在開機后不會立即使用的模塊設置為非必須模塊,而把用戶經(jīng)常在開機后就使用的功能設置為必須模塊,這樣對用戶來說反應時間就得到了很大的改善。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種嵌入式操作系統(tǒng)鏡像啟動的啟動優(yōu)化方法。
本發(fā)明解決其技術問題采用的技術方案如下1)系統(tǒng)鏡像準備操作系統(tǒng)的引導程序在啟動的過程中,將操作系統(tǒng)內(nèi)核鏡像從系統(tǒng)的外存上載入內(nèi)核,并進行解壓縮,在啟動過程中,引導程序如果發(fā)現(xiàn)只存在原始的操作系統(tǒng)鏡像,系統(tǒng)將按正常程序啟動;當系統(tǒng)啟動到最簡潔的基本工作狀態(tài)后,操作系統(tǒng)將啟動系統(tǒng)休眠過進程,這個進程的主要工作是為保存系統(tǒng)鏡像做各種準備工作;2)保存系統(tǒng)鏡像這部分主要完成系統(tǒng)現(xiàn)場的保存工作,首先將將建立一個虛擬終端,用來模擬通訊,然后開始結(jié)束除內(nèi)核態(tài)進程,僵死進程,當前進程之外所有的進程,此后調(diào)用函數(shù)來釋放盡可能多的內(nèi)存空間,以減少內(nèi)存鏡像的大小,然后對一些驅(qū)動進行處理,對在電源管理系統(tǒng)中注冊的所有外設,發(fā)送掛起命令,然后插入系統(tǒng)屏障,阻斷系統(tǒng)執(zhí)行,開始保存處理器上下文,最后將內(nèi)存鏡像到外部制定的設備上,最后將操作系統(tǒng)休眠;3)操作系統(tǒng)鏡像的裝載操作系統(tǒng)的引導程序在啟動的過程中,將操作系統(tǒng)內(nèi)核鏡像從系統(tǒng)的外存上載入內(nèi)核,并進行解壓縮,在啟動過程中,引導程序如果發(fā)現(xiàn)存在操作系統(tǒng)啟動優(yōu)化鏡像,系統(tǒng)將這個鏡像載入內(nèi)存,并進行解壓縮;系統(tǒng)先創(chuàng)立一個虛擬終端,用來顯示裝載鏡像過程中的系統(tǒng)信息,首先檢查鏡像的正確性,然后按照順序?qū)㈢R像中的內(nèi)存頁面恢復到內(nèi)存,最后將處理器的上下文恢復。
本發(fā)明與背景技術相比,具有的有益的效果是1、無延時上面這種方法,只能為用戶造成一種假相,系統(tǒng)看上去可以用,已經(jīng)起來,實際上在用的時候還得加載必須得模塊。而嵌入式操作系統(tǒng)鏡像啟動的啟動優(yōu)化方法,是真實的為應用提供了一個完整的系統(tǒng),直接通過設置系統(tǒng)的應用環(huán)境,不需要延時加載,以及在用的時候在加載必要的模塊,節(jié)約了時間和能量;2、快捷性嵌入式操作系統(tǒng)鏡像啟動的啟動優(yōu)化方法采用的是直接設置系統(tǒng)環(huán)境的啟動方法,這個方法更加快捷;3、通用性可以自動設置啟動鏡像,不需要針對不同的應用平臺進行不同的設置,更換平臺不需要更換鏡像,只要重新啟動系統(tǒng),然后讓系統(tǒng)自動根據(jù)系統(tǒng)情況設置一個鏡像,就可以。
附圖為整個系統(tǒng)的流程圖。
具體實施例方式
在實施基于嵌入式操作系統(tǒng)啟動優(yōu)化方法時,鏡像啟動技術被廣泛利用。
嵌入式操作系統(tǒng)鏡像啟動的啟動優(yōu)化方法具體實現(xiàn)流程如下。
一、系統(tǒng)鏡像準備系統(tǒng)鏡像準備過程主要分為以下幾部分1、操作系統(tǒng)引導操作系統(tǒng)的引導程序在啟動的過程中,首先將自己從外存上拷貝到內(nèi)存空間,然后到指定的外存位置查找系統(tǒng)鏡像,如果系統(tǒng)鏡像存在,那么將操作系統(tǒng)內(nèi)核鏡像從系統(tǒng)的外存上載入內(nèi)核,由于系統(tǒng)內(nèi)核鏡像比較大,一般情況下都是被壓縮后保存到外存的,所以要進行解壓縮;以Sistang嵌入式實驗平臺上的ARM-Linux操作系統(tǒng)為例,他的操作系統(tǒng)引導過程可見下面。
在內(nèi)核運行之前需要系統(tǒng)引導程序完成加載內(nèi)核和一些輔助性的工作,然后跳轉(zhuǎn)到內(nèi)核代碼的起始地址并執(zhí)行。
首先,啟動后Sitsang板子將地址0x0c00 0000映射到0(可通過跳線設置),實際上從0x0c00 0000啟動,進入的bootloader,但由于flash速度慢,所以bootloader前面有一小段程序把bootloader拷貝到SDRAM中的0x0AFE0100,再從0x 0800 0000運行bootloader,叫這段小程序為flashloader,flashloader必須要首先初始化SDRAM。flashloader把bootloader load到0x0AFE0100,然回跳了過去,其實0x0AFE0100就是燒在flash 0x0C000100中的真正的bootloader。
BootLoader將操作系統(tǒng)代碼調(diào)入內(nèi)存,然后將控制權(quán)交給arch/arm/boot中的Setup.S這段程序。Setup.S這段程序在實模式下對系統(tǒng)進行基本的檢測和設置后轉(zhuǎn)入保護模式把控制權(quán)交給head_armv.S。一個步驟是系統(tǒng)內(nèi)核的解壓過程,這部分代碼在地址0x1000(文件/Boot/head.S),該段程序初始化寄存器,然后執(zhí)行decompress_kernel(),這個函數(shù)源于zBoot/inflate.c、zBoot/unzip.c和zBoot/misc.c三個文件。解壓后數(shù)據(jù)放在地址0x100000。Head.S建立內(nèi)存管理和中斷管理的框架。
2、操作系統(tǒng)啟動1)、判斷是否存在快速啟動鏡像在內(nèi)核鏡像解壓縮后,系統(tǒng)要判斷是否存在快速啟動鏡像,如過不存在則正常啟動,如果存在則快速啟動。
2)、正常啟動在啟動過程中,引導程序如果發(fā)現(xiàn)只存在原始的操作系統(tǒng)鏡像,系統(tǒng)將按正常程序啟動,首先系統(tǒng)將按順序初始化各種部件,首先初始化體系結(jié)構(gòu),然后初始化中斷向量表、調(diào)度器、內(nèi)存等等,最后啟動系統(tǒng)的各種服務。
以ARM-Linux為例,這個啟動過程主要從Start_kernel開始直到創(chuàng)建init進程。Init進程調(diào)用lock_kernel之后,在調(diào)用prepare_namespace加載rootfs之前,調(diào)用do_basic_setup函數(shù),進行一些基礎的設置,如pci,sbus,ecard等,do_basic_setup然后調(diào)用start_context_thread()和do_initcalls(),加載一些設備的驅(qū)動程序,之后,進入software_resume()這個新添加的函數(shù),準備檢查交換分區(qū),進行系統(tǒng)的恢復。
software_resume函數(shù)進行一些必要的條件檢測之后,調(diào)用read_suspend_image函數(shù),來讀取之前保存的鏡像,如果鏡像不存在讀取失敗,software_resume函數(shù)會調(diào)用kernel_thread(swsusp_mainloop,NULL,CLONE_FS|CLONE_FILES|CLONE_SIGHAND|SIGCHLD)來創(chuàng)建一個內(nèi)核態(tài)的進程,swsusp_mainloop()函數(shù)調(diào)用daemonize()來釋放對用戶空間的引用使自己成為一個后臺的守護進程,并重命名自己為kswsuspd,之后便陷入了無限的循環(huán),并且每隔一秒檢測一下swsusp_state
的值是否出現(xiàn)變化(若此值從0變成1,則會跳出循環(huán),調(diào)用休眠的函數(shù))。至此,software_resume函數(shù)返回,繼續(xù)do_basic_setup以及init(),直至系統(tǒng)正常啟動。
3)、鏡像啟動如果引導程序發(fā)現(xiàn)存在操作系統(tǒng)的鏡像,引導程序?qū)⑦@個鏡像載入內(nèi)存,并進行解壓縮;系統(tǒng)先創(chuàng)立一個虛擬終端,用來顯示裝載鏡像過程中的系統(tǒng)信息,首先檢查鏡像的正確性,然后按照順序?qū)㈢R像中的內(nèi)存頁面恢復到內(nèi)存,最后將處理器的上下文恢復。這部分工作的具體舉例說明將放到后面。
3、鏡像工作環(huán)境的建立當系統(tǒng)啟動到最簡潔的基本工作狀態(tài)后,操作系統(tǒng)將啟動系統(tǒng)休眠過進程,這個進程的主要工作是為保存系統(tǒng)鏡像做各種準備工作;以Linux操作系統(tǒng)能夠的鏡像啟動為例,這部分工作主要包括1)向內(nèi)核的數(shù)據(jù)段里面添加一段_nosave,以便于把一些變量放到其中。這樣一來,在使用這些變量的時候,就不會涉及到堆棧。
2)定義保存/恢復鏡像的設備static char resume_file[256]=″/dev/modify″,此設備的主設備號是241,次設備號是2,同時需要在init/do_mounts.c中的root_dev_names[]中添加一項{″modify″,0xf102},此后通過name_to_kdev_t函數(shù),指定參數(shù)”/dev/modify”就可以獲得該設備的設備號0xf102,再通過宏MAJOR()和MINOR()就可分別獲得該設備的主設備號241和從設備號2。
3)定義狀態(tài)量int swsusp_state[3]用來管理進行休眠和鏡像過程中的一些參數(shù)信息。
二、保存系統(tǒng)鏡像這部分主要完成系統(tǒng)現(xiàn)場的保存工作,首先將將建立一個虛擬終端,用來模擬通訊;然后開始結(jié)束除內(nèi)核態(tài)進程,僵死進程,當前進程之外所有的進程,此后調(diào)用函數(shù)來釋放盡可能多的內(nèi)存空間,以減少內(nèi)存鏡像的大小,然后對一些驅(qū)動進行處理,對在電源管理系統(tǒng)中注冊的所有外設,發(fā)送掛起命令,然后插入系統(tǒng)屏障,阻斷系統(tǒng)執(zhí)行,開始保存處理器上下文,最后將內(nèi)存鏡像到外部制定的設備上,最后將操作系統(tǒng)休眠。
以ARM-Linux為例,整個過程如下所示1)、系統(tǒng)要建立鏡像將必須調(diào)用一個叫做software_suspend函數(shù)。software_suspend()調(diào)用了do_software_suspend函數(shù),真正開始了系統(tǒng)的休眠和鏡像的建立。
2)、software_suspend()調(diào)用了do_software_suspend函數(shù),首先建立一個虛擬的終端,然后開始調(diào)用freeze_processes函數(shù)來結(jié)束除內(nèi)核態(tài)進程,僵死進程,當前進程之外所有的進程,此后調(diào)用free_some_memory函數(shù)來釋放盡可能多的內(nèi)存空間,以減少內(nèi)存鏡像的大小。然后對一些驅(qū)動進行處理,調(diào)用了pm_send_all(PM_SUSPEND,(void*)3)向在電源管理PM模塊中注冊了的設備發(fā)送系統(tǒng)掛起suspend的通知。
3)、最后do_software_suspend函數(shù)調(diào)用do_suspend_lowlevel函數(shù)。do_suspend_lowlevel依次調(diào)用do_magic_suspend_1(),save_processor_context()和do_magic_suspend_2()三個函數(shù)do_magic_suspend_1()調(diào)用mb()和barrier()來為接下來的save_processor_context函數(shù)做準備。Void Barrier(void)通知編譯器插入一個內(nèi)存屏障,但對硬件無效,編譯后的代碼會把當前CPU寄存器中的所有修改過的數(shù)值存入內(nèi)存,需要這些數(shù)據(jù)的時候再重新從內(nèi)存中讀出。
4)、save_processor_context函數(shù)保存當前狀態(tài)下的CPU的運行上下文。用來保存這些值的一個struct具有_attribute_((packed))的屬性,可將其成員變量緊湊排列。
5)、之后進入do_magic_suspend_2函數(shù)。此函數(shù)負責把內(nèi)存頁面保存到swap分區(qū)中。此函數(shù)首先調(diào)用read_swapfiles從可能的32個交換設備(包括文件和分區(qū))中找到在前文中指定的分區(qū)/dev/modify。然后調(diào)用save_suspend_image來完成全部的復制操作之后,調(diào)用suspend_power_down,關閉或者重新啟動計算機。
三、操作系統(tǒng)鏡像的裝載操作系統(tǒng)的引導程序在啟動的過程中,將操作系統(tǒng)內(nèi)核鏡像從系統(tǒng)的外存上載入內(nèi)核,并進行解壓縮,在啟動過程中,引導程序如果發(fā)現(xiàn)存在操作系統(tǒng)啟動優(yōu)化鏡像,系統(tǒng)將這個鏡像載入內(nèi)存,并進行解壓縮;系統(tǒng)先創(chuàng)立一個虛擬終端,用來顯示裝載鏡像過程中的系統(tǒng)信息,首先檢查鏡像的正確性,然后按照順序?qū)㈢R像中的內(nèi)存頁面恢復到內(nèi)存,最后將處理器的上下文恢復;以ARM-Linux為例,整個過程如下所示1)、開機后,BootLoader裝載linux kernel并解壓縮,然后start_kernel直到創(chuàng)建init進程。Init進程調(diào)用lock_kernel之后,在調(diào)用prepare_namespace加載rootfs之前,調(diào)用do_basic_setup函數(shù),進行一些基礎的設置,如pci,sbus,ecard等,do_basic_setup然后調(diào)用start_context_thread()和do_initcalls(),加載一些設備的驅(qū)動程序,之后,進入自己的software_resume()函數(shù),準備檢查交換分區(qū),進行系統(tǒng)的恢復。
2)、software_resume函數(shù)進行一些必要的條件檢測之后,調(diào)用read_suspend_image函數(shù),來讀取之前保存的鏡像,read_suspend_image調(diào)用更底層的_read_suspend_image來完成主動的鏡像讀取工作。
3)、_read_suspend_image調(diào)用prepare_suspend_console來創(chuàng)建一個虛擬的控制臺,用來顯示恢復中的一些相關信息。之后調(diào)用bdev_read_page來從/dev/modify設備里面獲取一頁,得到鏡像的頭部信息,并調(diào)用sanity_check函數(shù)來檢測鏡像的頭部信息是否正確,以確定現(xiàn)在的系統(tǒng)是否是休眠前的系統(tǒng),如果不是則按照正常系統(tǒng)啟動。
4)、接下來通過循環(huán)調(diào)用bdev_read_page來獲得pagedir和所有的保存的內(nèi)存的頁面(讀取內(nèi)存頁面的順序與保存內(nèi)存頁面時的順序正好相反)。并回復內(nèi)存內(nèi)容,然后read_suspend_image函數(shù)返回。接下來調(diào)用do_suspend_lowlevel來進一步地恢復系統(tǒng)。
5)、do_suspend_lowlevel通過對CPU寄存器Cr3的設置,把swapper_pg_dir的物理地址做為更改為頁目錄的物理地址。并且通過對ecx的設置,創(chuàng)建了新的堆棧指針。CR3用于保存頁目錄表的起始物理地址。由于目錄是頁對齊的,所以僅高20位有效,低12位保留未用。向CR3中裝入一個新值時,低12位必須為0;但從CR3中取值時,低12位被忽略。每當用MOV指令重置CR3的值時,會導致分頁機制高速緩沖區(qū)的內(nèi)容無效,用此方法,可以在啟用分頁機制之前,即把PG位置1之前,預先刷新分頁機制的高速緩存。CR3寄存器即使在CR0寄存器的PG位或PE位為0時也可裝入,如在實模式下也可設置CR3,以便進行分頁機制的初始化。在任務切換時,CR3要被改變,但是如果新任務中CR3的值與原任務中CR3的值相同,那么處理器不刷新分頁高速緩存,以便當任務共享也表時有較快的執(zhí)行速度。
6)、do_suspend_lowlevel接下來依次調(diào)用do_magic_resume_1()restore_processor_context和do_magic_resume_2()來完成所有的恢復工作。
7)、do_magic_resume_1()調(diào)用了mb();barrier();來為接下來的restore_processor_context函數(shù)做準備。Void Barrier(void)通知編譯器插入一個內(nèi)存屏障,但對硬件無效,編譯后的代碼會把當前CPU寄存器中的所有修改過的數(shù)值存入內(nèi)存,需要這些數(shù)據(jù)的時候再重新從內(nèi)存中讀出。此后,do_suspend_lowlevel開始以sizeof(char)為單位進行內(nèi)存頁面的復制。之所以這里不能使用copy_page這樣的函數(shù),是因為在內(nèi)存頁面復制的時候,會破壞堆棧(stack),在完全恢復CPU寄存器的值之前,不能再使用堆棧以及局部變量,但是可以使用位于內(nèi)核代碼段的_nosave區(qū)的變量。之后,restore_processor_context()函數(shù)開始恢復CPU寄存器的值。最后進入do_magic_resume_2()。
8)、do_magic_resume_2()主要處理一些清掃現(xiàn)場的工作。它釋放掉在休眠時分配的pagedir,以保證內(nèi)存完全恢復到休眠前的狀態(tài)然后通過調(diào)用pm_send_all(PM_RESUME,(void*)0)向在電源管理PM模塊中注冊了的設備發(fā)送系統(tǒng)恢復resume的通知。至此,所有的工作都完成了。系統(tǒng)已經(jīng)恢復到休眠之前的狀態(tài)。
整個系統(tǒng)的流程圖如附圖所示。
權(quán)利要求
1.一種嵌入式操作系統(tǒng)鏡像啟動的啟動優(yōu)化方法,其特征在于1)系統(tǒng)鏡像準備操作系統(tǒng)的引導程序在啟動的過程中,將操作系統(tǒng)內(nèi)核鏡像從系統(tǒng)的外存上載入內(nèi)核,并進行解壓縮,在啟動過程中,引導程序如果發(fā)現(xiàn)只存在原始的操作系統(tǒng)鏡像,系統(tǒng)將按正常程序啟動;當系統(tǒng)啟動到最簡潔的基本工作狀態(tài)后,操作系統(tǒng)將啟動系統(tǒng)休眠過進程,這個進程的主要工作是為保存系統(tǒng)鏡像做各種準備工作;2)保存系統(tǒng)鏡像這部分主要完成系統(tǒng)現(xiàn)場的保存工作,首先將將建立一個虛擬終端,用來模擬通訊,然后開始結(jié)束除內(nèi)核態(tài)進程,僵死進程,當前進程之外所有的進程,此后調(diào)用函數(shù)來釋放盡可能多的內(nèi)存空間,以減少內(nèi)存鏡像的大小,然后對一些驅(qū)動進行處理,對在電源管理系統(tǒng)中注冊的所有外設,發(fā)送掛起命令,然后插入系統(tǒng)屏障,阻斷系統(tǒng)執(zhí)行,開始保存處理器上下文,最后將內(nèi)存鏡像到外部制定的設備上,最后將操作系統(tǒng)休眠;3)操作系統(tǒng)鏡像的裝載操作系統(tǒng)的引導程序在啟動的過程中,將操作系統(tǒng)內(nèi)核鏡像從系統(tǒng)的外存上載入內(nèi)核,并進行解壓縮,在啟動過程中,引導程序如果發(fā)現(xiàn)存在操作系統(tǒng)啟動優(yōu)化鏡像,系統(tǒng)將這個鏡像載入內(nèi)存,并進行解壓縮;系統(tǒng)先創(chuàng)立一個虛擬終端,用來顯示裝載鏡像過程中的系統(tǒng)信息,首先檢查鏡像的正確性,然后按照順序?qū)㈢R像中的內(nèi)存頁面恢復到內(nèi)存,最后將處理器的上下文恢復。
全文摘要
本發(fā)明公開了一種嵌入式操作系統(tǒng)鏡像啟動的啟動優(yōu)化方法。本發(fā)明采用的方法是在操作系統(tǒng)啟動時,引導程序直接從存儲器上將原先保存的系統(tǒng)最小任務鏡像讀入內(nèi)存,并根據(jù)系統(tǒng)讀入的信息設置各種結(jié)構(gòu)的屬性和系統(tǒng)寄存器內(nèi)存的信息,將系統(tǒng)迅速恢復到工作狀態(tài),達到快速啟動的方法。本發(fā)明提出了一種操作系統(tǒng)鏡像啟動的啟動優(yōu)化方法,對原來操作系統(tǒng)啟動過程進行了改進,使得系統(tǒng)在啟動過程中更加快捷,能夠非??斓倪_到系統(tǒng)的工作狀態(tài)。
文檔編號G06F9/445GK1818869SQ20061004985
公開日2006年8月16日 申請日期2006年3月15日 優(yōu)先權(quán)日2006年3月15日
發(fā)明者陳天洲, 黃江偉, 梁曉, 錢杰, 吳心亮, 鄭臻偉 申請人:浙江大學