1、物理地址
物理地址實際上就是硬件設備上實際的存儲設備
2、虛擬地址
虛擬地址是Linux內核虛擬出來的地址,經由MMU內存管理單元映射到實際的物理地址。MMU是實際的管理內存的硬件。
3、直接使用物理地址
如果直接使用物理地址的話:
(1)安全風險
每個進程都可以訪問0-4G的任意的內存空間,這也就意味着任意一個進程都能夠去讀寫系統相關內存區域,如果是一個
木馬病毒,那麼他就能隨意的修改內存空間,讓設備直接癱瘓
(2)地址不確定
衆所周知,編譯完成後的程序是存放在硬盤上的,當運行的時候,需要將程序搬到內存當中去運行,如果直接使用物理地址的話,我們無法確定內存現在使用到哪裏了,也就是說拷貝的實際內存地址每一次運行都是不確定的,比如:第一次執行a.out時候,內存當中一個進程都沒有運行,所以搬移到內存地址是0x00000000,但是第二次的時候,內存已經有10個進程在運行了,那執行a.out的時候,內存地址就不一定了
(3)效率低下
如果直接使用物理內存的話,一個進程就是作爲一個整體(內存塊)操作的,如果出現物理內存不夠用的時候,我們一般的辦法是將不常用的進程拷貝到磁盤的交換分區中,好騰出內存,但是如果是物理地址的話,就需要將整個進程一起拷走,這樣,在內存和磁盤之間拷貝時間太長,效率較低。
4、虛擬地址實現
虛擬地址實際上就相當於在物理地址和進程間引入一個第三者,一般實現方法有兩種:分段映射和分頁映射。
分段映射(來源網絡)
分段映射能夠解決安全隱患、地址不確定問題,但是對於效率問題仍然沒有很好的解決。因此引出了新的方法:分頁方式。分頁的方式實際上就是講內存以4KB爲單位分頁(一頁4KB),然後在Linux內核中提供頁項目表、頁表,一個大小佔多個頁的進程,在運行的時候,並不是所有的也都在運行,這時候將運行的頁拷貝到內存,這樣就緩解了效率的問題。
5、進程虛擬4G內存空間
對於硬件來說只有4G的實際物理地址,每個程序在編譯的時候,都在鏈接階段,將elf程序虛擬地址設置在0x8048000開始,解決程序運行地址不固定的問題