LMA英文原版解釋:load memory address:the address at which the section will be loaded。
什么是load memory address钧唐,內(nèi)存裝載地址呢洽损?此處咖楣,單單從名字上供嚎,我們就可以看出幾層意思:
load,裝載骨杂。為什么要裝載呢?因為雄卷,如果想要使你的程序(即經(jīng)歷過搓蚪,由你的源碼,通過編譯器的編譯丁鹉,鏈接器的鏈接妒潭,形成的那個可執(zhí)行文件)悴能,能在內(nèi)存里面運行,那么肯定涉及到這一點雳灾。就是漠酿,有人,把你的這個程序從此處常見的存儲器硬盤里面谎亩,搬到內(nèi)存里面去了炒嘲,然后才有可能運行。而這里的裝載匈庭,就是對應(yīng)這個意思夫凸。就是把程序,從硬盤里面阱持,裝載load夭拌,到內(nèi)存里面去了。對應(yīng)的衷咽,放在內(nèi)存哪里去了呢鸽扁?就是LMA,load memory address兵罢,就是把你的程序中的對應(yīng)的內(nèi)容献烦,詳細點說就是,把其中的.text代碼段卖词,.data數(shù)據(jù)段等內(nèi)容巩那,搬到,也就是copy拷貝到此蜈,內(nèi)存的LMA地址處了即横。。裆赵。
memory內(nèi)存
上面已經(jīng)解釋過了东囚,這里再多說幾句。
程序運行的本質(zhì)战授,就是CPU讀取到指令页藻,然后執(zhí)行,這里就涉及到植兰,如果想要你的程序運行份帐,首先,你應(yīng)該把對應(yīng)的指令放在合適的地方楣导,CPU才能讀到废境,才能執(zhí)行。
此處合適的地方,有人想到噩凹,直接放到硬盤這里巴元,CPU過來讀取,然后執(zhí)行不就可以了嗎驮宴,還不用這么麻煩地將(指令)代碼搬來搬去的逮刨,多省事。但是實際上幻赚,系統(tǒng)就是這么笨地搬來搬去的禀忆,原因在于,從硬盤上直接讀取指令落恼,速度比直接從內(nèi)存箩退,一般pc上各種類型的ram,比如DDR佳谦,此處統(tǒng)稱為memory/內(nèi)存戴涝,要慢很多倍,所以钻蔑,系統(tǒng)才會不嫌棄麻煩啥刻,把代碼拷貝到內(nèi)存里面去,然后從內(nèi)存里面讀取指令咪笑,然后執(zhí)行可帽,這樣效率高很多。
所以窗怒,此處簡單說就是映跟,為了總體效率,對于普通系統(tǒng)扬虚,比如PC努隙,程序的執(zhí)行都是在memory,內(nèi)存里面執(zhí)行的辜昵。因此荸镊,一句話總結(jié)就是:代碼被裝載到內(nèi)存的某個地方,那個地方的地址就叫做LMA堪置。
VMA英文原版解釋:virtual memory address:the address the section will have when output file is run躬存。
那啥是虛擬內(nèi)存地址呢?簡單說就是舀锨,你程序運行時候所對應(yīng)的地址岭洲。
此處所謂的虛擬,一般來說雁竞,指的是啟用了mmu之后钦椭,才有了虛擬地址和實地址。此處碑诉,我們可以簡單地理解為彪腔,就是內(nèi)存的實際地址。程序運行前进栽,要把程序的內(nèi)容德挣,拷貝到對應(yīng)的內(nèi)存地址出,才能運行的快毛。
因此格嗅,一句話總結(jié)就是:代碼要運行的時候,此時對應(yīng)的地址唠帝,就是VMA屯掖。
大多數(shù)情況下,LMA和VMA是一樣的襟衰。也就是被加載到內(nèi)存的什么地方贴铜,也就在什么地方運行。
如果是嵌入式系統(tǒng)瀑晒,也就是相對的“少數(shù)情況”绍坝,LMA和VMA不一樣。而其中最常見的一種情況就是苔悦,程序被放到ROM中轩褐,比如設(shè)置為只讀的Nor Flash中,也就是LMA的地址是Nor Flash的地址玖详,比如隨便舉例為0x10000000把介,而程序要運行的時候的地址是內(nèi)存地址,比如0x30000000竹宋,也就是VMA是0x30000000劳澄,這時候就要我們自己保證,在程序運行之前蜈七,把自己的程序秒拔,從LMA= 0x10000000拷貝到VMA=0x30000000處,然后程序才可以正常運行飒硅。
有人會問砂缩,反正對于ROM來說,CPU也是可以直接從ROM里面讀取代碼三娩,然后運行的庵芭。為何還要前面提到的,弄個LMA和VMA不同雀监,搬來搬去的呢双吆?因為ROM眨唬,顧名思義,是只讀的好乐,只能讀取匾竿,不能寫入的。
而程序中的代碼段蔚万,由于只是被讀取岭妖,不涉及到修改寫入,是沒有問題的反璃。但是對于數(shù)據(jù)段和bss段來說昵慌,里面的所有的程序的變量,多數(shù)都是在運行的時候淮蜈,不僅要讀取斋攀,而且要被修改成新的值,然后寫入新的值的梧田,所以還是放到ROM里面蜻韭,就沒法修改寫入了。而且柿扣,另一個原因是肖方,CPU從ROM,比如常見的Nor Flash中讀取代碼的速度未状,要遠遠小于從RAM俯画,比如常見的SDRAM,中讀取的速度司草,所以艰垂,才會牽扯到將代碼燒寫到ROM里面,然后代碼的最開始埋虹,將此部分程序reload猜憎,重載。也就是從此處的ROM的地址搔课,即LMA胰柑,重新拷貝到SDRAM中去,也就是VMA的地方爬泥,然后從那里運行柬讨。
后記
關(guān)于LMA和VMA:
linker,鏈接器的作用:
將LMA寫到(可執(zhí)行的)二進制文件里面去袍啡。
解析符號踩官。即,把不同的符號境输,根據(jù)符號表中的信息蔗牡,轉(zhuǎn)換成對應(yīng)的地址颖系。此處只涉及VMA,即程序運行時候的地址辩越。
loader集晚,裝載器的作用:
從二進制文件中讀出對應(yīng)的段的信息,比如text区匣,data,bss等段的信息蒋院,將內(nèi)容拷貝到對應(yīng)的LMA的地址處亏钩。此謂,裝載(對應(yīng)內(nèi)容)到裝載地址(LMA)欺旧。
如果發(fā)現(xiàn)VMA != LMA姑丑,即程序運行時候的地址,和剛剛把程序內(nèi)容拷貝到的地址LMA辞友,兩者不一樣栅哀,那么就要把對應(yīng)的內(nèi)容,此處主要是data称龙,數(shù)據(jù)段的內(nèi)容留拾,從剛裝載到的位置,LMA處鲫尊,拷貝到VMA處痴柔,這樣程序運行的時候,找到對應(yīng)的VMA處的變量疫向,才能找到對應(yīng)的值咳蔚,程序才能正常運行。