在ARM設(shè)計(jì)中,一般會(huì)涉及都一個(gè)鏈接地址,這個(gè)鏈接地址和燒寫地址很容易混淆,會(huì)認(rèn)為鏈接地址就是燒寫地址,這個(gè)是錯(cuò)的,下面說的是個(gè)人的一些認(rèn)識(shí),可能會(huì)有一些錯(cuò)誤,說的也可能不專業(yè),但是對(duì)于初學(xué)者,可以幫助理解。 首先鏈接地址和燒寫地址是兩個(gè)范疇的東西,幾乎是沒有關(guān)系的,燒寫地址,可以認(rèn)為是物理地址,而鏈接地址可以認(rèn)為是虛擬地址,對(duì)于程序員來說,看到的是虛擬地址,一般虛擬地址經(jīng)過MMU映射成具體的物理地址,進(jìn)而再去訪問實(shí)際的物理地址。
鏈接地址也可以理解成是一個(gè)符號(hào),因?yàn)橐粋€(gè)可執(zhí)行程序,一般要經(jīng)過預(yù)編譯,編譯,匯編,鏈接三個(gè)過程,最后一個(gè)過程是鏈接,就是把前三部分產(chǎn)生的所有.o文件,串起來,形成一個(gè)整體的程序,所以每個(gè).o文件上都有一些的函數(shù)或者子程序,通過給定鏈接地址,相當(dāng)于是從全局出發(fā),給所有的文件中的函數(shù),統(tǒng)一編號(hào),起了一個(gè)“名字”,名字的范圍是0x00000000--0xFFFFFFFF,那么這個(gè)名字其實(shí)就是鏈接地址。如果MMU未打開,則鏈接地址就是物理地址,反之,則鏈接地址是映射的物理地址。
那么問題就來了,當(dāng)程序開始執(zhí)行時(shí),CPU是通過鏈接地址進(jìn)行訪問具體的函數(shù)的,如果這個(gè)函數(shù)沒有存到鏈接地址映射到的物理地址那會(huì)怎么辦呢?答案是很簡(jiǎn)單的,那就是程序會(huì)跑飛,打個(gè)比喻吧,CPU要訪問38號(hào)房間的客人,但是客人卻沒有移駕到38號(hào),CPU又很呆,它只能亂啦,這里38號(hào)就是鏈接地址,客人就是具體的函數(shù)名。所以在使用鏈接地址時(shí),如果未打開mmu,那么需要將程序復(fù)制到對(duì)應(yīng)的物理地址處,若使用了MMU則需要將程序復(fù)制到映射對(duì)應(yīng)的物理地址處。
燒寫地址就是實(shí)際的物理地址,這個(gè)是通過存儲(chǔ)控制器進(jìn)行訪問的,而且一般的燒寫軟件可以實(shí)現(xiàn)指定地址處燒寫。
綜上,燒寫地址與鏈接地址有關(guān)系,但是關(guān)系不是特別明顯,對(duì)于程序員來說,用的是鏈接地址,但是需要設(shè)置濾清好鏈接地址與燒寫地址的映射關(guān)系。
評(píng)論