1.直接使用物理地址
(1)安全風險:
用戶有可能在程序中操作不當,直接操作了某個未知的物理地址,導致數據被改寫。有可能導致那部分內存的程序或者設備損壞。
使用虛擬地址的話,會有相對應的保護機制。
(2)地址不確定
眾所周知,編譯完成后的程序是存放在硬盤上的,當運行的時候,需要將程序搬到內存當中去運行,如果直接使用物理地址的話,我們無法確定內存現在使用到哪里了,也就是說拷貝的實際內存地址每一次運行都是不確定的,比如:第一次執行a.out時候,內存當中一個進程都沒有運行,所以搬移到內存地址是0x00000000,但是第二次的時候,內存已經有10個進程在運行了,那執行a.out的時候,內存地址就不一定了。
(3)效率低下
用的時候,我們一般的辦法是將不常用的進程拷貝到磁盤的交換分區中,好騰出內存,但是如果是物理地址的話,就需要將整個進程一起拷走,這樣,在內存和磁盤之間拷貝時間太長,效率較低。
2.虛擬地址的實現
虛擬地址實際上就相當於在物理地址和進程間引入一個第三者,一般實現方法有兩種:分段映射和分頁映射。
分段映射能夠解決安全隱患、地址不確定問題,但是對於效率問題仍然沒有很好的解決。因此引出了新的方法:分頁方式。分頁的方式實際上就是講內存以4KB為單位分頁(一頁4KB),然后在Linux內核中提供頁項目表、頁表,一個大小占多個頁的進程,在運行的時候,並不是所有的也都在運行,這時候將運行的頁拷貝到內存,這樣就緩解了效率的問題。