<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 嵌入式Linux系統中的快速啟動(dòng)技術(shù)研究

嵌入式Linux系統中的快速啟動(dòng)技術(shù)研究

作者: 時(shí)間:2008-06-13 來(lái)源:?jiǎn)纹瑱C與嵌入式系統應用 收藏

  系統主要特點(diǎn)在于使用Bootloader替代了桌面系統的BIOS,同時(shí)對系統進(jìn)行了規模上的裁剪,但硬件上的劣勢往往導致系統啟動(dòng)速度較慢,而產(chǎn)品使用者又對系統的開(kāi)機速度比較敏感,樣就產(chǎn)生了對于提高系統啟動(dòng)速度的需求。本文對系統啟動(dòng)時(shí)執行哪些階段的操作,以及縮短這些操作時(shí)間的方法進(jìn)行了探討。

本文引用地址:http://dyxdggzs.com/article/84199.htm

  1 嵌入式系統啟動(dòng)時(shí)序

  目前,嵌入式系統的硬件平臺和應用方向區別很大,但總體啟動(dòng)流程一致的。這里的系統啟動(dòng)是指從用戶(hù)執行上電/復位操作,到系統開(kāi)始提供用戶(hù)可接收的服務(wù)水平所需要的過(guò)程。典型的上電/復位時(shí)序如表1所列。

  表1 嵌入式Linux系統啟動(dòng)時(shí)序

  2 Linux方法

  目前,一些Linux的發(fā)行版本已經(jīng)對啟動(dòng)速度進(jìn)行了優(yōu)化。如果利用標準Linux進(jìn)行開(kāi)發(fā),則啟動(dòng)速度的提高主要是通過(guò)內核配置和各種補丁包來(lái)實(shí)現的。下面分析的一些關(guān)鍵技術(shù)。

 2.1 Firmware和Bootloader階段

  目標板一旦確定,Firmware運行的時(shí)間就無(wú)法改變了,Flash和RAM的讀寫(xiě)速度也就隨之確定了。但
