今天整理讀書筆記,發現了一個之前沒注意到的,或者自己一直忽略的地方:
《深入理解Linux內核》一書中,關于內存尋址這一章,提到了“硬件中的分段”、“Linux中的分段”、“硬件中的分頁”和“Linux中的分頁”四個概念,所謂的硬件上的分段、分頁,是針對CPU在實模式下,即操作系統尚未加載啟動之前所采用的內存尋址方式,而軟件上的分段、分頁,則是CPU在保護模式下,即操作系統啟動后所采用的內存尋址方式。
在這里再引出”實模式“和”保護模式“的概念:
**x86體系的處理器剛開始時只有20根地址線,尋址寄存器是16位。可以訪問64K的地址空間,如果程序要想訪問大于64K的內存,就需要把內存分段,每段64K,用段地址+偏移量的方式來訪問,這樣使20根地址線全用上,最大的尋址空間就可以到1M字節,這在當時已經是非常大的內存空間了。**
**實模式將整個物理內存看成分段的區域,程序代碼和數據位于不同區域,系統程序和用戶程序并沒有區別對待,而且每一個指針都是指向實際的物理地址。**這樣一來,用戶程序的一個指針如果指向了系統程序區域或其他用戶程序區域,并修改了內容,那么對于這個被修改的系統程序或用戶程序,其后果就很可能是災難性的。再者,隨著軟件的發展,1M的尋址空間已經遠遠不能滿足實際的需求了。最后,對處理器多任務支持需求也日益緊迫,所有這些都促使新技術的出現。
為了克服實模式下的內存非法訪問問題,并滿足飛速發展的內存尋址和多任務需求,處理器廠商開發出保護模式。在保護模式中,除了內存尋址空間大大提高;提供了硬件對多任務的支持;**物理內存地址也不能直接被程序訪問,程序內部的地址(虛擬地址)要由操作系統轉化為物理地址去訪問,程序對此一無所知。**至此,進程(程序的運行態)有了嚴格的邊界,任何其他進程根本沒有辦法訪問不屬于自己的物理內存區域,甚至在自己的虛擬地址范圍內也不是可以任意訪問的,因為有一些虛擬區域已經被放進一些公共系統運行庫。這些區域也不能隨便修改,若修改就會有出現linux中的段錯誤,或Windows中的非法內存訪問對話框。