久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > 嵌(qian)入式系(xi)統移植步驟

嵌(qian)入式系(xi)統移植(zhi)步驟 時間:2018-01-25      來源:未(wei)知

在(zai)嵌入(ru)(ru)(ru)式系(xi)(xi)統(tong)(tong)(tong)移(yi)(yi)植(zhi)中重(zhong)要的(de)(de)一(yi)部分是(shi)(shi)操(cao)(cao)作(zuo)系(xi)(xi)統(tong)(tong)(tong)的(de)(de)移(yi)(yi)植(zhi),與其它操(cao)(cao)作(zuo)系(xi)(xi)統(tong)(tong)(tong)相比,Linux大的(de)(de)特(te)點:它是(shi)(shi)一(yi)款(kuan)遵(zun)循GPL的(de)(de)操(cao)(cao)作(zuo)系(xi)(xi)統(tong)(tong)(tong),我們(men)可(ke)以自由地(di)使用(yong)、修改、和擴展它。正是(shi)(shi)由于(yu)這一(yi)特(te)色,嵌入(ru)(ru)(ru)式系(xi)(xi)統(tong)(tong)(tong)移(yi)(yi)植(zhi)過程中Linux系(xi)(xi)統(tong)(tong)(tong)受到越來(lai)越多人(ren)士(shi)的(de)(de)青睞。于(yu)是(shi)(shi),一(yi)個經常會被探討(tao)的(de)(de)問題出現了,即關于(yu)Linux系(xi)(xi)統(tong)(tong)(tong)的(de)(de)移(yi)(yi)植(zhi)。對于(yu)操(cao)(cao)作(zuo)系(xi)(xi)統(tong)(tong)(tong)而言,這種移(yi)(yi)植(zhi)通常是(shi)(shi)跨平臺的(de)(de)、與硬件相關的(de)(de),即硬件系(xi)(xi)統(tong)(tong)(tong)結構、甚至CPU不同(tong)。下面就讓我們(men)來(lai)看(kan)看(kan)在(zai)嵌入(ru)(ru)(ru)式Linux系(xi)(xi)統(tong)(tong)(tong)移(yi)(yi)植(zhi)方面,我們(men)都需要做些(xie)什么(me)。

一、Linux系統移植的兩大部分

對于系(xi)統(tong)移植而言,Linux系(xi)統(tong)實(shi)際上(shang)由(you)兩個(ge)比較獨立的部分組成,即內(nei)(nei)核(he)(he)(he)部分和系(xi)統(tong)部分。通常啟動一(yi)個(ge)Linux系(xi)統(tong)的過程(cheng)(cheng)(cheng)是(shi)這(zhe)樣的:一(yi)個(ge)不(bu)隸屬(shu)于任(ren)何操作系(xi)統(tong)的加(jia)載(zai)(zai)程(cheng)(cheng)(cheng)序將(jiang)Linux部分內(nei)(nei)核(he)(he)(he)調入(ru)內(nei)(nei)存(cun),并(bing)將(jiang)控制權交給內(nei)(nei)存(cun)中Linux內(nei)(nei)核(he)(he)(he)的第一(yi)行代(dai)碼。加(jia)載(zai)(zai)程(cheng)(cheng)(cheng)序的工作就(jiu)完了,此(ci)后Linux要將(jiang)自己的剩(sheng)余部分全部加(jia)載(zai)(zai)到(dao)內(nei)(nei)存(cun)(如果有(you)的話,視硬件(jian)平臺的不(bu)同而不(bu)同),初始(shi)化所(suo)有(you)的設備(bei),在內(nei)(nei)存(cun)中建立好所(suo)需的數據(ju)結構(有(you)關進程(cheng)(cheng)(cheng)、設備(bei)、內(nei)(nei)存(cun)等)。到(dao)此(ci)為止Linux內(nei)(nei)核(he)(he)(he)的工作告一(yi)段落,內(nei)(nei)核(he)(he)(he)已經控制了所(suo)有(you)硬件(jian)設備(bei)。至(zhi)于操作和使(shi)用(yong)這(zhe)些(xie)硬件(jian)設備(bei),則輪(lun)到(dao)系(xi)統(tong)部分上(shang)場了。內(nei)(nei)核(he)(he)(he)加(jia)載(zai)(zai)根設備(bei)并(bing)啟動init守護(hu)進程(cheng)(cheng)(cheng),init守護(hu)進程(cheng)(cheng)(cheng)會根據(ju)配(pei)置(zhi)文件(jian)加(jia)載(zai)(zai)文件(jian)系(xi)統(tong)、配(pei)置(zhi)網(wang)絡(luo)、服務進程(cheng)(cheng)(cheng)、終(zhong)(zhong)端(duan)等。一(yi)旦終(zhong)(zhong)端(duan)初始(shi)化完畢,我們就(jiu)會看(kan)到(dao)系(xi)統(tong)的歡(huan)迎界面了。小結一(yi)下:

