一、控制系統啟動過程 1.要想順利啟動系統,bootsect.s必須讓在磁碟的固定位置上,這個工作是由 make / makefile 完成的 2.啟動保護模式以後,指令jmpi 0, 8和沒有啟動保護模式的區別:得出跳轉地址的方式不一樣 3.在setup中獲取記憶體大小這一個硬體參數的目的是為後面的 ...
一、控制系統啟動過程
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的中斷處理程式入口地址