從控制代碼的概念再看分層設計

2021-05-21 19:32:53 字數 1653 閱讀 7879

幾個層次問題,首先物理記憶體和虛擬記憶體,作業系統管理物理記憶體,而使用者程序使用虛擬記憶體,作業系統呈現給使用者程序的是連續的虛擬記憶體但是不一定連續的物理記憶體,物理記憶體隨時在變化,但是對於使用者程序來說其虛擬記憶體位址是不變的;其次是指標和控制代碼,作業系統為了向使用者空間提供若干臺虛擬機器並且又要管理一些所有程序需要的系統服務,必然不能將核心資料結構呈現給程序,但是程序確實可以使用這種資料,因此控制代碼就出現了,控制代碼其實是指標的指標,雖然它不是真正意義上的指標,由於作業系統管理的資料結構易變,並且處於高特權級,所以作業系統不能將之開放給使用者空間,使用者空間只能通過控制代碼來呼叫系統服務,進入核心之後,核心會根據控制代碼找到真正的核心資料結構,很多實現中控制代碼就是核心中程序塊中乙個表的索引字段,因為虛擬機器是基於程序的,比如linux的task_struct中的開啟檔案表,在windows中的做法更是深刻,一切都是物件,因此每個物件都有控制代碼,程序,執行緒本身,檔案,裝置,視窗,...都有控制代碼,其程序塊中有乙個控制代碼表,每乙個元素代表乙個物件。正是因為windows的一切皆物件特性,其可以操作遠端程序,因為程序是乙個物件,而物件有控制代碼,有了控制代碼就可以操作,win32api中很多介面都是基於控制代碼的物件操作介面,在linux中似乎只有檔案體現為控制代碼,也只有檔案是程序可以共享的,由於沒有別的控制代碼,因此也就不能隨意操作別的物件。

控制代碼隱藏了核心的管理細節,呈現給程序乙個平滑的結構,實際上控制代碼指向的真正的結構的位址是可以變化的,正如乙個指標不變的情況下,其指向的資料可以變化,控制代碼的作用有二:第一,隱藏不必要的操作,作為唯一介面由api只開放可用的安全操作;第二,類似物理記憶體和虛擬記憶體的關係,向使用者空間提供乙個穩定的結構操作把手,將抽象從作業系統提公升到程序。在作業系統中,抽象是基於檔案,裝置的,但是到了程序就統一都成了控制代碼,體現了在控制代碼指向的資料結構上的多路復用,按照分層原則,上層可以在下層提供的乙個位址格式上多路復用,按照抽象的原則,越往上抽象程度越高,正如tcp和udp可以復用乙個ip位址一樣,多個程序的多個控制代碼可以指向同乙個核心資料結構。

控制代碼是乙個層次間通訊的通道,每乙個程序虛擬機器都通過控制代碼來使用共享的作業系統核心服務,但是這只是一類服務,程序虛擬機器並不是靠控制代碼來使用作業系統的一切服務的,還有一類服務和作業系統一樣可以直接使用更底層的硬體機制,比如mmu。前面的一篇文章說過,作業系統給程序虛擬機器抽象兩類指令,一類是安全的指令,這類指令直接並且始終在cpu-記憶體之間執行,執行這類指令不需要經過作業系統層,還有一類指令不是僅僅在cpu執行,而是牽扯到了沒有提供多道程式環境的io外設,對於這些資源的訪問,程序必須使用作業系統的服務而不能直接使用硬體機制了。對於mmu而言,其實也是一種和控制代碼類似的抽象,多cpu上同時執行的不同程序可以同時訪問相同的虛擬位址(非共享記憶體),但是通過mmu轉換後的實體地址卻不同,這就是多路復用概念的引申。本質上講,mmu和作業系統核心是屬於同一層次的,只不過mmu是硬體固有的機制,而作業系統核心提供一些管理策略,對於控制代碼而言,不同程序可以使用相同的控制代碼,但是指向的實際核心資料結構卻不一定相同,因為控制代碼和虛擬記憶體一樣,只在程序內部有意義,控制代碼是程序中核心資料結構的索引,是為了使用者程序訪問核心資料結構而設計的,這種設計非常好,規定了使用者訪問核心資料結構只能在規則下進行,而規則就是以控制代碼而引數的api的實現,其實就是系統呼叫的實現。

開放的控制代碼越多,對作業系統設計的安全要求就越高,只要有控制代碼,在得到控制代碼表的情況下就很容易得到實際的資料,在windows上,系統漏洞很多由此而發,而linux上僅僅開放了開啟檔案這個控制代碼,類似的漏洞也就很少了。為什麼?控制代碼其實就是指標的指標,只不過這裡的指標的含義更加抽象了,不是一般意義上的指標

控制代碼的概念

所謂控制代碼就是乙個 long型的資料。控制代碼是windows 用於表示應用程式建立出來的物件的唯一的整數。windows 使用各種各樣的控制代碼來標識應用程式例項,視窗控制,位圖,gdi物件等等。windows 控制代碼有點像 c語言中的檔案控制代碼。從上面的定義我們可以看到,控制代碼是乙個識別...

控制代碼 的概念

與老的語法主要的混淆是我們習慣於使用 符號來宣告拖管引用或非拖管指標,在c cli裡微軟引入了控制代碼的概念。void tmain 符號代表乙個託管物件 宣告時看上去象個帽子 按照cli的規定,控制代碼代表乙個拖管物件的引用。控制代碼在cli中是新的語法,相當於c 中的 gc指標。控制代碼與指標不再...

標稱屬性的概念分層

tag c 分離字串 vector陣列去重 資料探勘 資料預處理 資料變換 資料離散化 標籤屬性的概念分層 注意到乙個啟發規則 較高概念分層的屬性,通常包含較少的不同值 以,國家這一屬性包含的不同值的個數,和省或者州包含的不同取值數比較,前者個數顯然較少 號開始的行是注釋 非注釋行的第一行表示屬性的...