2.4 程序管理相關的系統呼叫
從使用者狀態切換到核心態的方法,依不同的體系結構二各有不同。這兩種狀態之間切換的機制,並解釋使用者空間和核心空間之間如何交換引數。就目前而言,將核心視為有c標準使用的「程式庫」即可。
***********************************===
2.4.1 程序複製
傳統的unix中用於複製程序的提供呼叫時fork.但他並不是linux為此實現的唯一呼叫,實際上linux實現了3個。
(1)fork是重量級呼叫,因為它建立了父程序的乙個完整副本,然後作為子程序執行。為減少與該呼叫相關的工作量,linux使用了些事複製(copy-on-write)技術。
(2)vfork類似於fork,但並不建立父程序資料的副本。相反,父子程序之間共享資料。vfork設計用於子程序形成後立即執行execve系統呼叫載入新程式的情形。在子程序退出或開始新程式之前,核心保證父程序處於堵塞狀態。
(3)clone產生執行緒,可以對父子程序之間的共享,複製程序精確控制。
1.寫時複製
核心使用了寫時複製(copy-on-write,cow)技術,以防止在fork執行時將父程序的所有資料複製到子程序。
2.執行系統呼叫
fork \vfork和clone系統呼叫的入口點分別是sys_fork sys_vfork和sys_clone函式,其定義以來與具體的體系結構,因為在使用者可能更加愛你和核心空間之間傳遞引數的方法因體系結構而異。上述函式的任務是從處理器暫存器中提取由使用者空間提供的資訊,呼叫體系結構無關的do_fork函式,後者負責程序複製。
do_fork(unisgned long clone_flags,
unsigned long stack_start,
struct pt_reg *regs,
unsigned long stack_size,
int __user *parent_tidptr,
int __user *child_tidptr)
改函式需要下列引數。
*clone_flags是乙個標誌集合,用來指定控制複製過程的一些屬性。
*start_stack是使用者狀態下棧的起始位址。
*regs是乙個指向暫存器集合的指標,其中以原始形式儲存了呼叫引數。改引數使用的資料型別是特定於體系結構的struct pt_regs,其中按照系統呼叫執行時暫存器在核心棧上的儲存順序,儲存了所有的暫存器。
*stack_size是使用者狀態下棧的大小。
*parent_tidptr和child_tidptr是指向使用者空間位址的兩個指標,分貝指向父子程序tid.
在子程序生成之後,核心必須執行下列收尾操作:
*由於fork要返回新程序的pid,因此必須獲得pid.
*如果將要使ptrace監控新的程序,那麼在建立信程序後會立即向器傳送sigstop訊號。
*子程序使用wake_up_new_task喚醒。換言之,即將器task_struct新增到排程器佇列。
*如果使用vfork機制(核心通過設定的clone_vfork標誌識別),必須啟用子程序的完成機制。
*通過採用這種方法,核心可以確保使用vfork生成的子整合的父程序會一直處於不活動狀態,直至子程序退出或執行乙個新的程式。
複製程序
在do_fork中大多數工作時有copy_process函式完成的,器**流程。請注意,改函式必須處理3個系統呼叫。
thread_info儲存了特定於體系結構的組合語言嗲嗎需要訪問的案部分程序資料。儘管該結構的定義因不同的處理器而不同。
程序相關的系統呼叫3
一,程序等待 wait函式 標頭檔案 include include 函式原型 pid t wait int status 返回值 成功 失敗是否設定errno 結束的子程序的pid和結束狀態 1 設定 引數說明 status用於接收子程序結束返回狀態值的引數。如果不關心子程序的返回狀態,statu...
系統呼叫,程序切換
模式切換 不等同於 程序上下文切換 當程序呼叫系統呼叫或者發生中斷時,cpu從使用者模式 使用者態 切換成核心模式 核心態 此時,無論是系統呼叫程式還是中斷服務程式,都處於當前程序的上下文中,並沒有發生程序上下文切換。當系統呼叫或中斷處理程式返回時,cpu要從核心模式切換回使用者模式,此時會執行作業...
系統呼叫相關理解
系統呼叫是核心提供的使用者程序與核心進行互動的一組介面 是應用程式受限地訪問介面 提供了建立新程序並與已有程序進行通訊的機制 提供了申請作業系統其它資源的能力 是使用者訪問核心的唯一手段。主要是為了保證系統穩定可靠,避免應用程式肆意妄為。系統呼叫作為使用者空間程序和硬體裝置之間的中間層,主要作用有以...