『壹』 C語言,所有變數的邏輯地址都是編譯後確定的嗎
是的。程序都是在運行階段分配內存,所有變數的邏輯地址都是在編譯後就確定了,但都是相對的偏移地址,只不過全局變數是相對數據段的偏移,局部變數是相對程序棧頂的偏移。
『貳』 C語言的&運算符取的是邏輯地址還是物理地址 每次重新編譯運行後 輸出變數的地址值都一樣 怎麼理解
您需要了解一下操作系統的虛擬內存機制。
操作系統會為新建立的每一個進程開辟一個獨立卻完整的地址空間(32位機器是4GB),其中除了一部分地址要交給操作系統的內核或用於某些特殊功用,程序可以自由地使用這些內存,就好像每個進程可以獨自使用一台4GB內存的機器一樣。但是要注意這是由操作系統虛擬出來的,系統的內存管理器要負責把這些虛擬的內存映射到真實的物理內存中。系統往往同時運行很多進程,要把真實的內存給每個進程都分配4GB當然不可能,所以系統往往還要借用硬碟來存放物理內存存不下的內容,協助虛擬內存的實現。實際的物理內存的狀況是:零散無規律地分布著各個進程的內存頁面。
當一個新進程啟動時,操作系統首先為該進程創建虛擬內存空間,然後把程序的代碼段和一部分數據放在固定的虛擬內存地址上。你說的那個變數A就是被包含這部分數據中,每次啟動程序都可以看到它在一個固定的地址上,但是這個地址是在虛擬內存中的,實際它所對應的真實物理內存的地址是未知的,只有管理內存的系統內核知道。
當然,還有一部分數據在你的虛擬內存空間的地址也是未知的,這就是堆,堆允許程序在運行過程中動態分配和釋放內存(其他的內存分配方式在程序啟動時就在固定位置分配,不能改變),堆的分配和釋放由C運行時庫和操作系統協同管理,分配的內存地址是隨機的。你說的那個變數A不是堆中的。
你說的邏輯地址就是在虛擬內存中的地址,物理地址就是在真實的物理內存中的地址。
對於以上有不懂的概念名詞可網路查資料。
『叄』 操作系統中 區分編譯後的形成邏輯地址和鏈接後的形成的最終邏輯地址 什麼意思啊
編譯後產生若干個目標模塊,編譯後的邏輯地址指的是每個模塊都從0號單元開始編址,而鏈接將這些模塊鏈接在一起,形成一個完整的裝入模塊,此時的邏輯地址會重新編址,也就是說鏈接後的邏輯地址是將整個模塊從0號單元開始編址。
『肆』 高級語言源程序編譯後產生的地址是邏輯地址還是物理地址
由於操作系統技術的發展,可重用二進製程序技術使用了內存重定位技術,所以從匯編的角度來看即不是邏輯地址也不是物理地址。而且這個概念有些不同,編譯後產生的地址是相對地址,是相對於可執行頭部位置的地址。而邏輯地址是指在指令系統內部使用的用來訪問內存的一個邏輯表示,通常表現為相對於某個段基地址的偏移量。
當可執行程序被載入內存之後,才會有邏輯地址存在,此時可執行程序被如何載入於何處,地址為多少,由操作系統決定,此時cpu訪問程序用的是邏輯地址。一個程序一旦被編譯確定之後基本上變數初始化的順序固定,資源分配位置也固定,設置有編譯器使用預分配機制,然後採用相對地址引用。
注意:某些工具書也稱二進制可執行文件內所有的相對地址范圍是邏輯地址空間,相對地址就是邏輯地址。因為兩者的訪問方式相似,邏輯地址變換依賴cpu或者附加變換機構(硬體),而二進製程序地址空間變換需要操作系統插手管理。
反匯編分析中常常將二進制內部地址稱為邏輯地址,因為反匯編器不能還原原來匯編代碼的地址跳轉空間特性,因此得到一個相對於二進制數據起點位置的相對地址,而和內存和物理存儲都沒有關系。