13.5 用於程序/記憶體管理的資料結構
13.5.1 編譯過程
前面已經討論過unix用於管理檔案系統的資料結構。這一節介紹unix用於操作程序的不同資料結構(假定記憶體管理是程序管理的一部分)。
為了理解unix維護的不同資料結構,有必要了解編譯過程的基本知識。不管程序最終載入到什麼位置,編譯器生成由位址0開始的**。例如,在cobol中,資料部分從位址0開始。在定義所有的"fd"和工作儲存器之後,也許會為過程部分留一部分空間以及分配的起始位址。過程部分中第一條指令的位址就變成了該程式"文字"區的虛擬起始位址。
編譯完所有指令和生成位址後,編譯器也許要為擴充套件部分留一些空間,然後為堆疊區定義一些空間。這個過程有兩個限制:首先,分配給程序的總的虛擬位址空間(包括中間的間隙)不能超過硬體定址能力。其次,區域的虛擬位址不能相互重疊。例如,"文字區"的起始虛擬位址要比"資料區"的最高虛擬位址更高。
如圖13-26所示,可執行檔案分為四部分:
a 主標頭
b 節標頭或描述符
c 節內容
d 其他資訊
主標頭包括乙個幻數,它指明可執行檔案的型別、程式中節的個數。然後儲存了暫存器初始值,這個初始值是在程序開始執行就要載入的。該部分還包括程式計數器(pc)的值。這個值指明程式從哪個位址開始執行。它是假定程式開始執行後"文字"區中某個指令的虛擬位址。
節標頭指明節的型別,如前所述,同時還要儲存節的大小以及起始虛擬位址。
節內容儲存節真實的"內容",例如,"文字"節包含實際編譯好的機器指令。"資料"節包含不同的i/o區以及其他預留給不同表和具有各自初始值(由賦初始值語句提供)的變數的單元空間。
其他資訊包括符號表,符號表用在原始碼級除錯程式。程式開始執行時,也要載入這個符號表。它提供了不同的資料和段落名(標籤)及其機器位址。因此,當源**級的除錯程式想要顯示計數器值時,除錯程式知道從**可以獲取計數器的值。
當建立程序,而且該程序想要從被當作檔名的程式名那裡執行程式時,核心解析路徑名,並得到路徑名的索引節點。核心由該索引節點讀取要分配給該可執行檔案的實際塊。根據扇區大小,向記憶體管理器傳送請求,讓其分配期望的儲存單元,然後將實際的節載入到這些儲存單元中。如果作業系統使用分頁技術,還要設定用於位址轉換的頁面對映表,然後將暫存器初始值由主標頭載入到暫存器中。節標頭的資訊用於設定unix維護的不同資料結構,如圖13-27所示。
unix作業系統維護的資料結構如下所示:
程序表(process table,pt)
u區每個程序區域表
區域表(region table,rt)
頁面對映表(pmt)
核心堆疊
現在逐一討論這些內容。
程序的記憶體管理
一 在作業系統中,系統會給每個程序分配虛擬位址,虛擬位址的大小與處理器的位數有關,如32位處理器程序可分配4gb的虛擬記憶體供程式正常執行。這4gb的虛擬記憶體,儲存單元從位址0開始進行排序,此位址為虛擬位址。此虛擬位址可分為 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數...
linux 程序記憶體管理 資料段
所有程序 執行的程式 都必須占用一定數量的記憶體,它或是用來存放從磁碟載入的程式 或是存放取自使用者輸入的資料等等。對任何乙個普通程序來講,它都會涉及到5種不同的資料段。段 這個區域儲存著被裝入執行的二進位制機器 處理器會到這個區域取指並執行。段需要防止在執行時被非法修改,所以只准許讀取操作,而不允...
Android的記憶體,程序排程管理 (二)
在執行乙個程式時,按一下房子鍵就可以退到桌面,一般來說按一下退出鍵也可以退到桌面,這兩者有什麼區別呢?其實是有區別的,你應該根據自己的需要靈活選擇 按房子鍵,看起來似乎是退出了,但是其實這個軟體並沒有被關閉,而是轉為了 後台程式 指一般的軟體,不討論特別種類的軟體 按退出鍵,看起來也是退出沒錯,但這...