2010-06-10 59 views
3

AFAIK,在C語言的情況下,字符串文字存儲在只讀存儲器中。 這是在硬件上實際存在的位置。只讀內存和堆內存

根據我的知識堆是在RAM.correct我,如果我錯了。

從只讀內存堆是如何不同?

是否依賴於操作系統?

回答

0

通常這是具有寫保護設置的普通進程虛擬內存。

這是依賴於實現的,但處理器通常使用特殊的元數據塊來控制對內存區域的訪問,操作系統可以相應地設置它們。所以字符串文字和所有其他不可更改的東西都被加載到一個被設置保護的區域中。所以當程序試圖修改那個內存時,處理器內部的一個特殊單元會檢查是否允許寫操作,如果它沒有被觸發,就會發出操作系統處理的硬件中斷。

3

它通常在硬件幫助下完成。

硬件的虛擬內存子系統可以被告知將頁面標記爲只讀。當應用程序嘗試寫入只讀頁面時,硬件會生成操作系統捕獲的故障。操作系統可以告訴該應用程序試圖寫一個只讀頁面並結束您的程序。

因此OS/loader確保字符串文字所在的頁面被標記爲只讀。

堆和只讀內存是正交問題。

0

從硬件角度來看RAM是RAM,它可以是R/W。 「只讀」內存是由軟件提供的屬性;在某些體系結構上(幾乎所有我們習慣的)都有硬件支持來使一部分內存不可寫(在您嘗試訪問內存中的地址時發生「異常」的意義上)。

1

它的操作系統和硬件依賴。該規範說,他們可以被置於只讀存儲器,而不是他們必須。如果你爲一個簡單的嵌入式設備編寫C語言,那麼這些字符串會被燒入ROM中,並且運行時內存將從RAM中分配;這些在物理上是分開的(Harvard)。如果它是一個典型的類Unix計算機,那麼就有虛擬內存子系統將邏輯地址轉換爲頁面中的物理地址,並可以標記一些只讀和一些可執行的頁面,但內存本身可以是數據或指令(Von Neumann)。