當前位置:首頁 » 編程軟體 » 編譯時產生邏輯地址

編譯時產生邏輯地址

發布時間: 2022-05-28 14:02:15

Ⅰ 電腦硬體知識

邏輯地址(Logical Address) 是指由程序產生的與段相關的偏移地址部分。例如,你在進行C語言指針編程中,可以讀取指針變數本身值(&操作),實際上這個值就是邏輯地址,它是相對於你當前進程數據段的地址,不和絕對物理地址相干。只有在Intel實模式下,邏輯地址才和物理地址相等(因為實模式沒有分段或分頁機制,Cpu不進行自動地址轉換);邏輯也就是在Intel 保護模式下程序執行代碼段限長內的偏移地址(假定代碼段、數據段如果完全一樣)。應用程序員僅需與邏輯地址打交道,而分段和分頁機制對您來說是完全透明的,僅由系統編程人員涉及。應用程序員雖然自己可以直接操作內存,那也只能在操作系統給你分配的內存段操作。線性地址(Linear Address) 是邏輯地址到物理地址變換之間的中間層。程序代碼會產生邏輯地址,或者說是段中的偏移地址,加上相應段的基地址就生成了一個線性地址。如果啟用了分頁機制,那麼線性地址可以再經變換以產生一個物理地址。若沒有啟用分頁機制,那麼線性地址直接就是物理地址。Intel 80386的線性地址空間容量為4G(2的32次方即32根地址匯流排定址)。

物理地址(Physical Address) 是指出現在CPU外部地址匯流排上的定址物理內存的地址信號,是地址變換的最終結果地址。如果啟用了分頁機制,那麼線性地址會使用頁目錄和頁表中的項變換成物理地址。如果沒有啟用分頁機制,那麼線性地址就直接成為物理地址了。虛擬內存(Virtual Memory) 是指計算機呈現出要比實際擁有的內存大得多的內存量。因此它允許程序員編制並運行比實際系統擁有的內存大得多的程序。這使得許多大型項目也能夠在具有有限內存資源的系統上實現。一個很恰當的比喻是:你不需要很長的軌道就可以讓一列火車從上海開到北京。你只需要足夠長的鐵軌(比如說3公里)就可以完成這個任務。採取的方法是把後面的鐵軌立刻鋪到火車的前面,只要你的操作足夠快並能滿足要求,列車就能象在一條完整的軌道上運行。這也就是虛擬內存管理需要完成的任務。在linux 0.11內核中,給每個程序(進程)都劃分了總容量為64MB的虛擬內存空間。因此程序的邏輯地址范圍是0x0000000到0x4000000。有時我們也把邏輯地址稱為虛擬地址。因為與虛擬內存空間的概念類似,邏輯地址也是與實際物理內存容量無關的。 邏輯地址與物理地址的「差距」是0xC0000000,是由於虛擬地址->線性地址->物理地址映射正好差這個值。這個值是由操作系統指定的。

下面我主要是通過實際實戰來給大家解釋說明一下相對路徑和絕對路徑的區別。

你在自己的電腦上創建了一個名字為WEB的文件夾用於來存放所有的網頁文件,WEB文件夾中有一個index.htm的網頁文件和一個名字為01的文件夾,其中01文件夾裡面有一個名字為1.htm的網頁文件。

那麼現在我在index.htm上有一個鏈接描述的連接是指向網頁文件1.htm的,那麼我們可以通過相對鏈接的形式來實現,在index.htm文件的源碼中鏈接描述應該是:<a href="01/1.htm">鏈接描述</a> 其中 01/1.htm 就是1.htm相對於index.htm的路徑。那麼從1.htm鏈接向index.htm,這樣的路徑描述應該怎麼寫呢?首先請大家看一下代碼:<a href="../index.htm">鏈接描述</a> 大家會看到鏈接路徑中出現了兩個點,這里我們使用了父路徑,兩點的意思是返回上一級文件夾,依次類推,返回多少個上一級文件夾就應該出現多少個兩點。到這里相對路徑就已經解釋完畢了。

下面來解釋一下絕對路徑的問題。

比如你現在有一個虛擬主機,這個虛擬主機綁定的域名是 www.jianzhan8.cn ,那麼你就可以在瀏覽器里通過輸入http://www.jianzhan8.cn 來訪問你的網站了。先在我們把上面的例子中的網頁文件全部上傳到虛擬主機中,那麼我們得出index.htm在網際網路上的絕對地址是 http://www.jianzhan8.cn/index.htm,網頁文件1.htm的絕對地址就是http://www.jianzhan8.cn/01/1.htm,由index.htm鏈接描述指向1.htm使用絕對路徑的代碼寫法是
<a href="http://www.jianzhan8.cn/01/1.htm">鏈接描述</a> ,由1.htm鏈接描述指向index.htm使用絕對路徑的代碼寫法是 <a href="http://www.jianzhan8.cn/index.htm">鏈接描述</a>。

