⑴ 高級語言源程序編譯後產生的地址是邏輯地址還是物理地址
由於操作系統技術的發展,可重用二進製程序技術使用了內存重定位技術,所以從匯編的角度來看即不是邏輯地址也不是物理地址。而且這個概念有些不同,編譯後產生的地址是相對地址,是相對於可執行頭部位置的地址。而邏輯地址是指在指令系統內部使用的用來訪問內存的一個邏輯表示,通常表現為相對於某個段基地址的偏移量。
當可執行程序被載入內存之後,才會有邏輯地址存在,此時可執行程序被如何載入於何處,地址為多少,由操作系統決定,此時cpu訪問程序用的是邏輯地址。一個程序一旦被編譯確定之後基本上變數初始化的順序固定,資源分配位置也固定,設置有編譯器使用預分配機制,然後採用相對地址引用。
注意:某些工具書也稱二進制可執行文件內所有的相對地址范圍是邏輯地址空間,相對地址就是邏輯地址。因為兩者的訪問方式相似,邏輯地址變換依賴cpu或者附加變換機構(硬體),而二進製程序地址空間變換需要操作系統插手管理。
反匯編分析中常常將二進制內部地址稱為邏輯地址,因為反匯編器不能還原原來匯編代碼的地址跳轉空間特性,因此得到一個相對於二進制數據起點位置的相對地址,而和內存和物理存儲都沒有關系。
⑵ 什麼是邏輯地址,什麼是物理地址,它們之間有什麼關系
http://ke..com/view/893778.htm
http://ke..com/view/883168.htm
這是網路里的介紹 我就不復制了
然後說下我自己的理解吧
在計算機存儲單元中,是以字為單位存儲的,而且數目眾多,管理起來必須需要地址
邏輯地址為人可以理解的地址,分為段地址和基地址
段地址顧名思義,就是對大段的空間編排的地址如4G個字的內存空間,需要2^32個地址表示
把每2^16個空間分為一段,則一共有2^16個段,給每段一個地址,每段中每個單元一個偏移地址
則段地址1-2^16,確定大段位置,偏移址1-2^16就確定了單元位置
具體表示時 2^16 可用四位十六進制數表示
舉例來說 實際物理地址 000a 0001 H (16進制的意思)的單元,是實際的地址
段地址000aH 偏移址0001 H ,這兩個是邏輯地址,經過人為分段
實際中這樣使用比較少 一般為段地址左移4位(乘以16)加上偏移址為物理地址,表示16M字空間
微機原理學得有點早了 可能有疏漏的地方 大概意思應該是對的
⑶ 在計算機編程中,我們知道在編譯器里使用的是邏輯地址,但是CPU訪問要用到實際物理地址,那這個地址是
計算機的cpu裡面都有一張tlb映射表,是一種緩存。
當cpu接收到應用程序傳過來的虛擬地址的時候,根據這張表轉換成物理地址再去訪問。是cpu邊執行邊換轉的。
具體樓主可以搜索一下tlb的相關知識。
⑷ C語言:全局變數和局部動態變數,編譯後邏輯地址就確定了嗎
對啊,整個程序運行的地址要在運行時由操作系統來分配的,而邏輯地址則是在編譯時就定下了。
⑸ 操作系統中 區分編譯後的形成邏輯地址和鏈接後的形成的最終邏輯地址 什麼意思啊
編譯後產生若干個目標模塊,編譯後的邏輯地址指的是每個模塊都從0號單元開始編址,而鏈接將這些模塊鏈接在一起,形成一個完整的裝入模塊,此時的邏輯地址會重新編址,也就是說鏈接後的邏輯地址是將整個模塊從0號單元開始編址。
⑹ 什麼是物理地址和邏輯地址是如何產生的
這個問題啊,是網路運行必須有的
物理地址就是MAC地址,是網卡上自帶的,全球唯一的地址,計算機在進行數據通訊的時候需要進行數據的封裝和導址的,在OSI七層模型中是屬於數據鏈路層的
邏輯地址就是IP地址,是虛擬的,實際不存在的,它在網路中用來定義不同的網路,使其不會發生數據混亂.在OSI七層模型中屬於第三層網路層的.
它們都是網路產生初期隨著OSI七層模型的建立而產生的.
⑺ 在編譯時為內存分配了邏輯地址,之後連接生成了可執行文件,邏輯地址在運行時會發生變化嗎
應該不會沖突,每個程序在內存中佔用的空間都是獨立的,邏輯地址只是在它自己的空間里的相對地址,正常情況下不會有交集。
⑻ 請問程序在編譯和鏈接的時候,邏輯地址是否是連續的請高手解答。謝謝。
函數內部是連續的吧,因為一起分配的棧; 不同函數的棧可能就不連續了啊
⑼ C語言的&運算符取的是邏輯地址還是物理地址 每次重新編譯運行後 輸出變數的地址值都一樣 怎麼理解
您需要了解一下操作系統的虛擬內存機制。
操作系統會為新建立的每一個進程開辟一個獨立卻完整的地址空間(32位機器是4GB),其中除了一部分地址要交給操作系統的內核或用於某些特殊功用,程序可以自由地使用這些內存,就好像每個進程可以獨自使用一台4GB內存的機器一樣。但是要注意這是由操作系統虛擬出來的,系統的內存管理器要負責把這些虛擬的內存映射到真實的物理內存中。系統往往同時運行很多進程,要把真實的內存給每個進程都分配4GB當然不可能,所以系統往往還要借用硬碟來存放物理內存存不下的內容,協助虛擬內存的實現。實際的物理內存的狀況是:零散無規律地分布著各個進程的內存頁面。
當一個新進程啟動時,操作系統首先為該進程創建虛擬內存空間,然後把程序的代碼段和一部分數據放在固定的虛擬內存地址上。你說的那個變數A就是被包含這部分數據中,每次啟動程序都可以看到它在一個固定的地址上,但是這個地址是在虛擬內存中的,實際它所對應的真實物理內存的地址是未知的,只有管理內存的系統內核知道。
當然,還有一部分數據在你的虛擬內存空間的地址也是未知的,這就是堆,堆允許程序在運行過程中動態分配和釋放內存(其他的內存分配方式在程序啟動時就在固定位置分配,不能改變),堆的分配和釋放由C運行時庫和操作系統協同管理,分配的內存地址是隨機的。你說的那個變數A不是堆中的。
你說的邏輯地址就是在虛擬內存中的地址,物理地址就是在真實的物理內存中的地址。
對於以上有不懂的概念名詞可網路查資料。
⑽ C語言,所有變數的邏輯地址都是編譯後確定的嗎
是的。程序都是在運行階段分配內存,所有變數的邏輯地址都是在編譯後就確定了,但都是相對的偏移地址,只不過全局變數是相對數據段的偏移,局部變數是相對程序棧頂的偏移。