(1)內(nei)核部分(fen)初(chu)始化(hua)和控制(zhi)所(suo)(suo)有硬件設(she)備(bei)(嚴格說不(bu)是(shi)所(suo)(suo)有,而是(shi)絕大部分(fen)),為(wei)內(nei)存(cun)管理(li)、進程管理(li)、設(she)備(bei)讀寫等工作做(zuo)好一切準備(bei)。

(2)系統部分加載必需的設備,配置各種環(huan)境以(yi)便用(yong)(yong)戶可以(yi)使用(yong)(yong)整個系統。

二、系統移植所必需的環境

在進一步敘述(shu)之前,我們有必要提(ti)一下做(zuo)系(xi)統移植所必需的環境。

首先,需要一(yi)(yi)個新版(ban)本的gcc。對于一(yi)(yi)個準備系統(tong)移(yi)植的程(cheng)序員而(er)言,“新”到什(shen)么程(cheng)度(du)應該心里有(you)數。做(zuo)跨(kua)平(ping)臺(tai)(tai)編譯,gcc也(ye)許是好的選擇。另外,Linux內核依賴許多gcc特有(you)的特性,非它不可。如果你(ni)(ni)已(yi)經會使用(yong)gcc并實地操練(lian)過多回,那(nei)你(ni)(ni)只需要再進一(yi)(yi)步鞏固一(yi)(yi)下跨(kua)平(ping)臺(tai)(tai)編譯的操作即(ji)可。兩(liang)種編譯環(huan)境(jing)是可用(yong)的:非目標(biao)平(ping)臺(tai)(tai)上的Linux或目標(biao)平(ping)臺(tai)(tai)上的非Linux系統(tong),除非你(ni)(ni)的開發平(ping)臺(tai)(tai)過于特殊,否則你(ni)(ni)一(yi)(yi)定能(neng)夠找到你(ni)(ni)能(neng)用(yong)的gcc。

其(qi)次,編譯鏈(lian)接(jie)(jie)(jie)庫是(shi)必需的(de)(de)(de)(de),而且必須是(shi)目標平(ping)臺的(de)(de)(de)(de)編譯鏈(lian)接(jie)(jie)(jie)庫。通常這是(shi)一(yi)個(ge)枯燥、繁瑣(suo)、又絲毫(hao)沒有成(cheng)就感的(de)(de)(de)(de)過程。幸運的(de)(de)(de)(de)話,會(hui)有現成(cheng)的(de)(de)(de)(de)鏈(lian)接(jie)(jie)(jie)庫可以(yi)用。否則,你需要自己用gcc建(jian)立它(ta)。

后,需要目標(biao)平臺的(de)(de)所有文檔(dang),越多越好。如果有一定的(de)(de)開發支持/仿(fang)真環(huan)境,Loader(加載程(cheng)序)則好,這些可(ke)以幫助你減少(shao)移植過程(cheng)中浪費(fei)在瑣事上的(de)(de)時間。

三、Linux系統移植

接下來我(wo)們從(cong)內(nei)核和系統兩個(ge)方(fang)面描述一下移植中(zhong)的關(guan)鍵。

(1) 內核移植