關於路徑使用的建議

如果是站內文件,建議使用相對路徑,因為它比絕對路徑的代碼短,另外相對位置也比較容易找,使網站維護比較方便。至於絕對路徑,一般是做外部資源鏈接的時候才使用的。

有效地址=段地址左移4 + 偏移地址?;物理地址=段地址左移4 + 偏移地址.

有效地址究竟是=偏移地址
答:LEA r16,mem ;r16←mem的有效地址EA
有效地址的獲取
mov bx,0500h
mov si,4ch
lea bx,[bx+si+0f62h] ;BX=14AEH
這里BX得到的是主存單元的有效地址,不是物理地址,也不是該單元的內容。

Ⅱ 操作系統中 區分編譯後的形成邏輯地址和鏈接後的形成的最終邏輯地址 什麼意思啊

編譯後產生若干個目標模塊,編譯後的邏輯地址指的是每個模塊都從0號單元開始編址,而鏈接將這些模塊鏈接在一起,形成一個完整的裝入模塊,此時的邏輯地址會重新編址,也就是說鏈接後的邏輯地址是將整個模塊從0號單元開始編址。

Ⅲ 什麼是邏輯地址空間物理存儲空間

邏輯地址(Logical Address) 是指由程序產生的與段相關的偏移地址部分。例如,你在進行C語言指針編程中,可以讀取指針變數本身值(&操作),實際上這個值就是邏輯地址,它是相對於你當前進程數據段的地址,不和絕對物理地址相干。只有在Intel實模式下,邏輯地址才和物理地址相等(因為實模式沒有分段或分頁機制,Cpu不進行自動地址轉換);邏輯也就是在Intel 保護模式下程序執行代碼段限長內的偏移地址(假定代碼段、數據段如果完全一樣)。應用程序員僅需與邏輯地址打交道,而分段和分頁機制對您來說是完全透明的,僅由系統編程人員涉及。應用程序員雖然自己可以直接操作內存,那也只能在操作系統給你分配的內存段操作。線性地址(Linear Address) 是邏輯地址到物理地址變換之間的中間層。程序代碼會產生邏輯地址,或者說是段中的偏移地址,加上相應段的基地址就生成了一個線性地址。如果啟用了分頁機制,那麼線性地址可以再經變換以產生一個物理地址。若沒有啟用分頁機制,那麼線性地址直接就是物理地址。Intel 80386的線性地址空間容量為4G(2的32次方即32根地址匯流排定址)。物理地址(Physical Address) 是指出現在CPU外部地址匯流排上的定址物理內存的地址信號,是地址變換的最終結果地址。如果啟用了分頁機制,那麼線性地址會使用頁目錄和頁表中的項變換成物理地址。如果沒有啟用分頁機制,那麼線性地址就直接成為物理地址了。虛擬內存(Virtual Memory) 是指計算機呈現出要比實際擁有的內存大得多的內存量。因此它允許程序員編制並運行比實際系統擁有的內存大得多的程序。這使得許多大型項目也能夠在具有有限內存資源的系統上實現。一個很恰當的比喻是:你不需要很長的軌道就可以讓一列火車從上海開到北京。你只需要足夠長的鐵軌(比如說3公里)就可以完成這個任務。採取的方法是把後面的鐵軌立刻鋪到火車的前面,只要你的操作足夠快並能滿足要求,列車就能象在一條完整的軌道上運行。這也就是虛擬內存管理需要完成的任務。在Linux 0.11內核中,給每個程序(進程)都劃分了總容量為64MB的虛擬內存空間。因此程序的邏輯地址范圍是0x0000000到0x4000000。有時我們也把邏輯地址稱為虛擬地址。因為與虛擬內存空間的概念類似,邏輯地址也是與實際物理內存容量無關的。 邏輯地址與物理地址的「差距」是0xC0000000,是由於虛擬地址->線性地址->物理地址映射正好差這個值。這個值是由操作系統指定的。

Ⅳ C語言:全局變數和局部動態變數,編譯後邏輯地址就確定了嗎

對啊,整個程序運行的地址要在運行時由操作系統來分配的,而邏輯地址則是在編譯時就定下了。

Ⅳ 在編譯時為內存分配了邏輯地址,之後連接生成了可執行文件,邏輯地址在運行時會發生變化嗎

應該不會沖突,每個程序在內存中佔用的空間都是獨立的,邏輯地址只是在它自己的空間里的相對地址,正常情況下不會有交集。

Ⅵ 在計算機編程中,我們知道在編譯器里使用的是邏輯地址,但是CPU訪問要用到實際物理地址,那這個地址是

