乙個程序的上下文包括:使用者級上下文,暫存器上下文和系統級上下文。
使用者級上下文:正文,資料,使用者棧區和共享儲存區;
暫存器上下文:程式暫存器(ip),即cpu將要執行的下一條指令位址;處理機狀態暫存器(eflags);棧指標;通用暫存器。
系統級上下文:程序表項(proc結構)和u區,在linux系統中,這兩部分被合成task_struct,區表及頁表,核心棧等。
全部的上下文資訊構成了乙個程序的執行環境,當發生程序排程時,必須對全部的上下文資訊進行切換,新排程的程序才能夠執行。我們可以將程序看成乙個上下文集合的抽象概念。,
u區
u區包括與程序相關的內容。它可以是程序表自身的一部分,但要單獨維護,因為這部分可以在上下文切換的時候和程序映象進行交換。記憶體仍保留該程序在程序表中的條目,因為對於程序排程和控制以及決定交換程序的時間而言,該資訊必不可少。u區包括以下字段:
(1) 指標:指向該程序對應程序表中的條目。為避免混亂,圖中並沒有給出該指標。
(2) 真實有效的使用者id:指明程序的許可權,如檔案訪問許可權。
(3) 控制終端:該欄位確定與程序相關的"邏輯終端"。
(4) 計時器:該欄位分別指明程序在使用者模式和核心模式下的執行時間。
(5) 佇列:指明程序想要響應不同訊號的方式。當該程序對應的訊號到達時,查詢佇列並採取適當的動作。
(6) 當前目錄和當前根目錄:描述程序所處的檔案系統環境。當使用者想要從乙個目錄轉換到另乙個目錄時,從本質上講,這個欄位被改動。同樣還要使用該字段由相對路徑名連線後構造絕對路徑名。
(7)使用者檔案描述符
:該錶維護程序用不同模式開啟的檔案,前面已經介紹過。
(8) 許可權:該欄位幫助程序在建立檔案時設定許可權掩碼位。它表示u區中的這些許可權位可被用作以"creat"系統呼叫作為引數提供的這些許可權位的掩碼。最終將這些結果許可權位設定為該檔案索引節點中的許可權。因此,該程序建立或開啟的所有檔案根據掩碼可以拒絕某種許可權。
(9) 最大值:該欄位限制程序的大小以及程序可以寫的檔案的大小。
(11) 返回值:該欄位儲存系統呼叫產生的結果。
(12) 錯誤:該欄位記錄該程序提交的系統呼叫在執行期間遇到的錯誤。準確含義在前面討論系統呼叫的時候就已經討論過,這裡不再介紹。
(10)、(11)、(12)實際上是在u區中預留給系統呼叫執行的工作區。有乙個分隔的區域包括儲存系統呼叫需要使用的引數(10),這個引數可 在u區和堆疊之間傳遞引數。有乙個區域包括儲存系統呼叫產生的結果(11),和乙個儲存錯誤**(12)的區域,錯誤**(12)是在系統呼叫執行期間出 現錯誤。然後,核心解發布現的錯誤**,並採取相應的動作。
linux 程序記憶體管理 資料段
所有程序 執行的程式 都必須占用一定數量的記憶體,它或是用來存放從磁碟載入的程式 或是存放取自使用者輸入的資料等等。對任何乙個普通程序來講,它都會涉及到5種不同的資料段。段 這個區域儲存著被裝入執行的二進位制機器 處理器會到這個區域取指並執行。段需要防止在執行時被非法修改,所以只准許讀取操作,而不允...
程序的記憶體管理
一 在作業系統中,系統會給每個程序分配虛擬位址,虛擬位址的大小與處理器的位數有關,如32位處理器程序可分配4gb的虛擬記憶體供程式正常執行。這4gb的虛擬記憶體,儲存單元從位址0開始進行排序,此位址為虛擬位址。此虛擬位址可分為 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數...
linux 環境變數(linux程序記憶體管理)
資料的內部儲存 大端 低位址存高位數 小端 高位址存高位數 段 乙個程式多數情況下是不需要更改自身 的,只有一種情況例外,就是一些長時間執行的公升級程式。另一種解決方案為採用共享庫的形式 資料段 包含程式中明確給定初值的全域性變數和靜態變數。緩衝段 通常是沒有明確給定初值的全域性變數和靜態變數。棧 ...