Linux系(xi)統(tong)采用(yong)(yong)(yong)了(le)(le)相(xiang)對來說(shuo)并不(bu)是很靈活的(de)單一(yi)(yi)內(nei)核機制(zhi)(zhi),但(dan)這(zhe)絲毫沒有(you)影響Linux系(xi)統(tong)的(de)平臺無(wu)關(guan)(guan)性和可擴(kuo)展性。Linux使用(yong)(yong)(yong)了(le)(le)兩種途徑(jing)分(fen)別解決這(zhe)些問(wen)題,很干凈利落,絲毫不(bu)拖泥帶水,而且(qie)十分(fen)清晰易懂(dong)。分(fen)離硬件(jian)相(xiang)關(guan)(guan)代(dai)碼和硬件(jian)無(wu)關(guan)(guan)代(dai)碼,使上層(ceng)代(dai)碼永遠不(bu)必關(guan)(guan)心低層(ceng)換用(yong)(yong)(yong)了(le)(le)什(shen)么(me)代(dai)碼,如何完成了(le)(le)操作(zuo)。不(bu)論(lun)對x86上還是在(zai)Alpha平臺上分(fen)配一(yi)(yi)塊內(nei)存(cun),對上層(ceng)代(dai)碼而言沒什(shen)么(me)不(bu)同。硬件(jian)相(xiang)關(guan)(guan)部分(fen)的(de)代(dai)碼不(bu)多,占總代(dai)碼量的(de)很少一(yi)(yi)部分(fen)。所(suo)以對更換硬件(jian)平臺來說(shuo),沒有(you)什(shen)么(me)真(zhen)正的(de)負擔。另一(yi)(yi)方面,Linux使用(yong)(yong)(yong)內(nei)核機制(zhi)(zhi)很好地(di)解決了(le)(le)擴(kuo)展的(de)問(wen)題,一(yi)(yi)堆代(dai)碼可以在(zai)需(xu)要(yao)的(de)時(shi)候(hou)輕(qing)松(song)地(di)加(jia)載或卸下,象隨身聽,需(xu)要(yao)的(de)時(shi)候(hou)帶上,不(bu)需(xu)要(yao)時(shi)則鎖在(zai)抽屜里。

Linux內核可以(yi)視(shi)為由五個功能部分(fen)(fen)組成:進(jin)程(cheng)(cheng)管(guan)理(li)(li)(li)(包(bao)括調度(du)(du)和通(tong)信)、內存管(guan)理(li)(li)(li)、設備管(guan)理(li)(li)(li)、虛擬文件(jian)(jian)系統、網絡。它們之間有(you)著復雜的(de)(de)調用(yong)關(guan)系,但幸運的(de)(de)是,在(zai)移植中不(bu)會觸及到(dao)太多(duo),因(yin)為Linux內核良好(hao)的(de)(de)分(fen)(fen)層結構將硬(ying)件(jian)(jian)相(xiang)(xiang)關(guan)的(de)(de)代(dai)碼獨(du)立出(chu)來(lai)。何(he)謂(wei)硬(ying)件(jian)(jian)相(xiang)(xiang)關(guan),何(he)謂(wei)無關(guan)?以(yi)進(jin)程(cheng)(cheng)管(guan)理(li)(li)(li)為例(li),對進(jin)程(cheng)(cheng)的(de)(de)時間片輪轉調度(du)(du)算法在(zai)所(suo)(suo)有(you)平(ping)(ping)臺(tai)的(de)(de)Linux中都是一樣的(de)(de),它是與(yu)平(ping)(ping)臺(tai)無關(guan)的(de)(de);而用(yong)來(lai)在(zai)進(jin)程(cheng)(cheng)中切換的(de)(de)實現在(zai)不(bu)同的(de)(de)CPU上是不(bu)同的(de)(de),因(yin)此(ci)需要(yao)針(zhen)對該平(ping)(ping)臺(tai)編寫(xie)代(dai)碼,這就是平(ping)(ping)臺(tai)相(xiang)(xiang)關(guan)的(de)(de)。上面所(suo)(suo)講的(de)(de)五個部分(fen)(fen)的(de)(de)順序(xu)不(bu)是隨(sui)便排的(de)(de),從前到(dao)后(hou)分(fen)(fen)別代(dai)表著它們與(yu)硬(ying)件(jian)(jian)設備的(de)(de)相(xiang)(xiang)關(guan)程(cheng)(cheng)度(du)(du)。越(yue)靠前越(yue)高,后(hou)面的(de)(de)兩個虛擬文件(jian)(jian)系統和網絡則幾乎與(yu)平(ping)(ping)臺(tai)無關(guan),它們由設備管(guan)理(li)(li)(li)中所(suo)(suo)支持的(de)(de)驅動程(cheng)(cheng)序(xu)提供底層支持。因(yin)此(ci),在(zai)做系統移植的(de)(de)時候,需要(yao)改(gai)動的(de)(de)就是進(jin)程(cheng)(cheng)管(guan)理(li)(li)(li)、內存管(guan)理(li)(li)(li)和設備管(guan)理(li)(li)(li)中被獨(du)立出(chu)來(lai)的(de)(de)那部分(fen)(fen)即硬(ying)件(jian)(jian)相(xiang)(xiang)關(guan)部分(fen)(fen)的(de)(de)代(dai)碼。在(zai)Linux代(dai)碼樹下,這部分(fen)(fen)代(dai)碼全部在(zai)arch目錄下。

