2016-09-18 38 views
3

進程是否可以訪問所有的RAM,或者CPU是否可以爲進程提供內核決定的特定部分,並且進程(在用戶空間中運行)不能更改?換句話說 - 是一個由硬件進行沙盒處理的進程,還是可以執行任何操作,但由操作系統監控?進程是否被硬件「沙箱化」?

編輯

有人告訴我的意見,這是太廣,所以我們假設在x86/x64。我還會補充說,在閱讀我所理解的內容時,問題就出現了,即進程可以訪問所有內存 - 這似乎與我在操作系統中讀到的有關安全性的內容相沖突。

+3

它取決於o/s(以及o/s運行的h/w),但現代操作系統限制了進程可以執行的操作,並且進程無法訪問所有內存,因爲o /它限制了它的使用範圍,部分原因在於虛擬內存管理。但是,這確實假設你正在使用內存管理系統等。如果你在嵌入式系統中使用8位微控制器,任何進程都可以訪問任何內存。但它仍然取決於h/w和o/s。 –

+1

在能夠運行現代操作系統的現代硬件中,硬件支持設置進程沙箱的邊界。主要以虛擬內存的形式,以非特權模式運行用戶空間進程(特權指令陷入內核)。 –

+0

@PeterCordes謝謝。 (順便說一下,我更新了這個問題。) – ispiro

回答

5

如果您將MS-DOS計爲「操作系統」,則進程可以執行任何操作(並且不受監視)。即使Windows95也沒有真正的內存保護,並且一個錯誤的進程可能會通過在錯誤的內存上塗寫而導致機器崩潰。

如果您只將特權分離(Unix/Linux,Windows NT和派生)的現代操作系統計算在內,則會對進程進行沙盒處理。但是,除了「如果你試圖做某件事情上的錯誤」之外,並沒有真正的系統存在任何形式的監控。內核設置邊界,如果用戶空間進程試圖超出它們,則會出現故障。

如果您想象內核可能會查看非特權進程的功能並進行相應調整,那麼不會發生這種情況。


  • https://en.wikipedia.org/wiki/Memory_protection:通常通過給每個進程自己的虛擬地址空間(virtual memory)來實現的。這是硬件支持的:您的代碼使用的每個地址都通過快速翻譯緩存(TLB)翻譯爲物理地址,緩存由OS設置的翻譯表(又名頁表)。

    進程無法直接修改自己的頁表:它必須要求內核將更多物理內存映射到其地址空間(例如,作爲malloc()的一部分)。所以內核有機會在之前驗證請求是否正確。另外,進程可以要求內核將文件(或其他文件)中的數據複製到其內存空間中。 (寫/讀系統調用)。

  • https://en.wikipedia.org/wiki/User_space:正常進程在用戶模式下運行,這是由硬件提供的模式,特權指令會陷入內核。

+0

我得到你對這個問題的回答(標題中)基本上是'是'。但是我很困惑,爲什麼你強調操作系統而不是CPU。在答案中的水平線之後,你甚至不會提到硬件。我錯過了什麼? – ispiro

+0

@ispiro:所有的沙盒機制都是硬件支持的。當我說「內核設定了界限」時,它通過編程硬件來實現,例如,設置頁表。計算機所做的一切都是CPU指令(不包括直接寫入存儲器的設備的DMA計數)。硬件只是從內存讀取指令並執行它們,根據手冊說的應該發生。 「內核確實是X」只是描述過程的高級方式。例如有關x86手冊和指南的鏈接,請參閱[x86標記wiki](http://stackoverflow.com/tags/x86/info)。 –

+0

謝謝。所以這個過程受到CPU + MMU允許訪問的限制。自從使用直接執行 - 當一個進程正在執行代碼(直到下一個中​​斷)時,我就無法圍繞CPU調用什麼「內核」 - 它只是進程和CPU。內核不存在(除非進程在用戶模式下運行,而不是在內核模式下運行,但這並不意味着內核模式代碼在那一刻有任何權限,它處於休眠狀態)。無論如何,我不會再花一點時間。現在我的問題的答案似乎很清楚。再次感謝。 – ispiro