Linux系統中爲什麼不使用物理地址而是使用虛擬地址

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開始,解決程序運行地址不固定的問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章