一種生成鏡像文件的方法及編譯器的制造方法
【專利摘要】本發(fā)明實(shí)施例公開(kāi)了一種生成鏡像文件的方法及編譯器。本發(fā)明實(shí)施例的方法包括:將多個(gè)目標(biāo)文件中的每個(gè)目標(biāo)文件進(jìn)行單獨(dú)編譯,得到多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件的體積,根據(jù)每個(gè)目標(biāo)文件的內(nèi)容在多個(gè)目標(biāo)文件中查找起始地址為0的第一目標(biāo)文件,根據(jù)多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件的體積和內(nèi)容,使用第一腳本在多個(gè)目標(biāo)文件的代碼中對(duì)多個(gè)目標(biāo)文件中每個(gè)剩余的目標(biāo)文件的起始地址的數(shù)據(jù)進(jìn)行修改,使用第二腳本將多個(gè)目標(biāo)文件合成一個(gè)鏡像文件,這樣在編譯時(shí),根據(jù)每個(gè)目標(biāo)文件的體積和內(nèi)容確定每個(gè)目標(biāo)文件在閃存中的起始地址,從而使得目標(biāo)文件之間沒(méi)有空閑的空間,使得生成的鏡像文件小,避免浪費(fèi)閃存的空間。
【專利說(shuō)明】一種生成鏡像文件的方法及編譯器
【技術(shù)領(lǐng)域】
[0001]本發(fā)明實(shí)施例涉及通信領(lǐng)域,尤其涉及一種生成鏡像文件的方法及編譯器。
【背景技術(shù)】
[0002]人們往往通過(guò)高級(jí)語(yǔ)言,如C語(yǔ)音,C++等進(jìn)行代碼的編寫(xiě),然后通過(guò)對(duì)編寫(xiě)的代碼進(jìn)行編譯生成鏡像文件。
[0003]現(xiàn)有技術(shù)中,引導(dǎo)裝載程序(bootloader) —般由多個(gè)目標(biāo)文件合并在一個(gè)閃存(norflash)中,但是在對(duì)每個(gè)目標(biāo)文件編譯時(shí),都會(huì)在norflash中分配固定且足夠大的空間,并不能保證每個(gè)目標(biāo)文件的體積與其對(duì)應(yīng)在norflash分配的空間大小相適應(yīng),這樣往往會(huì)導(dǎo)致norflash中大量的空間被浪費(fèi),而且編譯后生成的鏡像文件大。
【發(fā)明內(nèi)容】
[0004]本發(fā)明實(shí)施例提供了一種生成鏡像文件的方法及編譯器,能夠使得生成的鏡像文件小,避免浪費(fèi)norflash的空間。
[0005]本發(fā)明實(shí)施例提供的數(shù)據(jù)傳輸方法,包括:將多個(gè)目標(biāo)文件中的每個(gè)所述目標(biāo)文件進(jìn)行單獨(dú)編譯,得到多個(gè)所述目標(biāo)文件中每個(gè)所述目標(biāo)文件的體積,根據(jù)每個(gè)所述目標(biāo)文件的內(nèi)容在多個(gè)所述目標(biāo)文件中查找起始地址為O的第一目標(biāo)文件,根據(jù)多個(gè)所述目標(biāo)文件中每個(gè)所述目標(biāo)文件的體積和內(nèi)容,使用第一腳本在多個(gè)所述目標(biāo)文件的代碼中對(duì)多個(gè)所述目標(biāo)文件中每個(gè)剩余的所述目標(biāo)文件的起始地址的數(shù)據(jù)進(jìn)行修改,其中剩余的目標(biāo)文件為多個(gè)目標(biāo)文件中除了第一目標(biāo)文件的目標(biāo)文件,使用第二腳本將多個(gè)所述目標(biāo)文件合成一個(gè)鏡像文件。
[0006]本發(fā)明實(shí)施例提供的編譯器,包括:第一編譯單元將多個(gè)目標(biāo)文件中的每個(gè)目標(biāo)文件進(jìn)行單獨(dú)編譯,得到多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件的體積,查找單元根據(jù)每個(gè)目標(biāo)文件的內(nèi)容在多個(gè)目標(biāo)文件中查找起始地址為O的第一目標(biāo)文件,修改單元根據(jù)多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件的體積和內(nèi)容,使用第一腳本在多個(gè)目標(biāo)文件的代碼中對(duì)多個(gè)目標(biāo)文件中每個(gè)剩余的目標(biāo)文件的起始地址的數(shù)據(jù)進(jìn)行修改,其中剩余的目標(biāo)文件為多個(gè)目標(biāo)文件中除了第一目標(biāo)文件的目標(biāo)文件,第二編譯單元使用第二腳本將多個(gè)目標(biāo)文件合成一個(gè)鏡像文件。
[0007]從以上技術(shù)方案可以看出,本發(fā)明實(shí)施例具有以下優(yōu)點(diǎn):
[0008]將多個(gè)目標(biāo)文件中的每個(gè)目標(biāo)文件進(jìn)行單獨(dú)編譯,得到多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件的體積,根據(jù)每個(gè)目標(biāo)文件的內(nèi)容在多個(gè)目標(biāo)文件中查找起始地址為O的第一目標(biāo)文件,根據(jù)多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件的體積和內(nèi)容,使用第一腳本在多個(gè)目標(biāo)文件的代碼中對(duì)多個(gè)目標(biāo)文件中每個(gè)剩余的目標(biāo)文件的起始地址的數(shù)據(jù)進(jìn)行修改,其中剩余的目標(biāo)文件為多個(gè)目標(biāo)文件中除了第一目標(biāo)文件的目標(biāo)文件,使用第二腳本將多個(gè)目標(biāo)文件合成一個(gè)鏡像文件,這樣在編譯時(shí),根據(jù)每個(gè)目標(biāo)文件的體積和內(nèi)容確定每個(gè)目標(biāo)文件在閃存中的起始地址,從而使得目標(biāo)文件之間沒(méi)有空閑的空間,使得生成的鏡像文件小,避免浪費(fèi)norflash的空間。
【專利附圖】
【附圖說(shuō)明】
[0009]圖1為本發(fā)明實(shí)施例中生成鏡像文件一個(gè)實(shí)施例示意圖;
[0010]圖2為本發(fā)明實(shí)施例中生成鏡像文件另一實(shí)施例示意圖;
[0011]圖3為本發(fā)明實(shí)施例中燒寫(xiě)前閃存的空間的示意圖;
[0012]圖4為本發(fā)明實(shí)施例中燒與后閃存的空間的不意圖;
[0013]圖5為本發(fā)明實(shí)施例中編譯器一個(gè)實(shí)施例邏輯結(jié)構(gòu)參考圖;
[0014]圖6為本發(fā)明實(shí)施例中編譯器另一實(shí)施例的示意圖。
【具體實(shí)施方式】
[0015]本發(fā)明實(shí)施例提供了一種生成鏡像文件的方法及編譯器,能夠使得生成的鏡像文件小,避免浪費(fèi)norflash的空間。
[0016]請(qǐng)參閱圖1,本發(fā)明實(shí)施例中一種生成鏡像文件的方法的一個(gè)實(shí)施例包括:
[0017]101、將多個(gè)目標(biāo)文件中的每個(gè)目標(biāo)文件進(jìn)行單獨(dú)編譯,得到多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件的體積;
[0018]本實(shí)施例中,對(duì)多個(gè)目標(biāo)文件中的每一目標(biāo)文件均進(jìn)行單獨(dú)編譯,使用的編譯語(yǔ)言不做限定,可以為匯編語(yǔ)言,也可以為C語(yǔ)言,當(dāng)然本領(lǐng)域技術(shù)人員可以根據(jù)匯編語(yǔ)言及C語(yǔ)言所顯而易見(jiàn)其它編譯語(yǔ)言,然后通過(guò)編譯得到每一個(gè)目標(biāo)文件的體積,其中,目標(biāo)文件的體積實(shí)際為目標(biāo)文件的大小,例如,一個(gè)目標(biāo)文件的體積為IOKB。
[0019]102、根據(jù)每個(gè)目標(biāo)文件的內(nèi)容在多個(gè)目標(biāo)文件中查找起始地址為O的第一目標(biāo)文件;
[0020]本實(shí)施例中,目標(biāo)文件的內(nèi)容決定在norflash中的先后順序,根據(jù)每個(gè)目標(biāo)文件的內(nèi)容在多個(gè)目標(biāo)文件中查找起始地址為O的第一目標(biāo)文件,例如,bootstrap文件中包括系統(tǒng)初始化的數(shù)據(jù),所以bootstrap文件的起始地址為O,在實(shí)際應(yīng)用中,程序在啟動(dòng)時(shí),均是從O地址開(kāi)始啟動(dòng),起始地址為O的數(shù)據(jù)無(wú)需存儲(chǔ)在目標(biāo)文件的代碼中。
[0021]需要說(shuō)明的是,第一目標(biāo)文件為一個(gè)目標(biāo)文件。
[0022]103、根據(jù)多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件的體積和內(nèi)容,使用第一腳本在多個(gè)目標(biāo)文件的代碼中對(duì)多個(gè)目標(biāo)文件中每個(gè)剩余的目標(biāo)文件的起始地址的數(shù)據(jù)進(jìn)行修改;
[0023]本實(shí)施例中,剩余的目標(biāo)文件為多個(gè)目標(biāo)文件中除了第一目標(biāo)文件的目標(biāo)文件,例如,共有四個(gè)目標(biāo)文件,目標(biāo)文件A、目標(biāo)文件B、目標(biāo)文件C和目標(biāo)文件D,若在步驟102中查找到目標(biāo)文件A的起始地址為0,則剩余的目標(biāo)文件為目標(biāo)文件B、目標(biāo)文件C和目標(biāo)文件D,然后,使用第一腳本在多個(gè)目標(biāo)文件的代碼中對(duì)多個(gè)目標(biāo)文件中每個(gè)剩余的目標(biāo)文件的起始地址的數(shù)據(jù)進(jìn)行修改,腳本的選用為現(xiàn)有技術(shù),此處不做贅述,在現(xiàn)有技術(shù)中,由于第一目標(biāo)文件(即,起始地址為O的目標(biāo)文件)的起始地址的數(shù)據(jù)不存儲(chǔ)在目標(biāo)文件之外,剩余的目標(biāo)文件的起始地址的數(shù)據(jù)均對(duì)應(yīng)存儲(chǔ)在目標(biāo)文件的代碼中,例如,bootloader的四個(gè)目標(biāo)文件,在閃存中從地址O開(kāi)始依次為目標(biāo)文件A、目標(biāo)文件B、目標(biāo)文件C和目標(biāo)文件D,目標(biāo)文件A的起始地址為0,目標(biāo)文件A的代碼中包括目標(biāo)文件B的起始地址的數(shù)據(jù),目標(biāo)文件B的代碼中包括目標(biāo)文件C和目標(biāo)文件D的起始地址的數(shù)據(jù),此處起始地址對(duì)應(yīng)在哪個(gè)目標(biāo)文件的代碼中為現(xiàn)有技術(shù),此處不做贅述。
[0024]104、使用第二腳本將多個(gè)目標(biāo)文件合成一個(gè)鏡像文件。
[0025]本實(shí)施例中,當(dāng)在步驟103中修改完起始地址的數(shù)據(jù)之后,使用第二腳本將多個(gè)目標(biāo)文件合成一個(gè)鏡像文件,此處如何使用第二腳本將多個(gè)目標(biāo)文件合成一個(gè)鏡像文件為現(xiàn)有技術(shù),此處不做贅述。
[0026]本實(shí)施例中,將多個(gè)目標(biāo)文件中的每個(gè)目標(biāo)文件進(jìn)行單獨(dú)編譯,得到多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件的體積,根據(jù)每個(gè)目標(biāo)文件的內(nèi)容在多個(gè)目標(biāo)文件中查找起始地址為O的第一目標(biāo)文件,根據(jù)多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件的體積和內(nèi)容,使用第一腳本在多個(gè)目標(biāo)文件的代碼中對(duì)多個(gè)目標(biāo)文件中每個(gè)剩余的目標(biāo)文件的起始地址的數(shù)據(jù)進(jìn)行修改,其中剩余的目標(biāo)文件為多個(gè)目標(biāo)文件中除了第一目標(biāo)文件的目標(biāo)文件,使用第二腳本將多個(gè)目標(biāo)文件合成一個(gè)鏡像文件,這樣在編譯時(shí),根據(jù)每個(gè)目標(biāo)文件的體積和內(nèi)容確定每個(gè)目標(biāo)文件的在閃存中的起始地址,從而使得目標(biāo)文件之間沒(méi)有空閑的空間,進(jìn)而使得生成的鏡像文件小,避免浪費(fèi)norflash的空間。
[0027]為了便于理解,下面以一具體實(shí)例對(duì)本發(fā)明實(shí)施例的生成鏡像文件的方法中進(jìn)行描述,請(qǐng)參閱圖2,本發(fā)明實(shí)施例中生成鏡像文件的方法另一實(shí)施例包括:
[0028]201、將多個(gè)目標(biāo)文件中的每個(gè)目標(biāo)文件進(jìn)行單獨(dú)編譯,得到多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件的體積;
[0029]本實(shí)施例中,對(duì)多個(gè)目標(biāo)文件中的每一目標(biāo)文件均進(jìn)行單獨(dú)編譯,在實(shí)際應(yīng)用中,使用的編譯語(yǔ)言不做限定,可以為匯編語(yǔ)言,也可以為C語(yǔ)言,當(dāng)然本領(lǐng)域技術(shù)人員可以根據(jù)匯編語(yǔ)言及C語(yǔ)言所顯而易見(jiàn)其它編譯語(yǔ)言,然后通過(guò)編譯得到每一個(gè)目標(biāo)文件的體積,其中,目標(biāo)文件的體積實(shí)際為目標(biāo)文件的大小,例如,一個(gè)目標(biāo)文件的體積為IOKB。
[0030]202、根據(jù)每個(gè)目標(biāo)文件的內(nèi)容在多個(gè)目標(biāo)文件中查找起始地址為O的第一目標(biāo)文件;
[0031]本實(shí)施例中,目標(biāo)文件的內(nèi)容決定在norflash中的先后順序,根據(jù)每個(gè)目標(biāo)文件的內(nèi)容在多個(gè)目標(biāo)文件中查找起始地址為O的第一目標(biāo)文件,例如,bootstrap文件中包括系統(tǒng)初始化的數(shù)據(jù),所以bootstrap文件的起始地址為O,在實(shí)際應(yīng)用中,程序在啟動(dòng)時(shí),均是從O地址開(kāi)始啟動(dòng),起始地址為O的數(shù)據(jù)無(wú)需存儲(chǔ)在目標(biāo)文件的代碼中。
[0032]需要說(shuō)明的是,第一目標(biāo)文件為一個(gè)目標(biāo)文件。
[0033]203、根據(jù)多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件的體積和內(nèi)容確定多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件在閃存中所占閃存地址的空間;
[0034]本實(shí)施例中,在步驟202查找到起始地址為O的第一目標(biāo)文件后,根據(jù)多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件的體積和內(nèi)容確定多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件在閃存中所占閃存地址的空間,在實(shí)際應(yīng)用中,根據(jù)每個(gè)目標(biāo)文件的內(nèi)容可以確定每個(gè)目標(biāo)文件在閃存中的排列,例如,四個(gè)目標(biāo)文件分別為用于系統(tǒng)初始化的Bootstrap文件、用于啟動(dòng)內(nèi)核的U-Boot(Universal Boot Loader)文件、內(nèi)核(Kernel)和根文件系統(tǒng)(Rootfs),根據(jù)該四個(gè)目標(biāo)文件的內(nèi)容,在閃存中從地址O開(kāi)始依次為Bootstrap、U-Boot> Kernel、Rootfs,假設(shè)以目標(biāo)文件的體積為IOOK為單位,那么Bootstrap的體積為l,Bootstrap文件在閃存中所占閃存地址的空間為0-1,U-Boot的體積為2,U-Boot文件在閃存中所占閃存地址的空間為1_3,Kernel的體積為3,Kernel文件在閃存中所占閃存地址的空間為3_6,Rootfs的體積為4,Rootfs文件在閃存中所占閃存地址的空間為6-10。
[0035]204、使用第一腳本在多個(gè)目標(biāo)文件的代碼中對(duì)多個(gè)目標(biāo)文件中剩余的每個(gè)目標(biāo)文件的起始地址數(shù)據(jù)進(jìn)行修改;
[0036]本實(shí)施例中,剩余的目標(biāo)文件為多個(gè)目標(biāo)文件中除了第一目標(biāo)文件的目標(biāo)文件,例如,共有四個(gè)目標(biāo)文件,目標(biāo)文件A、目標(biāo)文件B、目標(biāo)文件C和目標(biāo)文件D,若在步驟102中查找到目標(biāo)文件A的起始地址為0,則剩余的目標(biāo)文件為目標(biāo)文件B、目標(biāo)文件C和目標(biāo)文件D,然后,使用第一腳本在多個(gè)目標(biāo)文件的代碼中對(duì)多個(gè)目標(biāo)文件中每個(gè)剩余的目標(biāo)文件的起始地址的數(shù)據(jù)進(jìn)行修改,腳本的選用為現(xiàn)有技術(shù),此處不做贅述,在現(xiàn)有技術(shù)中,由于第一目標(biāo)文件(即,起始地址為O的目標(biāo)文件)的起始地址的數(shù)據(jù)不存儲(chǔ)在目標(biāo)文件之外,剩余的目標(biāo)文件的起始地址的數(shù)據(jù)均對(duì)應(yīng)存儲(chǔ)在目標(biāo)文件的代碼中,例如,有四個(gè)目標(biāo)文件,在閃存中從地址O開(kāi)始依次為目標(biāo)文件A、目標(biāo)文件B、目標(biāo)文件C和目標(biāo)文件D,目標(biāo)文件A的起始地址為0,目標(biāo)文件A的代碼中包括目標(biāo)文件B的起始地址的數(shù)據(jù),目標(biāo)文件B的代碼中包括目標(biāo)文件C和目標(biāo)文件D的起始地址的數(shù)據(jù),在現(xiàn)有技術(shù)中,此處根據(jù)目標(biāo)文件種類的不同,起始地址的數(shù)據(jù)在目標(biāo)文件中存儲(chǔ)位置也不同,此處不做限定。
[0037]205、使用第二腳本將多個(gè)目標(biāo)文件合成一個(gè)鏡像文件;
[0038]本實(shí)施例中,當(dāng)在步驟204中修改完起始地址的數(shù)據(jù)之后,使用第二腳本將多個(gè)目標(biāo)文件合成一個(gè)鏡像文件,此處如何使用第二腳本將多個(gè)目標(biāo)文件合成一個(gè)鏡像文件為現(xiàn)有技術(shù),此處不做贅述。
[0039]206、將鏡像文件燒寫(xiě)到閃存中。
[0040]本實(shí)施例中,將在步驟205中生成的鏡像文件燒寫(xiě)到norflash中。
[0041]本實(shí)施例中,將多個(gè)目標(biāo)文件中的每個(gè)目標(biāo)文件進(jìn)行單獨(dú)編譯,得到多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件的體積,根據(jù)每個(gè)目標(biāo)文件的內(nèi)容在多個(gè)目標(biāo)文件中查找起始地址為O的第一目標(biāo)文件,根據(jù)多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件的體積和內(nèi)容確定多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件在閃存中所占閃存地址的空間,使用第一腳本在多個(gè)目標(biāo)文件的代碼中對(duì)多個(gè)目標(biāo)文件中剩余的每個(gè)目標(biāo)文件的起始地址數(shù)據(jù)進(jìn)行修改,使用第二腳本將多個(gè)目標(biāo)文件合成一個(gè)鏡像文件,將鏡像文件燒寫(xiě)到閃存中,這樣在編譯時(shí),根據(jù)每個(gè)目標(biāo)文件的體積和內(nèi)容確定每個(gè)目標(biāo)文件在閃存中的起始地址和所占閃存地址的空間,從而使得目標(biāo)文件之間沒(méi)有空閑的空間,避免浪費(fèi)norflash的空間,而且生成的鏡像文件小,縮短了燒寫(xiě)到閃存中的時(shí)間。
[0042]為了便于上述實(shí)施例的理解,下面以bootloader的四個(gè)目標(biāo)文件為例,該四個(gè)目標(biāo)文件分別為目標(biāo)文件A (Bootstrap)、目標(biāo)文件B (U-Boot)、目標(biāo)文件C (kernel)和目標(biāo)文件D (Rootfs),對(duì)本發(fā)明實(shí)施例的生成鏡像文件的方法中進(jìn)行描述,請(qǐng)參閱圖3和圖4。
[0043]需要說(shuō)明的是,本實(shí)施例中,假設(shè)目標(biāo)文件A (Bootstrap)、目標(biāo)文件B (U-Boot),目標(biāo)文件C (kernel)和目標(biāo)文件D (Rootfs)的體積以100K為單位進(jìn)行說(shuō)明。
[0044]首先對(duì)四個(gè)目標(biāo)文件Bootstrap、U_Boot、kernel和Rootfs分別進(jìn)行單獨(dú)編譯,分別得到Bootstrap文件、U-Boot文件、kernel文件和Rootfs文件的體積,假設(shè)Bootstrap文件的體積1,U-Boot文件的體積為2,kernel文件的體積為3,Rootfs文件的體積為4。
[0045]由于Bootstrap文件是用于系統(tǒng)初始化的文件,U-Boot文件是用于啟動(dòng)內(nèi)核的文件,Kernel文件為內(nèi)核,Rootfs文件為根文件系統(tǒng),所以在操作系統(tǒng)(如,Linux)啟動(dòng)時(shí),必須先進(jìn)行系統(tǒng)初始化,所以Bootstrap文件的起始地址為O。
[0046]根據(jù)該四個(gè)目標(biāo)文件的體積和內(nèi)容就可以確定Bootstrap文件在閃存中所占閃存地址空間為0-l,U-Boot文件在閃存中所占閃存地址空間為l-3,Kernel文件在閃存中所占閃存地址空間為3-6,Rootfs文件在閃存中所占閃存地址空間為6-10。
[0047]使用第一腳本將Bootstrap文件的代碼中的U-Boot文件的起始地址進(jìn)行修改,將U-Boot文件的代碼中Kerne文件的起始地址進(jìn)行修改,將Kernel文件的代碼中的Rootfs文件的起始地址進(jìn)行修改。
[0048]然后,使用第二腳本將目標(biāo)文件Bootstrap、U_Boot、kernel和Rootfs合成一個(gè)鏡像文件,如圖3中的虛線框?yàn)閚orflash的空間,然后將該生成的鏡像文件燒寫(xiě)到如圖3中的norflash中,燒寫(xiě)后,如圖4,黑色框?yàn)槟繕?biāo)文件A (Bootstrap)、目標(biāo)文件B (U-Boot),目標(biāo)文件C (kernel)和目標(biāo)文件D (Rootfs)實(shí)際占用閃存的體積,該四個(gè)目標(biāo)文件合起來(lái)是一個(gè)鏡像文件,當(dāng)系統(tǒng)啟動(dòng)時(shí),從O地址開(kāi)始運(yùn)行Bootstrap文件,當(dāng)Bootstrap文件運(yùn)行完后,將Bootstrap文件的代碼中的U-Boot文件的起始地址加載到norflash,然后運(yùn)行U-Boot文件,當(dāng)U-Boot文件運(yùn)行完后,將U-Boot文件的代碼中的kernel文件的起始地址加載到norflash,然后運(yùn)行kernel文件,當(dāng)kernel文件運(yùn)行完后,將kernel文件的代碼中的Rootfs文件的起始地址加載到norflash,在Rootfs文件運(yùn)行完后,系統(tǒng)啟動(dòng)完畢,這樣在編譯時(shí),根據(jù)每個(gè)目標(biāo)文件的體積和內(nèi)容確定每個(gè)目標(biāo)文件在閃存中的起始地址和所占閃存地址的空間,從而使得目標(biāo)文件之間沒(méi)有空閑的空間,避免浪費(fèi)norflash的空間,而且生成的鏡像文件小,縮短了燒寫(xiě)到閃存中的時(shí)間。
[0049]下面對(duì)用于執(zhí)行上述生成鏡像文件的方法的本發(fā)明實(shí)施例的編譯器進(jìn)行說(shuō)明,其基本邏輯結(jié)構(gòu)參考圖5,本發(fā)明實(shí)施例中編譯器一個(gè)實(shí)施例包括:
[0050]第一編譯單元501、查找單元502、修改單元503和第二編譯單元504 ;
[0051]第一編譯單元501,用于將多個(gè)目標(biāo)文件中的每個(gè)目標(biāo)文件進(jìn)行單獨(dú)編譯,得到多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件的體積;
[0052]查找單元502,用于根據(jù)每個(gè)目標(biāo)文件的內(nèi)容在多個(gè)目標(biāo)文件中查找起始地址為O的第一目標(biāo)文件;
[0053]修改單元503,用于根據(jù)多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件的體積和內(nèi)容,使用第一腳本在多個(gè)目標(biāo)文件的代碼中對(duì)多個(gè)目標(biāo)文件中每個(gè)剩余的目標(biāo)文件的起始地址的數(shù)據(jù)進(jìn)行修改,其中剩余的目標(biāo)文件為多個(gè)目標(biāo)文件中除了第一目標(biāo)文件的目標(biāo)文件;
[0054]第二編譯單元504,用于使用第二腳本將多個(gè)目標(biāo)文件合成一個(gè)鏡像文件。
[0055]本實(shí)施例中,第一編譯單元501將多個(gè)目標(biāo)文件中的每個(gè)目標(biāo)文件進(jìn)行單獨(dú)編譯,得到多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件的體積,查找單元502根據(jù)每個(gè)目標(biāo)文件的內(nèi)容在多個(gè)目標(biāo)文件中查找起始地址為O的第一目標(biāo)文件,修改單元503,用于根據(jù)多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件的體積和內(nèi)容,使用第一腳本在多個(gè)目標(biāo)文件的代碼中對(duì)多個(gè)目標(biāo)文件中每個(gè)剩余的目標(biāo)文件的起始地址的數(shù)據(jù)進(jìn)行修改,其中剩余的目標(biāo)文件為多個(gè)目標(biāo)文件中除了第一目標(biāo)文件的目標(biāo)文件,第二編譯單元504使用第二腳本將多個(gè)目標(biāo)文件合成一個(gè)鏡像文件,這樣在編譯時(shí),根據(jù)每個(gè)目標(biāo)文件的體積和內(nèi)容確定每個(gè)目標(biāo)文件在閃存中的起始地址,從而使得目標(biāo)文件之間沒(méi)有空閑的空間,使得生成的鏡像文件小,避免浪費(fèi)norflash的空間。
[0056]為了更好的理解上述的實(shí)施例,下面以一具體實(shí)施例對(duì)編譯器中包括的各個(gè)元件的交互對(duì)編譯器中的數(shù)據(jù)交互方式進(jìn)行說(shuō)明,請(qǐng)參閱圖6,本發(fā)明實(shí)施例中編譯器另一實(shí)施例包括:包括:
[0057]第一編譯單元601、查找單元602、修改單元603、第二編譯單元604和燒寫(xiě)單元605 ;
[0058]其中修改單元603包括:確定模塊6031和修改模塊6032。
[0059]第一編譯單元601將多個(gè)目標(biāo)文件中的每個(gè)目標(biāo)文件進(jìn)行單獨(dú)編譯,得到多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件的體積,使用的編譯語(yǔ)言不做限定,可以為匯編語(yǔ)言,也可以為C語(yǔ)言,當(dāng)然本領(lǐng)域技術(shù)人員可以根據(jù)匯編語(yǔ)言及C語(yǔ)言所顯而易見(jiàn)其它編譯語(yǔ)言,其中,目標(biāo)文件的體積實(shí)際為目標(biāo)文件的大小,例如,一個(gè)目標(biāo)文件的體積為10KB,然后第一編譯單元601將得到的每個(gè)目標(biāo)文件的體積發(fā)送至確定模塊6031。
[0060]查找單元602根據(jù)每個(gè)目標(biāo)文件的內(nèi)容在多個(gè)目標(biāo)文件中查找起始地址為O的第一目標(biāo)文件,在實(shí)際應(yīng)用中,目標(biāo)文件的內(nèi)容決定在norflash中的先后順序,例如,bootstrap文件中包括系統(tǒng)初始化的數(shù)據(jù),所以bootstrap文件的起始地址為O,在實(shí)際應(yīng)用中,程序在啟動(dòng)時(shí),均是從O地址開(kāi)始啟動(dòng),起始地址為O的數(shù)據(jù)無(wú)需存儲(chǔ)在目標(biāo)文件的代碼中,需要說(shuō)明的是,第一目標(biāo)文件為一個(gè)目標(biāo)文件,然后查找單元602告知確定模塊6031第一目標(biāo)文件的起始地址為O。
[0061]確定模塊6031根據(jù)多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件的體積和內(nèi)容確定多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件在閃存中所占閃存地址的空間,在實(shí)際應(yīng)用中,確定模塊6031根據(jù)每個(gè)目標(biāo)文件的內(nèi)容可以確定每個(gè)目標(biāo)文件在閃存中的排列,例如,四個(gè)目標(biāo)文件分別為用于系統(tǒng)初始化的Bootstrap文件、用于啟動(dòng)內(nèi)核的U-Boot文件、內(nèi)核(Kernel)和根文件系統(tǒng)(Rootfs),根據(jù)該四個(gè)目標(biāo)文件的內(nèi)容,在閃存中從地址O開(kāi)始依次為Bootstrap、U-Boot、Kernel、Rootfs,假設(shè)以目標(biāo)文件的體積為IOOK為單位,Bootstrap的體積為I,則在閃存中所占閃存地址的空間為0-l,U-Boot的體積為2,則在閃存中所占閃存地址的空間為1-3,Kernel的體積為3,則在閃存中所占閃存地址的空間為3_6,Rootfs的體積為4,則在閃存中所占閃存地址的空間為6-10,然后將確定的每個(gè)目標(biāo)文件在閃存中所占閃存地址的空間發(fā)送到修改模塊6032。
[0062]修改模塊6032使用第一腳本在多個(gè)目標(biāo)文件的代碼中對(duì)多個(gè)目標(biāo)文件中剩余的每個(gè)目標(biāo)文件的起始地址數(shù)據(jù)進(jìn)行修改,其中剩余的目標(biāo)文件為多個(gè)目標(biāo)文件中除了第一目標(biāo)文件的目標(biāo)文件,例如,共有四個(gè)目標(biāo)文件,目標(biāo)文件A、目標(biāo)文件B、目標(biāo)文件C和目標(biāo)文件D,若查找單元602查找到目標(biāo)文件A的起始地址為0,則剩余的目標(biāo)文件為目標(biāo)文件B、目標(biāo)文件C和目標(biāo)文件D,然后,修改模塊6032使用第一腳本在多個(gè)目標(biāo)文件的代碼中對(duì)多個(gè)目標(biāo)文件中每個(gè)剩余的目標(biāo)文件的起始地址的數(shù)據(jù)進(jìn)行修改,腳本的選用為現(xiàn)有技術(shù),此處不做贅述,在現(xiàn)有技術(shù)中,由于第一目標(biāo)文件(即,起始地址為O的目標(biāo)文件)的起始地址的數(shù)據(jù)不存儲(chǔ)在目標(biāo)文件之外,剩余的目標(biāo)文件的起始地址的數(shù)據(jù)均對(duì)應(yīng)存儲(chǔ)在目標(biāo)文件的代碼中,例如,有四個(gè)目標(biāo)文件,在閃存中從地址O開(kāi)始依次為目標(biāo)文件A、目標(biāo)文件
B、目標(biāo)文件C和目標(biāo)文件D,目標(biāo)文件A的起始地址為0,目標(biāo)文件A的代碼中包括目標(biāo)文件B的起始地址的數(shù)據(jù),目標(biāo)文件B的代碼中包括目標(biāo)文件C和目標(biāo)文件D的起始地址的數(shù)據(jù),在現(xiàn)有技術(shù)中,此處根據(jù)目標(biāo)文件種類的不同,起始地址的數(shù)據(jù)在目標(biāo)文件中存儲(chǔ)位置也不同,此處不做限定,然后修改模塊6032將修改后的多個(gè)目標(biāo)文件發(fā)送至第二編譯單元 604。
[0063]第二編譯單元604使用第二腳本將從修改模塊6032中得到的多個(gè)目標(biāo)文件合成一個(gè)鏡像文件,并將該鏡像文件發(fā)送到燒寫(xiě)單元605,此處如何使用第二腳本將多個(gè)目標(biāo)文件合成一個(gè)鏡像文件為現(xiàn)有技術(shù),此處不做贅述。
[0064]燒寫(xiě)單元605將接收到的鏡像文件燒寫(xiě)到閃存中。
[0065]本實(shí)施例中,第一編譯單元601將多個(gè)目標(biāo)文件中的每個(gè)目標(biāo)文件進(jìn)行單獨(dú)編譯,得到多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件的體積,查找單元602根據(jù)每個(gè)目標(biāo)文件的內(nèi)容在多個(gè)目標(biāo)文件中查找起始地址為O的第一目標(biāo)文件,確定模塊6031根據(jù)多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件的體積和內(nèi)容確定多個(gè)目標(biāo)文件中每個(gè)目標(biāo)文件在閃存中所占閃存地址的空間,修改模塊6032使用第一腳本在多個(gè)目標(biāo)文件的代碼中對(duì)多個(gè)目標(biāo)文件中剩余的每個(gè)目標(biāo)文件的起始地址數(shù)據(jù)進(jìn)行修改,第二編譯單元604使用第二腳本將多個(gè)目標(biāo)文件合成一個(gè)鏡像文件,燒寫(xiě)單元605將鏡像文件燒寫(xiě)到閃存中,這樣在編譯時(shí),根據(jù)每個(gè)目標(biāo)文件的體積和內(nèi)容確定每個(gè)目標(biāo)文件在閃存中的起始地址和所占閃存地址的空間,從而使得目標(biāo)文件之間沒(méi)有空閑的空間,避免浪費(fèi)norflash的空間,而且生成的鏡像文件小,縮短了燒寫(xiě)到閃存中的時(shí)間。
[0066]所屬領(lǐng)域的技術(shù)人員可以清楚地了解到,為描述的方便和簡(jiǎn)潔,上述描述的系統(tǒng),裝置和單元的具體工作過(guò)程,可以參考前述方法實(shí)施例中的對(duì)應(yīng)過(guò)程,在此不再贅述。
[0067]以上所述實(shí)施例僅用以說(shuō)明本發(fā)明的技術(shù)方案,而非對(duì)其限制;盡管參照前述實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)的說(shuō)明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:其依然可以對(duì)前述各實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對(duì)其中部分技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實(shí)施例技術(shù)方案的精神和范圍。
【權(quán)利要求】
1.一種生成鏡像文件的方法,其特征在于,所述方法包括: 將多個(gè)目標(biāo)文件中的每個(gè)所述目標(biāo)文件進(jìn)行單獨(dú)編譯,得到多個(gè)所述目標(biāo)文件中每個(gè)所述目標(biāo)文件的體積; 根據(jù)每個(gè)所述目標(biāo)文件的內(nèi)容在多個(gè)所述目標(biāo)文件中查找起始地址為O的第一目標(biāo)文件; 根據(jù)多個(gè)所述目標(biāo)文件中每個(gè)所述目標(biāo)文件的體積和內(nèi)容,使用第一腳本在多個(gè)所述目標(biāo)文件的代碼中對(duì)多個(gè)所述目標(biāo)文件中每個(gè)剩余的所述目標(biāo)文件的起始地址的數(shù)據(jù)進(jìn)行修改,其中,剩余的所述目標(biāo)文件為多個(gè)所述目標(biāo)文件中除了所述第一目標(biāo)文件的目標(biāo)文件; 使用第二腳本將多個(gè)所述目標(biāo)文件合成一個(gè)鏡像文件。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述根據(jù)多個(gè)所述目標(biāo)文件中每個(gè)所述目標(biāo)文件的體積和內(nèi)容,使用第一腳本在多個(gè)所述目標(biāo)文件的代碼中對(duì)多個(gè)所述目標(biāo)文件中剩余的每個(gè)所述目標(biāo)文件的起始地址的數(shù)據(jù)進(jìn)行修改的具體步驟包括: 根據(jù)多個(gè)所述目標(biāo)文件中每個(gè)目標(biāo)文件的體積和內(nèi)容確定多個(gè)所述目標(biāo)文件中每個(gè)目標(biāo)文件在閃存中所占閃存地址的空間; 使用第一腳本在多個(gè)所述目標(biāo)文件的代碼中對(duì)多個(gè)所述目標(biāo)文件中剩余的每個(gè)所述目標(biāo)文件的起始地址的數(shù)據(jù)進(jìn)行修改。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,使用第二腳本將多個(gè)所述目標(biāo)文件合成一個(gè)鏡像文件之后的步驟還包括: 將所述鏡像文件燒寫(xiě)到閃存中。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于,所述閃存為非易失閃存norflash,所述鏡像文件為引導(dǎo)裝載程序bootloader。
5.一種編譯器,其特征在于,所述編譯器包括: 第一編譯單元,用于將多個(gè)目標(biāo)文件中的每個(gè)所述目標(biāo)文件進(jìn)行單獨(dú)編譯,得到多個(gè)所述目標(biāo)文件中每個(gè)所述目標(biāo)文件的體積; 查找單元,用于根據(jù)每個(gè)所述目標(biāo)文件的內(nèi)容在多個(gè)所述目標(biāo)文件中查找起始地址為O的第一目標(biāo)文件; 修改單元,用于根據(jù)多個(gè)所述目標(biāo)文件中每個(gè)所述目標(biāo)文件的體積和內(nèi)容,使用第一腳本在多個(gè)所述目標(biāo)文件的代碼中對(duì)多個(gè)所述目標(biāo)文件中每個(gè)剩余的所述目標(biāo)文件的起始地址的數(shù)據(jù)進(jìn)行修改,其中剩余的所述目標(biāo)文件為多個(gè)所述目標(biāo)文件中除了所述第一目標(biāo)文件的目標(biāo)文件; 第二編譯單元,用于使用第二腳本將多個(gè)所述目標(biāo)文件合成一個(gè)鏡像文件。
6.根據(jù)權(quán)利要求4所述的編譯器,其特征在于,所述修改單元包括: 確定模塊,用于根據(jù)多個(gè)所述目標(biāo)文件中每個(gè)目標(biāo)文件的體積和內(nèi)容確定多個(gè)所述目標(biāo)文件中每個(gè)目標(biāo)文件在閃存中所占閃存地址的空間; 修改模塊,用于使用第一腳本在多個(gè)所述目標(biāo)文件的代碼中對(duì)多個(gè)所述目標(biāo)文件中剩余的每個(gè)所述目標(biāo)文件的起始地址的數(shù)據(jù)進(jìn)行修改。
7.根據(jù)權(quán)利要求4所述的編譯器,其特征在于,所述編譯器還包括: 燒寫(xiě)單元,用于將所述鏡像文件燒寫(xiě)到閃存中。
8.根據(jù)權(quán)利要求7所述的編譯器,其特征在于, 所述閃存為非易失閃存norf lash,所述鏡像文件為引導(dǎo)裝載程序bootloader。
【文檔編號(hào)】G06F9/45GK103544042SQ201310482386
【公開(kāi)日】2014年1月29日 申請(qǐng)日期:2013年10月15日 優(yōu)先權(quán)日:2013年10月15日
【發(fā)明者】張濤 申請(qǐng)人:廣東威創(chuàng)視訊科技股份有限公司