計算機的cpu裡面都有一張tlb映射表,是一種緩存

當cpu接收到應用程序傳過來的虛擬地址的時候,根據這張表轉換成物理地址再去訪問。是cpu邊執行邊換轉的。

具體樓主可以搜索一下tlb的相關知識。

Ⅶ C語言,所有變數的邏輯地址都是編譯後確定的嗎

是的。程序都是在運行階段分配內存,所有變數的邏輯地址都是在編譯後就確定了,但都是相對的偏移地址,只不過全局變數是相對數據段的偏移,局部變數是相對程序棧頂的偏移。

Ⅷ linux 內存管理虛擬空間地址轉換虛擬邏輯地址編譯問題

一、概念

物理地址(physical address)
用於內存晶元級的單元定址,與處理器和CPU連接的地址匯流排相對應。
——這個概念應該是這幾個概念中最好理解的一個,但是值得一提的是,雖然可以直接把物理地址理解成插在機器上那根內存本身,把內存看成一個從0位元組一直到最大空量逐位元組的編號的大數組,然後把這個數組叫做物理地址,但是事實上,這只是一個硬體提供給軟體的抽像,內存的定址方式並不是這樣。所以,說它是「與地址匯流排相對應」,是更貼切一些,不過拋開對物理內存定址方式的考慮,直接把物理地址與物理的內存一一對應,也是可以接受的。也許錯誤的理解更利於形而上的抽像。

虛擬內存(virtual memory)
這是對整個內存(不要與機器上插那條對上號)的抽像描述。它是相對於物理內存來講的,可以直接理解成「不直實的」,「假的」內存,例如,一個0x08000000內存地址,它並不對就物理地址上那個大數組中0x08000000 - 1那個地址元素;
之所以是這樣,是因為現代操作系統都提供了一種內存管理的抽像,即虛擬內存(virtual memory)。進程使用虛擬內存中的地址,由操作系統協助相關硬體,把它「轉換」成真正的物理地址。這個「轉換」,是所有問題討論的關鍵。
有了這樣的抽像,一個程序,就可以使用比真實物理地址大得多的地址空間。(拆東牆,補西牆,銀行也是這樣子做的),甚至多個進程可以使用相同的地址。不奇怪,因為轉換後的物理地址並非相同的。
——可以把連接後的程序反編譯看一下,發現連接器已經為程序分配了一個地址,例如,要調用某個函數A,代碼不是call A,而是call 0x0811111111 ,也就是說,函數A的地址已經被定下來了。沒有這樣的「轉換」,沒有虛擬地址的概念,這樣做是根本行不通的。
打住了,這個問題再說下去,就收不住了。

邏輯地址(logical address)
Intel為了兼容,將遠古時代的段式內存管理方式保留了下來。邏輯地址指的是機器語言指令中,用來指定一個操作數或者是一條指令的地址。以上例,我們說的連接器為A分配的0x08111111這個地址就是邏輯地址。
——不過不好意思,這樣說,好像又違背了Intel中段式管理中,對邏輯地址要求,「一個邏輯地址,是由一個段標識符加上一個指定段內相對地址的偏移量,表示為 [段標識符:段內偏移量],也就是說,上例中那個0x08111111,應該表示為[A的代碼段標識符: 0x08111111],這樣,才完整一些」

線性地址(linear address)或也叫虛擬地址(virtual address)
跟邏輯地址類似,它也是一個不真實的地址,如果邏輯地址是對應的硬體平台段式管理轉換前地址的話,那麼線性地址則對應了硬體頁式內存的轉換前地址。

-------------------------------------------------------------
CPU將一個虛擬內存空間中的地址轉換為物理地址,需要進行兩步:首先將給定一個邏輯地址(其實是段內偏移量,這個一定要理解!!!),CPU要利用其段式內存管理單元,先將為個邏輯地址轉換成一個線程地址,再利用其頁式內存管理單元,轉換為最終物理地址。

這樣做兩次轉換,的確是非常麻煩而且沒有必要的,因為直接可以把線性地址抽像給進程。之所以這樣冗餘,Intel完全是為了兼容而已。

2、CPU段式內存管理,邏輯地址如何轉換為線性地址
一個邏輯地址由兩部份組成,段標識符: 段內偏移量。段標識符是由一個16位長的欄位組成,稱為段選擇符。其中前13位是一個索引號。後面3位包含一些硬體細節,如圖:

最後兩位涉及許可權檢查,本貼中不包含。

