設定核心執行環境之隔離的應用程式

2022-04-10 18:57:53 字數 1071 閱讀 9078

隔離的應用程式

本文節選自《寒江獨釣》一書

對於許多只進行高階語言的使用者模式的應用程式程式設計的讀者而言,編寫乙個「程式」在大多數情況下等價於編寫乙個可執行的應用程式。在windows下,這意 味著建造乙個exe檔案。乙個exe檔案被雙擊執行後,在windows系統中,產生乙個「程序」(process)。雖然在高階語言中很多細節被忽略, 但是在單個程序內的程式設計具有以下的特點:

(1)可以自由使用通用暫存器,不用關心這些暫存器被其他程序修改。換句話說,不同程序(本質上是執行緒)看似各自擁有一套通用暫存器。

(2)原則上可以自由使用0~n範圍內的記憶體空間。n的大小取決於作業系統的位數(32位或者64位)。在windows上實際程式設計有一些限制,但這些細 節暫時忽略,不用關心這些記憶體空間被其他程序修改。如果讀者編寫乙個程式,對乙個變數取位址,然後把這個位址設法傳遞給其他程序,那麼另乙個程序看見的地 址中的內容是一樣的嗎?答案當然是否定的,每個程序的使用者空間記憶體是隔離的。

(3)通過作業系統約定的方式與其他程序共享其他資源,比如網路。大多數作業系統要求程序在使用tcp協議時必須開啟乙個埠,以避免和其他程序衝突。

因為有了這些特點,所以在單個程序內程式設計變得非常容易。程式設計者只需要定義和使用本程序所需要的資源,並編寫**操作這些資源即可,不需要關心其他程序。

雖然cpu有一些特性支援程序的隔離,但是更重要的是作業系統應用這些特性給各個程序提供了資源隔離的種種措施。這使應用程式的程式設計變得簡單了,而且也變得更安全。因為大部分獨立的應用程式,都不希望被其他應用程式影響。這中間的問題值得讀者思考:

既然乙個程序的可執行**,都載入在這個程序的記憶體空間範圍內,那麼那些需要呼叫作業系統的呼叫才能實現的功能(比如說讀取硬碟。大家應該不記得自己曾經 讀/寫埠,或者做過dma,去實現讀取硬碟的操作,顯然驅動程式已經提供了這些功能),所需要的**,它們位於什麼空間呢?也在這個程序的記憶體空間範圍 內嗎?

答案當然是肯定的。不大可能有隔離的空間去容納作業系統核心的**(包括驅動程式)。

既然如此,是不是乙個應用程式中的**,就可以直接訪問到作業系統的核心**了呢?當然,如果是這樣的話,那麼只要編寫乙個應用程式,就可以直接修改作業系統核心的**了(既然知道它們在**,當然總是可以設法修改它們)。

轉貼 如何在沒有IIS的環境中執行Web程式

在微軟 net平台中,自從visual studio 2005 以後的版本編寫web程式的時候,可以在沒有iis的環境中編譯和除錯,每次除錯的時候都會執行起乙個 asp.net development server 的服務,這個服務和iis類似,可以說是iis的簡化版,雖然不如iis完善和成熟但是用...

linux核心,驅動,應用程三者的概念和之間的關係

驅動程式屬於核心的乙個部分。準確的說是核心的乙個元件。不包含驅動的核心也叫做核心,並且這也是我們常說的核心。核心要幹的事情無非5件。1,記憶體管理 2,虛擬檔案系統 3,程序排程 4,網路介面 5,程序間通訊 驅動更像是核心的擴充套件元件來幫助核心實現硬體的連線和操控。核心通過提供統一的驅動操作介面...

深度學習GPU執行環境的檢視和設定

使用nvidia smi來查詢gpu資訊 nvidia smi是乙個命令列工具,可以幫助你管理操作gpu device,並且允許你查詢和更改device狀態。在windows命令提示符中輸入cd c program files nvidia corporation nvsmi,再輸入nvidia s...