linux核心初始化

2021-06-18 19:42:32 字數 1720 閱讀 9912

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的定義正...