如果你的(de)(de)目(mu)(mu)標(biao)(biao)平(ping)(ping)臺已(yi)經(jing)被Linux核心所支(zhi)持(chi)的(de)(de)話,那么你是(shi)幸運(yun)的(de)(de),因(yin)為已(yi)經(jing)沒(mei)有太多(duo)的(de)(de)工(gong)作(zuo)(zuo)讓你去(qu)做(zuo)。只要(yao)(yao)(yao)(yao)你的(de)(de)交叉編譯(yi)環境是(shi)正確的(de)(de),你只需(xu)要(yao)(yao)(yao)(yao)簡單的(de)(de)配置、編譯(yi)就可以得(de)到(dao)目(mu)(mu)標(biao)(biao)代(dai)(dai)(dai)(dai)(dai)(dai)碼。否則,需(xu)要(yao)(yao)(yao)(yao)你去(qu)編寫(xie),或修改一些代(dai)(dai)(dai)(dai)(dai)(dai)碼。只需(xu)修改平(ping)(ping)臺相關(guan)部分(fen)(fen)的(de)(de)代(dai)(dai)(dai)(dai)(dai)(dai)碼即可。但需(xu)要(yao)(yao)(yao)(yao)對目(mu)(mu)標(biao)(biao)平(ping)(ping)臺,主要(yao)(yao)(yao)(yao)是(shi)對CPU的(de)(de)透(tou)徹理解。在Linux的(de)(de)代(dai)(dai)(dai)(dai)(dai)(dai)碼樹下,可以看到(dao),這(zhe)部分(fen)(fen)的(de)(de)典型(xing)代(dai)(dai)(dai)(dai)(dai)(dai)碼量為:2萬行(xing)左(zuo)右(you)C代(dai)(dai)(dai)(dai)(dai)(dai)碼和(he)2千行(xing)左(zuo)右(you)的(de)(de)匯編(C代(dai)(dai)(dai)(dai)(dai)(dai)碼中通常包含(han)許多(duo)偽匯編指令,因(yin)此實際上(shang)純C代(dai)(dai)(dai)(dai)(dai)(dai)碼要(yao)(yao)(yao)(yao)少(shao)很多(duo)),這(zhe)部分(fen)(fen)工(gong)作(zuo)(zuo)量是(shi)不可小(xiao)看的(de)(de)。它包含(han)了對絕(jue)大(da)多(duo)數硬件的(de)(de)底層(ceng)操作(zuo)(zuo),涉(she)及IRQ、內存(cun)頁表、快表、浮(fu)點(dian)處(chu)理、時(shi)鐘(zhong)、多(duo)處(chu)理器(qi)同(tong)步等問(wen)題,頻繁的(de)(de)端口編程意味(wei)著需(xu)要(yao)(yao)(yao)(yao)你將目(mu)(mu)標(biao)(biao)平(ping)(ping)臺的(de)(de)文檔用C語言重(zhong)寫(xie)一遍。這(zhe)就是(shi)為什(shen)么說目(mu)(mu)標(biao)(biao)平(ping)(ping)臺的(de)(de)文檔極其重(zhong)要(yao)(yao)(yao)(yao)。

代碼量大的(de)(de)部(bu)分是(shi)被核(he)心直接(jie)調用(yong)的(de)(de)底層支持部(bu)分,這部(bu)分代碼在arch/xxx/kernel下(xia)(xxx是(shi)平(ping)臺名(ming)稱(cheng))。這些代碼重寫(xie)了內核(he)所需調用(yong)的(de)(de)所有函數(shu)。因為接(jie)口函數(shu)是(shi)固定的(de)(de),所以這里更(geng)象是(shi)為硬件平(ping)臺編寫(xie)API。不同(tong)的(de)(de)系(xi)統平(ping)臺,主要有以下(xia)幾方(fang)面的(de)(de)不同(tong):

* 進程管(guan)理底(di)層代(dai)碼(ma):從硬件系統(tong)的(de)角度(du)來(lai)看,進程管(guan)理就(jiu)是(shi)CPU的(de)管(guan)理。在不(bu)(bu)同的(de)硬件平臺(tai)上,這(zhe)有很大(da)的(de)不(bu)(bu)同。CPU中用的(de)寄存(cun)(cun)器結構不(bu)(bu)同,上下(xia)文切換(huan)的(de)方式、現場的(de)保(bao)存(cun)(cun)和(he)恢復、棧(zhan)的(de)處理都不(bu)(bu)同,這(zhe)些內容主要(yao)由CPU開(kai)發手冊(ce)所描述(shu)。通常來(lai)說,CPU的(de)所有功(gong)能和(he)狀態對(dui)于Linux不(bu)(bu)一定有意(yi)義。實現時,需要(yao)在小的(de)開(kai)發代(dai)價和(he)好的(de)系統(tong)性能之間加以(yi)權(quan)衡。

