1. 程式人生 > >對軟體中地址的一些隨意想法

對軟體中地址的一些隨意想法

     個人的學習習慣是對一個陌生的東西從輪廓上有一個巨集觀的瞭解,然後在從細節上去補充。對軟體的認知也是如此;

     程式的實質就是將資料從一個地址搬運到另外一個地址或者從一個地址搬運到CPU進行加工處理後,再返回給某個地址的過程。對軟體內容的操作首先要做的就是定址;那麼到底什麼是地址呢?

     為了便於理解,我們構建瞭如下場景:

     我們有一個廚師(CPU)在武漢,我們的食材倉(硬碟)在深圳,我們要對食材進行加工,我們就必須把食材運送到武漢,運輸的方法有很多種,有飛機,有高鐵,有火車,甚至是自行車,倘若我們自行車來運送食物可否?當然可以,但是廚師一天裡面估計有半天的時間在空閒著,作為老闆的你(程式設計工程師)而言,估計要氣死了。所以,我們一定會選用飛機(用價格來換取速度)做資料運送的工具,只有這樣,廚師的工作才相當於是飽和的。此時的飛機,就相當於記憶體,所以,所有資料(菜)的加工都是需要通過飛機(記憶體)來完成。

     我們的備用倉庫有1024個G,甚至更大,而我們的飛機假設只有2G,每個房間可以裝載4K個菜,所以飛機上有50萬個房間,每個房間都有一個編號,這個編號就是實體地址,是實實在在存在的。每個菜加工後要麼放回飛機上原地址上,要麼放置在飛機上新的地址上。可以看到,CPU上處理的都是實體地址。但是我們不能對飛機地址進行操作,這樣太不安全了,即設我們本來需要製作的美味的鮑魚變成了一盤毒砒霜,帶給你的後果只能是死亡了。所以中間傳輸的空間非常重要,一不小心,就掛掉了。為了安全,必須遮蔽使用者操作,交由系統來處理。

     程式設計的實質就是將把我們所需要的菜(結果),將不同的原料(即資料)按照做菜的方法寫程菜譜(即程式),此時的資料並不是孤零零的,而是存在一定的邏輯關係的,即我們通常所說的上下文連結關係。此時是沒有地址概念的。

     如果我們通過編譯器將我們的菜譜進行編譯,我們的資料便有了地址了,不同的資料之間依舊存在相應的邏輯關係,此時的地址就叫做邏輯地址。

     (關於邏輯地址和實體地址,網友有一個很形象的描述:   

     看過爸爸去哪兒嗎?五位爸爸要選房,房子的地址是XX街道YY巷ZZ號,這個是實體地址,導演給房子分配了1-5的編號,這個是邏輯地址,爸爸們聊天時會說你在3號房,我在5號房,但實際回家的時候確實回到XX街道YY巷ZZ號。列印變數地址是邏輯地址,就算是用匯編操作的也是邏輯地址,只有作業系統知道實體地址,邏輯地址跟實體地址都是一個32位整數)

     廚師處理的地址都是飛機上的實體地址(菜譜不是記在廚師心中,而是包含在不同菜的對應的上下文關係中,按照這種上下文關係,廚師就可以製作出相應的菜),而我們軟體工程師所處理的是邏輯地址,這兩個地址是獨立的,但是同時一定存在著某一種聯絡。

     首先,我們的邏輯地址是沒有涉及到記憶體的概念的,所以是以4G為容量大小的(譬如地址線為32位),所以邏輯地址也是一種虛擬地址;

     其次,這個邏輯地址和實體地址是存在某種對應關係的,這種對映關係就是某種演算法,最簡單的方法就是邏輯地址+一個參考地址,這樣通過邏輯地址就可以直接得到實體地址(不涉及到分頁技術);

     我們舉一個簡單的例子來說明邏輯地址和線性地址以及實體地址之間的對應關係:

     mov    0x80495b0, A   0x80495b0就是邏輯地址(程式設計師所看到的地址);