1.核心態和使用者態
對於一台計算機來說,有些硬體的控制直接影響到計算機是否可以穩定的執行。作業系統為了維持計算機的可持續的工作,要對這些可能影響到系統穩定的因素進行嚴格控制,不能讓使用者隨意進行操作。這就是作業系統區分核心態和使用者態的思想。對於一些可能影響系統穩定的函式,作業系統將它們放到核心態當中,在使用者態中使用者只能呼叫一些使用者態的函式,而對於一些對核心函式,使用者只能通過中斷進入核心態中進行呼叫。下圖簡略的說明了使用者態和核心態的程式呼叫關係(截圖來自ppt)
上圖中xyz()是使用者態的函式,這個函式需要呼叫乙個核心態的函式sys_xyz()來完成它的功能。這裡可以看出它首先通過int 0x80進行中斷,然後對進入核心態system call handler中進行相關的暫存器的儲存工作,然後呼叫系統呼叫sys_xyz()。當sys_xyz()完成後返回system call handler進行相關暫存器的復原,過程類似於程式之間呼叫的過程。隨後再返回xyz()中。
除了程式分為使用者態和核心態之外,記憶體的訪問也區分核心態和使用者態,以下是32位位址的核心態和使用者態的訪問控制。
0xc00000000以上位址在核心態訪問
0x00000000-0xbfffffff 位址核心態和使用者態都可以訪問(這裡注意並不是僅僅只有使用者態可以訪問)
下邊利用c語言嵌入式彙編**的方式實現對fork函式的系統呼叫,linux中系統呼叫號可以檢視以下**,這裡可以看出fork的系統呼叫號是2.
實驗**如下,很簡單
1 #include2 #include3 #include4 #include5實驗結果6int main(void)7
19else
20
23return0;
24 }
通過實驗結果,我們可以看出,我們成功的通過這種嵌入式彙編的方式,實現了fork的系統呼叫。這裡主要分析下上圖中的9-14行的**:
因為系統主要通過eax判定系統呼叫,而fork的系統呼叫為2,所以10行中將2傳遞給eax。又由於fork無需傳入引數,所以這裡不需要對ebx進行設定。
緊接著11行就通過int 進入核心態執行fork的系統呼叫。由於系統的傳入引數是通過eax傳出的,所以12行中將eax傳入到,%0,%0是指下邊的n。-m表示n儲存在記憶體當中。
這一節主要通過實驗,了解了系統如何進行系統呼叫的,加深了對核心態和使用者態的理解。作業系統平常工作都在使用者態當中,當使用者態需要操作一些核心資料時,才會通過系統呼叫進入核心態,而這些系統呼叫都是作業系統本身實現了,使用者無法修改。可以看出通過這種方式,作業系統實現了對關鍵資料的保護,從而維護了系統的高效穩定執行。
嵌入式課程拓展 第四周
1.makefile gnu make的工作分為兩個階段。在第一階段,make讀取makefile檔案 內建變數及其值 隱含規則和具體規則 構造所有目標的依賴關係以及所有目標各自的依賴等。在第二階段,make決定需要重新構造的目標並使用必要的規則進行工作。make工作第一階段發生的擴充套件是立即擴充...
嵌入式作業系統基礎第四周總結
偵錯程式 gdb 三大特點 啟動被除錯的程式 設定斷點 單步執行 檢視變數的值 除錯步驟 gcc g sum.c o sum gdb sum 操作 quit退出gdb list顯示 檢視源 gdb 可執行檔案 tui layout split c語言和組合語言同時看,每行 對應彙編 layout a...
嵌入式第四周課堂總結
偵錯程式 gdb 1.gnu計畫的工具 核心除錯kgdb 2.程式的錯誤分類 編譯時錯誤 語法錯誤 執行時錯誤 記憶體錯誤,邏輯錯誤 3.gdb的功能 1執行程式 2設定斷點 3檢視變數值 4.hello.c gcc g hello.c o hello gcc gdb 5.使用 tui layout...