* BIOS接口代(dai)碼:這(zhe)一(yi)名稱(cheng)似乎并不太(tai)準(zhun)確(que),因為它(ta)沿(yan)用(yong)了(le)PC一(yi)貫的叫(jiao)法(fa)。但在不致引起混(hun)淆的情(qing)況下我們還是這(zhe)么叫(jiao)它(ta)。在通用(yong)平臺上(shang)(shang),通常有基本輸(shu)(shu)(shu)入(ru)輸(shu)(shu)(shu)出系(xi)(xi)統供操作系(xi)(xi)統使用(yong),在PC上(shang)(shang)是BIOS,在SPARC上(shang)(shang)是PROM,在很多非通用(yong)系(xi)(xi)統上(shang)(shang)甚至并沒有這(zhe)樣的東西。多數(shu)情(qing)況下,Linux不依賴(lai)基本輸(shu)(shu)(shu)入(ru)輸(shu)(shu)(shu)出系(xi)(xi)統,但在某(mou)些系(xi)(xi)統里,Linux需要通過基本輸(shu)(shu)(shu)入(ru)輸(shu)(shu)(shu)出系(xi)(xi)統中(zhong)得(de)到重(zhong)要的設備(bei)參數(shu)。移植中(zhong),這(zhe)部分代(dai)碼通常需要完全(quan)改寫。

* 時鐘、中(zhong)斷等(deng)板上(shang)設(she)備支持代(dai)(dai)碼(ma):即(ji)使在同(tong)(tong)一(yi)(yi)種(zhong)CPU的平(ping)(ping)臺(tai)上(shang),也會存在不(bu)(bu)(bu)同(tong)(tong)的板上(shang)外設(she),異種(zhong)CPU平(ping)(ping)臺(tai)上(shang)更是如此。不(bu)(bu)(bu)同(tong)(tong)的系(xi)統組(zu)態需要(yao)不(bu)(bu)(bu)同(tong)(tong)的初始化代(dai)(dai)碼(ma)。很典型的例子就是MIPS平(ping)(ping)臺(tai),看(kan)(kan)看(kan)(kan)arc/mips/的代(dai)(dai)碼(ma),與其它(ta)(ta)系(xi)統比較(jiao)一(yi)(yi)下就知道。因為(wei)(wei)MIPS平(ping)(ping)臺(tai)被(bei)OEM得廣(guang),在嵌入式(shi)領域應用多(duo)(相對其它(ta)(ta)幾種(zhong)CPU而(er)言)。甚至同(tong)(tong)一(yi)(yi)種(zhong)MIPS芯(xin)片(pian)被(bei)不(bu)(bu)(bu)同(tong)(tong)廠家(jia)封裝再配上(shang)不(bu)(bu)(bu)同(tong)(tong)的芯(xin)片(pian)組(zu)。因此要(yao)為(wei)(wei)這(zhe)些(xie)不(bu)(bu)(bu)同(tong)(tong)的MIPS平(ping)(ping)臺(tai)分別編寫不(bu)(bu)(bu)同(tong)(tong)的代(dai)(dai)碼(ma)。

* 特殊結構(gou)代碼(ma):如多處理(li)(li)器支持(chi)等(deng)。其實(shi)每一種(zhong)CPU都(dou)是(shi)十分特殊的(de)(de),熟悉x86平臺的(de)(de)人都(dou)知道x86系列CPU著名的(de)(de)實(shi)模式與虛(xu)模式的(de)(de)區別,而在SPARC平臺上根本就(jiu)沒(mei)有這(zhe)個概念。這(zhe)就(jiu)導致了(le)很大(da)的(de)(de)不同:PC機(ji)上的(de)(de)Linux在獲(huo)得控制權后不久就(jiu)開(kai)始切換到虛(xu)模式,SPARC機(ji)器上則(ze)沒(mei)有這(zhe)段代碼(ma)。又如電(dian)源管理(li)(li)的(de)(de)支持(chi)更是(shi)多種(zhong)多樣,不同的(de)(de)CPU有著不同的(de)(de)實(shi)現方(fang)式(特殊的(de)(de)電(dian)源管理(li)(li)方(fang)式甚至被廠商標榜(bang))。在這(zhe)種(zhong)情況(kuang)下(xia),除非放棄對電(dian)源管理(li)(li)的(de)(de)支持(chi),否則(ze)必須重寫代碼(ma)。

