1.系統的引導和初始化:
linux 系統的引導有好幾種方式:常見的有 lilo, loadin引導和linux的自舉引導 (bootsect-loader),而後者所對應源程式為arch/i386/boot/bootsect.s,它為實模式的匯程式設計序,無論是哪種引導方式,最後都要跳轉到 arch/i386/kernel/setup.s,
setup.s主要是 進行時模式下的初始化,為系統進入保護模式做準備;
此後,系統執行 arch/i386/kernel/head.s (對經壓縮後存放的核心要先執行 arch/i386/boot/compressed/head.s);
head.s 中定義的一段匯程式設計序setup_idt ,它負責建立一張256項的 idt 表(interrupt descriptor table),此表儲存著所有自陷和中斷的入口位址;其中
包括系統呼叫總控程式 system_call 的入口位址;當然,除此之外,head.s還要做一些其他的初始化工作;
2.系統初始化後執行的第乙個核心程式asmlinkage void __init start_kernel(void) 定義在 /usr/src/linux/init/main.c中
它通過呼叫usr/src/linux/arch/i386/kernel/traps.c 中的乙個函式 void __init trap_init(void) 把各自陷和中斷服務程式的入口位址設定到 idt 表中,其中系統呼叫總控程式 system_cal就是中斷服務程式之一;
void __init trap_init(void) 函式則通過呼叫乙個巨集 set_system_gate(syscall_vector,&system_call); 把系統呼叫總控程式的入口掛在中斷0x80上;
其中syscall_vector是定義在 /usr/src/linux/arch/i386/kernel/irq.h中的乙個常量0x80; 而 system_call 即為中斷總控程式的入口位址;
中斷總控程式用組合語言定義在/usr/src/linux/arch/i386/kernel/entry.s中;
3.中斷總控程式主要負責儲存處理機執行系統呼叫前的狀態,檢驗當前呼叫是否合法, 並根據系統呼叫向量,使處理機跳轉到儲存在 sys_call_table 表中的相應系統服務例程的入口; 從系統服務例程返回後恢復處理機狀態退回使用者程式;
而系統呼叫向量則定義在/usr/src/linux/include/asm-386/unistd.h 中;
sys_call_table 表定義在 /usr/src/linux/arch/i386/kernel/entry.s 中;
同時在 /usr/src/linux/include/asm-386/unistd.h 中也定義了系統呼叫的使用者程式設計介面;
4.由此可見 , linux 的系統呼叫也象 dos 系統的 int 21h 中斷服務,
它把0x80 中斷作為總的入口, 然後 轉到儲存在 sys_call_table 表中的各種中斷服務例程的入口位址 , 形成各種不同的中斷服務;
由以上源**分析可知, 要增加乙個系統呼叫就必須在 sys_call_table 表中增加一項 , 並在其中儲存好自己 的系統服務例程的入口位址,然後重新編譯核心,當然,系統服務例程是必不可少的。
結語:當然對於龐大複雜的 linux 核心而言,一篇文章遠遠不夠,而且與系統呼叫相關的**也只是核心中極其 微小的一部分;但重要的是方法、掌握好的分析方法;所以上的分析只是起個引導的作用,而正真的分析還有待於我們自己的努力。
Linux核心初始化順序
include linux init.h define pure initcall fn define initcall 0 fn,1 define core initcall fn define initcall 1 fn,1 define core initcall sync fn define...
核心初始化
異常處理 總共有七中的異常情況 1 reset 2 undefined instruct 不支援命令異常 3 軟體中斷 4 指令預取失敗異常 5 資料讀取失敗異常 6 中斷 7 快速中斷 比一般的中斷處理速度快一些 中斷向量 當中斷發生時,處理器就會跳轉到乙個固定的位址去處理指令 globl sta...
Linux核心頁表初始化
linux在核心啟動過程中start kernel setup arch會呼叫如下兩個函式對頁表進行初始化和建立。static inline void prepare page table void 由於arm採用兩級對映,pmd不占用字段,pmd pgd,而這裡一次清了兩個pgd,和pgd的定義正...