簡介
在作業系統中,引入分段存儲管理方式的目的,主要是為了滿足用戶(程式設計師)在編程和使用上多方面的要求,如方便編程、信息共享、信息保護、動態增長、動態連結。 段表長度即段表中段的個數。段表長度在分段系統中可以判斷一個段訪問是否越界。例如,每個段在表中占有一個表項, 其中記錄了該段在記憶體中的起始地址(又稱為 “基址” )和段的長度。執行中的進程可通過查找段表找到每個段所對應的記憶體區。段表是用於實現從邏輯段到物理記憶體區的映射。每個段都有段號,在進行地址變換時,一般先將段號和段表長度比較,確定是否訪問越界。
分段
在分段存儲管理方式中,作業的地址空間被劃分為若干個段,每個段定義了一組邏輯信息。例如,有主程式段 MAIN、子程式段 X、數據段 D 及棧段 S 等,如圖 1所示。每個段都有自己的名字。為了實現簡單起見,通常可用一個段號來代替段名,每個段都從 0開始編址,並採用一段連續的地址空間。段的長度由相應的邏輯信息組的長度決定,因而各段長度不等。整個作業的地址空間由於是分成多個段,因而是二維的,亦即,其邏輯地址由段號(段名)和段內地址所組成。分段地址中的地址具有如下結構:
在該地址結構中,允許一個作業最長有 64 K 個段,每個段的最大長度為 64 KB。分段方式已得到許多編譯程式的支持,編譯程式能自動地根據源程式的情況而產生若干個段。例如,Pascal 編譯程式可以為全局變數、用於存儲相應參數及返回地址的過程調用棧、每個過程或函式的代碼部分、每個過程或函式的局部變數等等,分別建立各自的段。類似地,Fortran 編譯程式可以為公共塊(Common block)建立單獨的段,也可以為數組分配一個單獨的段。裝入程式將裝入所有這些段,並為每個段賦予一個段號。
地址變換機構
為了實現從進程的邏輯地址到物理地址的變換功能,在系統中設定了段表暫存器,用於存放段表始址和段表長度 TL。在進行地址變換時,系統將邏輯地址中的段號與段表長度TL 進行比較。若 S>TL,表示段號太大,是訪問越界,於是產生越界中斷信號;若未越界,則根據段表的始址和該段的段號,計算出該段對應段表項的位置,從中讀出該段在記憶體的起始地址,然後,再檢查段內地址 d 是否超過該段的段長 SL。若超過,即 d>SL,同樣發出越界中斷信號;若未越界,則將該段的基址 d 與段內地址相加,即可得到要訪問的記憶體物理地址。
段表機制
在請求分段式管理中所需的主要數據結構是段表。由於在應用程式的許多段中,只有一部分段裝入記憶體,其餘的一些段仍留在外存上,故須在段表中增加若干項,以供程式在調進、調出時參考。下面給出請求分段的段表項。
在段表項中,除了段名(號)、段長、段在記憶體中的起始地址外,還增加了以下諸項。
(1) 存取方式:用於標識本分段的存取屬性是只執行、唯讀,還是允許讀/寫。
(2) 訪問欄位 A: 其含義與請求分頁的相應欄位相同, 用於記錄該段被訪問的頻繁程度。
(3) 修改位 M:用於表示該頁在進入記憶體後是否已被修改過,供置換頁面時參考。
(4) 存在位 P:指示本段是否已調入記憶體,供程式訪問時參考。
(5) 增補位:這是請求分段式管理中所特有的欄位,用於表示本段在運行過程中是否做過動態增長。
(6) 外存始址:指示本段在外存中的起始地址,即起始盤塊號。