還有(you)(you)(you)一(yi)部分代(dai)(dai)碼(ma)量不(bu)多,但不(bu)能(neng)忽視的(de)(de)(de)(de)(de)部分是(shi)(shi)(shi)在(zai)arch/xxx/mm/下(xia)的(de)(de)(de)(de)(de)內(nei)(nei)存(cun)(cun)(cun)管理(li)部分。所有(you)(you)(you)與(yu)(yu)平(ping)臺(tai)相(xiang)(xiang)關(guan)的(de)(de)(de)(de)(de)內(nei)(nei)存(cun)(cun)(cun)管理(li)代(dai)(dai)碼(ma)全部在(zai)這里。這部分代(dai)(dai)碼(ma)完成內(nei)(nei)存(cun)(cun)(cun)的(de)(de)(de)(de)(de)初始化(hua)和各種與(yu)(yu)內(nei)(nei)存(cun)(cun)(cun)管理(li)相(xiang)(xiang)關(guan)的(de)(de)(de)(de)(de)數(shu)(shu)據結構的(de)(de)(de)(de)(de)建立。Linux使(shi)用(yong)了(le)基于頁(ye)式管理(li)的(de)(de)(de)(de)(de)虛擬存(cun)(cun)(cun)儲技術,而CPU發展(zhan)的(de)(de)(de)(de)(de)趨勢是(shi)(shi)(shi):為了(le)提高性(xing)(xing)(xing)能(neng),實現(xian)(xian)內(nei)(nei)存(cun)(cun)(cun)管理(li)的(de)(de)(de)(de)(de)功(gong)能(neng)單元(yuan)統(tong)統(tong)被(bei)集成到CPU中。因(yin)此內(nei)(nei)存(cun)(cun)(cun)管理(li)成為一(yi)個(ge)與(yu)(yu)CPU十分相(xiang)(xiang)關(guan)的(de)(de)(de)(de)(de)工作。同(tong)時內(nei)(nei)存(cun)(cun)(cun)管理(li)的(de)(de)(de)(de)(de)效率也是(shi)(shi)(shi)影響系統(tong)性(xing)(xing)(xing)能(neng)的(de)(de)(de)(de)(de)因(yin)素之一(yi)。內(nei)(nei)存(cun)(cun)(cun)可(ke)(ke)以(yi)說是(shi)(shi)(shi)計算機系統(tong)中頻(pin)繁訪(fang)(fang)問(wen)的(de)(de)(de)(de)(de)設備,如果(guo)每次內(nei)(nei)存(cun)(cun)(cun)訪(fang)(fang)問(wen)時多占用(yong)一(yi)個(ge)時鐘(zhong)周期,那就有(you)(you)(you)可(ke)(ke)能(neng)將系統(tong)性(xing)(xing)(xing)能(neng)降(jiang)低到不(bu)可(ke)(ke)忍(ren)受。在(zai)Linux系統(tong)里,不(bu)同(tong)平(ping)臺(tai)上(shang)的(de)(de)(de)(de)(de)內(nei)(nei)存(cun)(cun)(cun)管理(li)代(dai)(dai)碼(ma)的(de)(de)(de)(de)(de)差(cha)異(yi)(yi)程度是(shi)(shi)(shi)令(ling)人吃(chi)驚的(de)(de)(de)(de)(de),可(ke)(ke)以(yi)說是(shi)(shi)(shi)差(cha)異(yi)(yi)大的(de)(de)(de)(de)(de)。不(bu)同(tong)的(de)(de)(de)(de)(de)CPU有(you)(you)(you)不(bu)同(tong)的(de)(de)(de)(de)(de)內(nei)(nei)存(cun)(cun)(cun)管理(li)方式,同(tong)一(yi)種CPU還會有(you)(you)(you)不(bu)同(tong)的(de)(de)(de)(de)(de)內(nei)(nei)存(cun)(cun)(cun)管理(li)模式。Linux是(shi)(shi)(shi)從32位(wei)硬件平(ping)臺(tai)上(shang)發展(zhan)起來的(de)(de)(de)(de)(de)操作系統(tong),但是(shi)(shi)(shi)現(xian)(xian)在(zai)已經有(you)(you)(you)數(shu)(shu)種64位(wei)平(ping)臺(tai)出現(xian)(xian)。在(zai)64位(wei)平(ping)臺(tai)上(shang),可(ke)(ke)用(yong)內(nei)(nei)存(cun)(cun)(cun)范圍增大到原(yuan)來的(de)(de)(de)(de)(de)232倍,其間差(cha)異(yi)(yi)可(ke)(ke)略窺(kui)一(yi)斑了(le)。鑒于這部分代(dai)(dai)碼(ma)的(de)(de)(de)(de)(de)重要性(xing)(xing)(xing)和復雜性(xing)(xing)(xing),移植工作在(zai)這里變得(de)相(xiang)(xiang)當謹慎。有(you)(you)(you)些平(ping)臺(tai)上(shang)甚(shen)至只(zhi)是(shi)(shi)(shi)用(yong)保守的(de)(de)(de)(de)(de)內(nei)(nei)存(cun)(cun)(cun)管理(li)模式。如在(zai)SPARC平(ping)臺(tai)上(shang)的(de)(de)(de)(de)(de)頁(ye)面大小可(ke)(ke)以(yi)是(shi)(shi)(shi)多種尺寸,為了(le)簡單和可(ke)(ke)靠起見,SPARC版(ban)的(de)(de)(de)(de)(de)Linux只(zhi)是(shi)(shi)(shi)用(yong)了(le)8K頁(ye)面這一(yi)種模式。這一(yi)狀況(kuang)直到2.4版(ban)才得(de)以(yi)改(gai)善(shan)。

