arm裡面的鏈結位址和燒寫位址

2021-09-03 09:03:22 字數 906 閱讀 8002

在考慮為什麼要重定位的問題之前,我們首先要明白一下幾點:

1.鏈結位址

在arm設計中,一般會涉及都乙個鏈結位址,這個鏈結位址和燒寫位址很容易混淆,會認為鏈結位址就是燒寫位址,這個是錯的,下面說的是個人的一些認識,可能會有一些錯誤,說的也可能不專業,但是對於初學者,可以幫助理解。

首先鏈結位址和燒寫位址是兩個範疇的東西,幾乎是沒有關係的,燒寫位址,可以認為是實體地址,而鏈結位址可以認為是虛擬位址,對於程式設計師來說,看到的是虛擬位址,一般虛擬位址經過mmu對映成具體的實體地址,進而再去訪問實際的實體地址。

鏈結位址也可以理解成是乙個符號,因為乙個可執行程式,一般要經過預編譯,編譯,彙編,鏈結三個過程,最後乙個過程是鏈結,就是把前三部分產生的所有.o檔案,串起來,形成乙個整體的程式,所以每個.o檔案上都有一些的函式或者子程式,通過給定鏈結位址,相當於是從全域性出發,給所有的檔案中的函式,統一編號,起了乙個「名字」,名字的範圍是0x00000000--0xffffffff,那麼這個名字其實就是鏈結位址。如果mmu未開啟,則鏈結位址就是實體地址,反之,則鏈結位址是對映的實體地址。

那麼問題就來了,當程式開始執行時,cpu是通過鏈結位址進行訪問具體的函式的,如果這個函式沒有存到鏈結位址對映到的實體地址那會怎麼辦呢?答案是很簡單的,那就是程式會跑飛,打個比喻吧,cpu要訪問38號房間的客人,但是客人卻沒有移駕到38號,cpu又很呆,它只能亂啦,這裡38號就是鏈結位址,客人就是具體的函式名。所以在使用鏈結位址時,如果未開啟mmu,那麼需要將程式複製到對應的實體地址處,若使用了mmu則需要將程式複製到對映對應的實體地址處。

燒寫位址就是實際的實體地址,這個是通過儲存控制器進行訪問的,而且一般的燒寫軟體可以實現指定位址處燒寫。

綜上,燒寫位址與鏈結位址有關係,但是關係不是特別明顯,對於程式設計師來說,用的是鏈結位址,但是需要設定濾清好鏈結位址與燒寫位址的對映關係。

關於鏈結位址

回過頭來看我們的helloworld程式,在makefile中 ttext 0x7c00,鏈結位址為0x7c00,code標號的偏移位址為0x15,則鏈結後其位址為0x7c15,其他函式呼叫此函式時,也就會呼叫位址0x7c15,這時jmpl 0,code語句反彙編後為 假如我們在makefile中改...

20180601 鏈結位址

已知表頭元素為 c 的單鏈表在記憶體中的儲存狀態如下表所示。現將 f 存放於 1014h 處並插入到單鏈表中,若 f 在邏輯上位於 a 和 e 之間,則 a,e,d 的 鏈結位址 依次是 1010h,1014h,1004h 1010h,1004h,null 1014h,1010h,1004h 101...

鏈結位址和儲存位址

什麼是儲存位址呢?我們知道,我們編寫的c 會被編譯成彙編指令,進一步變成機器碼,最後載入到arm的記憶體中。也就是說我們的彙編指令被儲存在記憶體之中,而指令對應的位址,就是他的 儲存位址 其實 儲存位址 的值,一直由pc這個暫存器所記載著。想改變 儲存位址 的值直接改變pc好了 再說鏈結位址,他是指...