索引號,或者直接理解成數組下標——那它總要對應一個數組吧,它又是什麼東東的索引呢?這個東東就是「段描述符(segment descriptor)」,呵呵,段描述符具體地址描述了一個段(對於「段」這個字眼的理解,我是把它想像成,拿了一把刀,把虛擬內存,砍成若乾的截——段)。這樣,很多個段描述符,就組了一個數組,叫「段描述符表」,這樣,可以通過段標識符的前13位,直接在段描述符表中找到一個具體的段描述符,這個描述符就描述了一個段,我剛才對段的抽像不太准確,因為看看描述符裡面究竟有什麼東東——也就是它究竟是如何描述的,就理解段究竟有什麼東東了,每一個段描述符由8個位元組組成,如下圖:

這些東東很復雜,雖然可以利用一個數據結構來定義它,不過,我這里只關心一樣,就是Base欄位,它描述了一個段的開始位置的線性地址。

Intel設計的本意是,一些全局的段描述符,就放在「全局段描述符表(GDT)」中,一些局部的,例如每個進程自己的,就放在所謂的「局部段描述符表(LDT)」中。那究竟什麼時候該用GDT,什麼時候該用LDT呢?這是由段選擇符中的T1欄位表示的,=0,表示用GDT,=1表示用LDT。

GDT在內存中的地址和大小存放在CPU的gdtr控制寄存器中,而LDT則在ldtr寄存器中。

好多概念,像繞口令一樣。這張圖看起來要直觀些:

首先,給定一個完整的邏輯地址[段選擇符:段內偏移地址],
1、看段選擇符的T1=0還是1,知道當前要轉換是GDT中的段,還是LDT中的段,再根據相應寄存器,得到其地址和大小。我們就有了一個數組了。
2、拿出段選擇符中前13位,可以在這個數組中,查找到對應的段描述符,這樣,它了Base,即基地址就知道了。
3、把Base + offset,就是要轉換的線性地址了。

還是挺簡單的,對於軟體來講,原則上就需要把硬體轉換所需的信息准備好,就可以讓硬體來完成這個轉換了。OK,來看看Linux怎麼做的。

Ⅸ C語言的&運算符取的是邏輯地址還是物理地址 每次重新編譯運行後 輸出變數的地址值都一樣 怎麼理解

你自定義的變數A,在你編譯的時候就已經確定了,所以是一個相對地址。

程序執行時,系統會分配一片內存空間供程序使用,當如果你定義的變數A不是相對地址的話,那麼每次分配內存是都要再次申請內存空間,顯然是不合理的。

所以變數A是相對地址,你程序內存空間起始地址為0,A的地址就是相對於起始地址,這一定程度上也算是一種邏輯上的地址吧...但是和操作系統的邏輯地址不一樣

Ⅹ 高級語言源程序編譯後產生的地址是邏輯地址還是物理地址

由於操作系統技術的發展,可重用二進製程序技術使用了內存重定位技術,所以從匯編的角度來看即不是邏輯地址也不是物理地址。而且這個概念有些不同,編譯後產生的地址是相對地址,是相對於可執行頭部位置的地址。而邏輯地址是指在指令系統內部使用的用來訪問內存的一個邏輯表示,通常表現為相對於某個段基地址的偏移量。
當可執行程序被載入內存之後,才會有邏輯地址存在,此時可執行程序被如何載入於何處,地址為多少,由操作系統決定,此時cpu訪問程序用的是邏輯地址。一個程序一旦被編譯確定之後基本上變數初始化的順序固定,資源分配位置也固定,設置有編譯器使用預分配機制,然後採用相對地址引用。
注意:某些工具書也稱二進制可執行文件內所有的相對地址范圍是邏輯地址空間,相對地址就是邏輯地址。因為兩者的訪問方式相似,邏輯地址變換依賴cpu或者附加變換機構(硬體),而二進製程序地址空間變換需要操作系統插手管理。
反匯編分析中常常將二進制內部地址稱為邏輯地址,因為反匯編器不能還原原來匯編代碼的地址跳轉空間特性,因此得到一個相對於二進制數據起點位置的相對地址,而和內存和物理存儲都沒有關系。

熱點內容
shell腳本日誌輸出 發布:2024-05-03 06:31:04 瀏覽:713
伺服器快捷方式是什麼意思 發布:2024-05-03 06:28:18 瀏覽:108
我的世界怎麼成為伺服器最靚的仔 發布:2024-05-03 06:26:44 瀏覽:853
安卓手機用博雅mm1用什麼軟體 發布:2024-05-03 06:19:23 瀏覽:693
演算法鍵值 發布:2024-05-03 06:16:52 瀏覽:5
qq密碼哪裡開啟 發布:2024-05-03 06:03:23 瀏覽:579
全排列的遞歸演算法 發布:2024-05-03 05:42:28 瀏覽:901
肥胖的演算法 發布:2024-05-03 05:38:09 瀏覽:783
兩個資料庫事務 發布:2024-05-03 05:33:41 瀏覽:855
phpjson轉 發布:2024-05-03 05:33:40 瀏覽:659