除(chu)了上面所講(jiang)的之外,還有一些代碼需(xu)要考慮,但相對來說次要一些。如浮(fu)點(dian)運算的支持。較完美的做法是(shi)對FPU編程,由硬件完成浮(fu)點(dian)運算。但在某些時(shi)候,浮(fu)點(dian)并不(bu)重要,甚至CPU根(gen)本(ben)就不(bu)支持浮(fu)點(dian)。這時(shi)候就可(ke)以根(gen)據需(xu)求來取舍。

對(dui)于(yu)內(nei)核移(yi)(yi)植的(de)討(tao)論(lun)到此為止。實際上,還(huan)有一些移(yi)(yi)植工作需要(yao)同時考慮,但很難說(shuo)這是(shi)屬(shu)于(yu)內(nei)核范疇還(huan)是(shi)屬(shu)于(yu)驅動(dong)(dong)程(cheng)序范疇,比如說(shuo)顯(xian)示設(she)備的(de)支(zhi)持,和內(nei)核十分相關,但在(zai)邏輯上又不屬(shu)于(yu)內(nei)核,并且在(zai)移(yi)(yi)植上也更(geng)像是(shi)驅動(dong)(dong)程(cheng)序的(de)開發。因此不在(zai)這里(li)討(tao)論(lun)。

(2)系統移植

當內核移(yi)(yi)植(zhi)(zhi)(zhi)(zhi)完(wan)(wan)畢后,可以說(shuo)所有的(de)(de)(de)移(yi)(yi)植(zhi)(zhi)(zhi)(zhi)工作就(jiu)已(yi)經完(wan)(wan)成(cheng)(cheng)大半了。就(jiu)是(shi)說(shuo),當內核在交叉編譯成(cheng)(cheng)功后,加載到目標(biao)平(ping)臺上正常(chang)啟動,并(bing)出現類似VFS: Can't mount root file system的(de)(de)(de)提示(shi)時,則(ze)表(biao)示(shi)可以開始系(xi)統(tong)移(yi)(yi)植(zhi)(zhi)(zhi)(zhi)方面的(de)(de)(de)工作了。系(xi)統(tong)移(yi)(yi)植(zhi)(zhi)(zhi)(zhi)實(shi)際上是(shi)一個(ge)(ge)小(xiao)系(xi)統(tong)的(de)(de)(de)重(zhong)建過(guo)(guo)程(cheng)。許多Linux愛(ai)好者有過(guo)(guo)建立Linux系(xi)統(tong)應急盤的(de)(de)(de)經驗,與其不同的(de)(de)(de)是(shi),你需(xu)要使用(yong)目標(biao)平(ping)臺上的(de)(de)(de)二進制代(dai)碼生成(cheng)(cheng)這個(ge)(ge)小(xiao)系(xi)統(tong)。包括:init、libc庫(ku)、驅動模塊、必(bi)需(xu)的(de)(de)(de)應用(yong)程(cheng)序和系(xi)統(tong)配(pei)置腳本(ben)。一旦這些(xie)工作完(wan)(wan)成(cheng)(cheng),移(yi)(yi)植(zhi)(zhi)(zhi)(zhi)工作就(jiu)進入聯調階段(duan)了。