如果復位時(shí)能夠繞過(guò)Firmware和Bootloader,即允許運行中的內核加載以及運行另一個(gè)內核,可以縮短啟動(dòng)的時(shí)間。典型的實(shí)現有Kexec,它有2個(gè)組件,即用戶(hù)空間組件kexectools和內核補丁。另外一種辦法是在內核命令行中加入reboot=soft數,同樣可以跳過(guò)Firmware,但是缺點(diǎn)在于無(wú)法從用戶(hù)空間調用。

  對于正常啟動(dòng),可以選擇速度比較快的Bootloader,并對內核進(jìn)行小型化處理;還可以使用高速的映像復制技術(shù)(如DMA2RAM),從而縮短復制的時(shí)間。為了縮短解壓消耗的時(shí)間,可尋求比較高效的壓縮算法。但一般情況下,壓縮比越高,算法越復雜,解壓速度就越慢,從而造成復制時(shí)間(與壓縮比成反比)和解壓時(shí)間(一般與壓縮比成正比)之間的矛盾。

  2.2 內核階段

  內核初始化時(shí)要對RealTime Clock (RTC)進(jìn)行同步。此過(guò)程要占用1s的時(shí)間,可去掉以節約時(shí)間,但這樣CPU會(huì )與正確的時(shí)間有1s的偏差,如果關(guān)機時(shí)CPU時(shí)鐘又要保存在RTC中,偏差就會(huì )不斷累積。但對于使用外部時(shí)鐘源進(jìn)行同步的系統,則可安全地跳過(guò)這個(gè)階段。

  Preset LPJ可以用來(lái)縮短每次啟動(dòng)時(shí)調用calibrate_delay()來(lái)校準loops_per_jiffy消耗的時(shí)間。這個(gè)時(shí)間開(kāi)銷(xiāo)與CPU頻率無(wú)關(guān),在典型的嵌入式硬件環(huán)境下會(huì )消耗300ms左右。LPJ值對于固定硬件平臺應該是一致的,可以只計算一次,在后續的啟動(dòng)中就可以在啟動(dòng)參數中強制指定LPJ值,而跳過(guò)實(shí)際的計算過(guò)程。具體方法是:在正常啟動(dòng)后記錄下內核啟動(dòng)信息中的"Calibrating Delay"數值,在啟動(dòng)參數中以"lpj=xxxxxx"的形式強制指定。

  啟動(dòng)過(guò)程默認打開(kāi)控制臺輸出啟動(dòng)消息,但是控制臺尤其是基于幀緩沖的控制臺會(huì )減慢啟動(dòng)速度。因此在嵌入式Linux產(chǎn)品中,將啟動(dòng)過(guò)程中的控制臺設為靜默狀態(tài),方法是在內核啟動(dòng)參數中加入"quiet"。

  設備搜索和驅動(dòng)安裝是比較耗時(shí)的操作,因此要在編譯內核時(shí)確定需要安裝哪些驅動(dòng)模塊,以免系統搜索那些根本不存在的設備,尤其是多余的IDE設備。對于啟動(dòng)時(shí)暫時(shí)不用安裝的設備,盡量將驅動(dòng)編譯成模塊,在以后空閑時(shí)或者使用設備時(shí)加載,而不是全部放在啟動(dòng)階段。

  2.3 用戶(hù)空間階段

  傳統Linux的初始化腳本是由bash執行的,在內核引導后啟動(dòng)init進(jìn)程(/sbin/init)。它使用一個(gè)ASCII文件(/etc/inittab)來(lái)改變運行級別,這個(gè)文件中又會(huì )調用RCSript,由RCSript查找/etc/rc.d/rc5.d/并啟動(dòng)相應鏈接指向的系統服務(wù)。

  消費電子類(lèi)Linux系統需要啟用圖形界面等必要的服務(wù),未經(jīng)優(yōu)化的系統在這個(gè)過(guò)程中會(huì )默認啟動(dòng)很多根本用不到或者當前用不到的系統服務(wù),這一部分會(huì )花去較大的時(shí)間開(kāi)銷(xiāo)。最簡(jiǎn)單的優(yōu)化辦法就是根據實(shí)際需要,通過(guò)改寫(xiě)服務(wù)配置文件定制系統服務(wù)。另外,init腳本的執行是串行的,在腳本量大時(shí)會(huì )導致引導過(guò)程非常,因此可以考慮并行運行各種服務(wù)以加快啟動(dòng)的速度?,F在已經(jīng)出現了一些初始化程序來(lái)替代init進(jìn)程,下面介紹initng和upstart。

  initng(init nextgerneration)能夠并行啟動(dòng)服務(wù)從而快速完成初始化工作。initng認為滿(mǎn)足了依賴(lài)關(guān)系的服務(wù)就可以啟動(dòng)。在從外存加載一個(gè)腳本或等待硬件設備啟動(dòng)的同時(shí),可以運行另一個(gè)腳本來(lái)啟動(dòng)別的服務(wù),使系統在CPU 和 I/O 之間實(shí)現較好的平衡。作為一個(gè)基于依賴(lài)關(guān)系的解決方案,initng使用自己的初始化腳本集,它們對服務(wù)和守護進(jìn)程的依賴(lài)性進(jìn)行了編碼。如果某個(gè)服務(wù)依賴(lài)(使用 need關(guān)鍵字定義)于其他服務(wù),則要保證啟動(dòng)時(shí)它所依賴(lài)的所有服務(wù)均可用。無(wú)依賴(lài)關(guān)系的服務(wù)立即并行啟動(dòng),具有依賴(lài)關(guān)系的服務(wù)則要等待以安全啟動(dòng)。

  upstart與 initng的區別在于: upstart基于事件,任務(wù)/服務(wù)的啟動(dòng)/停止都取決于它所等待的事件是否發(fā)生。upstart對事件的定義非常靈活,分為3類(lèi):edge (simple) events, level (value) events和temporal events。使用start/stop、事件名以及它所期待的值(可選)組成條目對觸發(fā)事件進(jìn)行描述。事件依賴(lài)有兩種辦法:一種是任務(wù)自身導致事件發(fā)生,不管任務(wù)何時(shí)啟動(dòng)/結束都會(huì )有事件發(fā)生,對于啟動(dòng)時(shí)要執行的基本任務(wù),這種辦法比較有效;而對于較復雜的依賴(lài)關(guān)系,則可使用任務(wù)的Shell腳本工具。

  2.4 預讀取和預鏈接

  預讀取(Readahead)可以將文件(程序和庫文件)在使用之前預先加載到RAM緩存中,這樣就不用在使用時(shí)為讀取這個(gè)文件而訪(fǎng)問(wèn)I/O。如果知道下一步操作要訪(fǎng)問(wèn)哪些文件,就可以提前將它們全部
/部分讀取到緩沖區,從而加快執行速度。嵌入式系統很多場(chǎng)合下對于下一步操作都是可預測的,比如系統啟動(dòng)時(shí)總是以同樣的順序訪(fǎng)問(wèn)同樣的可執行/數據文件,文件塊的訪(fǎng)問(wèn)往往是順序的,應用程序啟動(dòng)時(shí)總是訪(fǎng)問(wèn)同樣的程序文件段、共享庫、資源或者輸入文件。這樣使用預讀取有很強的針對性,從而提高程序執行速度。

  ELF(Excutable and Linkable File)是目前Linux中的標準二進(jìn)制格式,其啟動(dòng)需要以下步驟:將共享庫映射到虛擬地址空間;解析符號引用;初始化每個(gè)ELF文件。由于共享庫是位置無(wú)關(guān)的,要在運行時(shí)完成部分重定位處理和符號查找的工作,才能跳到程序的入口點(diǎn),因此在帶來(lái)靈活性的同時(shí),也造成ELF文件的啟動(dòng)速度緩慢,尤其是解析符號引用要消耗大量的時(shí)間,對于使用多個(gè)共享庫的大型程序更是如此。但在很多嵌入式系統中,可執行文件和共享庫極少變化,而且每次程序運行時(shí)鏈接工作完全相同。


linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: 嵌入式 Linux 快速啟動(dòng) XIP

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>