操作系統之基礎
一、控制系統啟動過程
1.要想順利啟動系統,bootsect.s必須讓在磁盤的固定位置上,這個工作是由 make / makefile 完成的
2.啟動保護模式以後,指令jmpi 0, 8和沒有啟動保護模式的區別:得出跳轉地址的方式不一樣
3.在setup中獲取內存大小這一個硬件參數的目的是為後面的mem_init()做準備
4.在屏幕上打出“Loading System…”等系統Logo的時候,計算機內部正在:初始化內存管理數據結構、讀磁盤、啟動保護模式
5.Windows系統啟動和Linux系統啟動時,初始化內核數據結構不一樣
6.根據GDT表,jmpi 0, 8要跳到0地址處去執行,那麽能不能執行jmp 0呢?也可能,但首先要設置cs,並且要保證cs指向的那個GDT表項中的基地址為0
7.操作系統啟動要完成的工作:初始化IDT表、初始化mem_map、初始化GDT表
8.mem_init就是初始化一個數組,如果某個數組項中的內容為0,則表示對應的那一段內存空閑;數組中的每個項表示固定大小的一段內存;mem_init調用之前可以不獲得物理內存的大小;此外,並非初始化時將所有數組項中的內容都設置為0
二、系統接口
1.用戶程序調用printf(“Hello World!”)最終要通過寫顯存來完成Hello World!的輸出,從用戶程序到寫顯存中間經過的順序為:用戶程序;C函數庫;系統調用;sys_write;寫顯存
2.將程序的執行分為用戶態和內核態是為了保護操作系統內核
3.在系統調用的實現中,在int 0x80指令調用之前,給eax賦值的目的是傳遞系統調用號
4.為什麽稱為系統調用:為了和其他的函數調用相區別,表現為一個函數調用,最終調用了操作系統提供的功能;而並非call了一個內核中的函數
5.鼓勵操作系統實現POSIX接口的真正目的是上層應用程序可以移植
6.printf(“Hello World!”)中的字符串地址最終是通過寄存器和棧的配合以參數的形式傳遞給sys_write函數的
7.int 0x80是唯一能從CPL=3(用戶態)到CPL=0(內核態)的指令跳轉,所以應用程序中的系統調用要展開成一段包含int 0x80的代碼
8.系統調用有open,printf,write等,但cos不是
9.Windows的系統接口和Linux接口的不一樣導致了Windows上的程序不能在Linux上運行
10.在Linux上添加一個系統調用foo()的步驟有:在int 0x80的中斷處理程序中增加對sys_foo的函數調用,修改sys_call_table這個函數表,將foo展開成一段包含int 0x80的代碼;而不是設置int 0x80的中斷處理程序入口地址
操作系統之基礎