一個比較容易的(de)(de)系(xi)統(tong)(tong)(tong)部(bu)分(fen)移植辦法(fa)是(shi):先著手建立開發平臺上的(de)(de)小(xiao)(xiao)系(xi)統(tong)(tong)(tong),保證(zheng)這套小(xiao)(xiao)系(xi)統(tong)(tong)(tong)在開發平臺上正確運行。這樣可以避免由(you)于小(xiao)(xiao)系(xi)統(tong)(tong)(tong)本(ben)身(shen)的(de)(de)邏(luo)輯錯誤而帶來的(de)(de)麻煩。由(you)于小(xiao)(xiao)系(xi)統(tong)(tong)(tong)中是(shi)多個應(ying)用程(cheng)序(xu)相互配合工作,有時出現(xian)的(de)(de)問題不在代碼(ma)本(ben)身(shen)而在系(xi)統(tong)(tong)(tong)的(de)(de)邏(luo)輯結(jie)構(gou)上。

Linux系統(tong)移植(zhi)工(gong)作(zuo)至少要(yao)包括上述的(de)(de)(de)(de)內(nei)容(rong),除(chu)此之外,有(you)一(yi)(yi)些(xie)看不(bu)見的(de)(de)(de)(de)開發工(gong)作(zuo)也(ye)是(shi)不(bu)可忽視的(de)(de)(de)(de),如(ru)某(mou)個特殊設備的(de)(de)(de)(de)驅動程(cheng)序,為調試內(nei)核而(er)做(zuo)的(de)(de)(de)(de)遠程(cheng)調試工(gong)作(zuo)等。另外,同樣的(de)(de)(de)(de)一(yi)(yi)次移植(zhi)工(gong)作(zuo),顯然符(fu)合小功能(neng)集的(de)(de)(de)(de)移植(zhi)和(he)完美移植(zhi)是(shi)不(bu)一(yi)(yi)樣的(de)(de)(de)(de);向(xiang)16位移植(zhi)和(he)向(xiang)64位移植(zhi)也(ye)是(shi)不(bu)一(yi)(yi)樣的(de)(de)(de)(de)。

在(zai)(zai)移植中通(tong)常會遇見的(de)(de)問題是試(shi)運(yun)行時(shi)鎖死或崩潰,在(zai)(zai)系(xi)統部分移植時(shi)要好(hao)(hao)(hao)辦些,因為(wei)可以(yi)容易地定位(wei)錯(cuo)誤根(gen)源,而在(zai)(zai)核心(xin)移植時(shi)確(que)實(shi)很(hen)讓人頭疼。雖然可以(yi)通(tong)過串口對(dui)運(yun)行著的(de)(de)內核進行調(diao)試(shi),但是在(zai)(zai)多任務(wu)情況(kuang)下,有(you)很(hen)多現象(xiang)是不可重(zhong)(zhong)現的(de)(de)。又如(ru),在(zai)(zai)初(chu)始(shi)化的(de)(de)開始(shi),很(hen)多設備還沒(mei)法(fa)確(que)定狀態,甚(shen)至串口還沒(mei)有(you)初(chu)始(shi)化。對(dui)于這種情況(kuang)沒(mei)有(you)什么很(hen)好(hao)(hao)(hao)的(de)(de)解(jie)決辦法(fa),好(hao)(hao)(hao)的(de)(de)開發/仿真(zhen)平臺很(hen)重(zhong)(zhong)要,另外要多增加反(fan)映系(xi)統運(yun)行狀態的(de)(de)調(diao)試(shi)代碼;再者(zhe)要吃透硬件(jian)(jian)平臺的(de)(de)文檔。硬件(jian)(jian)平臺廠(chang)商的(de)(de)專業支持(chi)也是很(hen)重(zhong)(zhong)要的(de)(de)。

還有一點很重要:Linux本身(shen)是(shi)基于GPL的(de)操作系(xi)統,移植時,可以(yi)充分發揮GPL的(de)優勢,讓(rang)更多的(de)愛好者(zhe)參與進來,向共(gong)同(tong)的(de)目標前進。

上一篇:數據結構 圖的概念及怎么實現

下一篇:數據結構哈希表怎么設計及實現

熱(re)點文章推薦
華清(qing)學員就(jiu)業榜單(dan)
高薪學(xue)員經(jing)驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽(qia)談專線:010-82525379 院校合作洽(qia)談(tan)專(zhuan)線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部