linux0 11的啟動順序

2021-04-13 02:20:50 字數 939 閱讀 5562

入上圖所示:

1.系統加電後,80x86的cpu將進入實模式,並從位址0xffff0開始自動執行程式**,而這個位址通常是rom-bios中的位址。

2.bios將執行一些系統的檢測,並在實體地址0處初始化中斷向量。將可啟動裝置的第乙個扇區(磁碟引導扇區mbr)讀入記憶體絕對位址0x7c00處,並跳轉到這個地方。對linux0.11來說,讀到這個地方的是bootsect.s(磁碟引導塊程式)。

3.bootsect.s開始執行後,第一,將自己從0x7c00移動到0x90000(576k);第二,使用bios中斷將setup.s載入到自己的後面(0x90200)(576.5k);第三,將system載入到位址0x10000處。

4.setup.s的功能主要是利用bios中斷讀取機器系統資料,並將這些資料儲存到0x90000開始的位置(覆蓋掉了bootsect 程式所在的地方),這些資料將被核心中相關程式使用。

5.然後setup 程式將system 模組從0x10000-0x8ffff(當時認為核心系統模組system 的長度不會超過此值:

512kb)整塊向下移動到記憶體絕對位址0x00000 處。

6.接下來載入中斷描述符表暫存器(idtr)和全域性描述符表暫存器(gdtr),開啟a20 位址線,重新設定兩個中斷控制晶元8259a,將硬體中斷號重新設定為0x20 - 0x2f。最後設定cpu 的控制暫存器cr0(也稱機器狀態字),從而進入32 位保護模式執行,並跳轉到位於system模組最前面部分的head.s 程式繼續執行。

7.為了能讓head.s 在32 位保護模式下執行,在本程式中臨時設定了中斷描述符表(idt)和全域性描述符表(gdt),並在gdt 中設定了當前核心**段的描述符和資料段的描述符。在下面的head.s 程式中會根據核心的需要重新設定這些描述符表。

Linux 0 11啟動時間的計算函式

main.c下時間初始化 可以體會到位運算的精簡 define cmos read addr define bcd to bin val val val 15 val 4 10 static void time init void while time.tm sec cmos read 0 bcd ...

Linux 0 11 核心筆記

1 任務0的堆疊問題 一直不明白schedule.c裡的task union的stack和user stack是什麼關係,head.s裡就設定了esp指向user stack,卻一直沒有用到task union,直到看到init task才明白,從進入保護模式到跳轉進使用者態都是用的user sta...

linux0 11 記憶體結構

linux0.11,記憶體最多支援16m,其中0 1m是核心區,核心模組大約為520k,即end位址,即實際核心使用是從0 到end,之後到640k是高速緩衝區,從640k開始的區域,分別是視訊記憶體,bios區域,高速緩衝區,高速緩衝區之後是是主記憶體區域。在記憶體核心區域當中,從0開始,首先存放...