作業系統系列 多程序起點 0 號和 1 號程序

2021-10-16 22:30:03 字數 1132 閱讀 1267

0號程序資訊

直接初始化 pcb 資料結構來產生 0 號程序的 pcb

struct task_struct init_task =

······,,

,},//ldt

//tss

······

建立 0 號程序的使用者棧(即使用者棧 ss:esp)

將 0 號程序的使用者棧資訊放在核心棧中(巨集展開)

#define move_to_user_mode()

__asm__ (」movl #user_stack+page_size,

%%eax」

」pushl $0x17」

」pushl %

%eax」

」pushfl」

」pushl $0x0f」

」pushl $1f」

」iret」

」1: movl $0x17,%

%eax」

」movw %

%ax,

%%ds」

」movw %

%ax,

%%es」

」movw %

%ax,

%%fs」

」movw %

%ax,

%%gs」::

:」ax」)

執行「iret」指令以後,上面的 5 個重要資訊就會分別賦給 cs:eip、ss:esp、eflags。

由於現在 cs 被設定為 0x0f,ds 等被設定為 0x17,最後三位都是 111,說明是使用者態程式的**段和資料段,0 號程序的確進入了使用者態,所以這個巨集才被命名為 move_to_user_mode。

0 號程序接下來會還要做什麼呢

即 1 號程序會執行 init() 函式;而父程序,即 0 號程序要執行乙個死迴圈,即總是通過 pause() 系統呼叫將自己暫停,讓出 cpu 給別的程序。

1 號程序在 init() 函式裡會執行 execve 系統呼叫

void

init

(void){

execve

(」/bin/sh」,ar**_rc,envp_rc)

; ···

作業系統如何支援多程序

計算機啟動的時候最後執行的是main.c中的main main中的fork 建立了第乙個程序 if fork init執行了shell 如果是windows,桌面 shell的核心 pcb 狀態 佇列 用pcb放在不同的佇列中,用狀態推進這多個程序 進行狀態轉換 當然不是所有的程序都在就緒佇列中,還...

作業系統 多程序 多執行緒

對比維度 多程序多執行緒 結論資料共享 資料共享複雜,需要用ipc 共享程序資料,資料共享簡單 多程序 多執行緒 資料同步 資料是分開的,同步簡單 因為共享程序資料,同步複雜 多程序 多執行緒 記憶體 cpu 占用記憶體多,切換複雜,cpu利用率低 占用記憶體少,切換簡單,cpu利用率高 多程序 多...

作業系統 程序(1)

程序就是執行中的程式,當乙個程式被載入到記憶體之後就變為了程序 程序的出現,讓每個使用者感覺到自己在獨佔cpu,因此可以說程序就是為了在cpu上實現多道程式設計而出現的概念 物理視角 從物理記憶體的分配來看,每個程序占用一片記憶體空間,從這點上看,程序其實就是記憶體的某片空間,由於在任意時刻,乙個 ...