Linux0 11核心引導啟動過程概述

2021-08-30 13:21:02 字數 1399 閱讀 5072

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!

linux0.11僅支援x86架構。它的核心引導啟動程式在資料夾boot內,共有三個彙編**檔案。按照啟動流程依次是:

(1)bootsect.s。boot是啟動引導的意思,sect即sector,是扇區的意思,二者合在一起啟動引導扇區。這是

磁碟引導程式。

(2)setup.s

(3)head.s

前兩個匯程式設計序採用近似intel的組合語言語法,第三個採用

gnu的at&t語法。必須採用相應的編譯器才能進行編譯。

系統上電後,intel的cpu自動進入實模式,cs:ip=ffff:0000,也就是說cpu在上電或者復位時總是執行實體地址0xffff0處的**。這個位址預設是rom-bios中的位址,在嵌入式系統來說,這裡存放的是一級bootloader的執行**。它完成的操作就是執行系統自檢,在實體地址0x00000處開始初始化中斷向量表。最後,將啟動盤的第乙個扇區(0磁軌,0磁頭,引導扇區)裝載到實體地址0x07c00處,並且跳轉到這裡開始執行此處的**。而此處**的作用是將自己移到實體地址0x90000處,因為第乙個扇區的**共512kb=0x0200,所以複製過去的範圍就是0x90000-0x901ff。然後,把啟動裝置中第二個扇區開始的連續4個扇區共2kb**(setup.s)讀入到實體地址0x90200處,核心的其他部分(system模組)則被讀入到實體地址0x10000處。因為當時system模組的長度不會超過0x80000位元組大小,所以不會覆蓋0x90000處開始的bootsect和setup模組。裝入完成後,控制轉向setup.s。

setup.s首先設定一些硬體裝置,然後將核心檔案從0x10000處移至0x00000處。系統轉入保護模式,執行0x00000處的**。核心檔案的頭部是用組合語言編寫的**,即head.s。

head.s會把idt(中斷向量表)、gdt(全域性段描述符表)、ldt(區域性段描述符表)的首位址裝入到相應的暫存器裡,初始化處理器和協處理器,設定好分頁,最後呼叫init/main.c中的main()程式。

這個流程跟嵌入式系統中的bootloader要完成的功能是一致的。在at91rm9200上移植u-boot時,也是要有三個檔案load.bin、boot.bin、u-boot.bin。它們共同點都是先從上電起始位置(硬體設定)跳轉到rom的一級bootloader處,經過處理,跳轉到二級bootloader處。完成引導,就可以啟動核心,掛載檔案系統了。下面的工作是詳細分析三個匯程式設計序完成的工作,對整個啟動過程有進一步的了解。以後還要研究一下at91rm9200的bootloader部分,爭取自己寫乙個比較簡單的bootloader。

給我老師的人工智慧教程打call!

Linux0 11核心引導啟動過程概述

linux0.11僅支援x86架構。它的核心引導啟動程式在資料夾boot內,共有三個彙編 檔案。按照啟動流程依次是 1 bootsect.s。boot是啟動引導的意思,sect即sector,是扇區的意思,二者合在一起啟動引導扇區。這是 磁碟引導程式。2 setup.s 3 head.s 前兩個匯程...

Linux 0 11學習總結 引導啟動程式部分

linux 0.11學習總結 引導啟動程式部分 1.bios啟動 intel設計cpu開機加電即進入16位的實模式下執行,cs的值預設為0xffff,ip的值預設為0x0000,這樣cs ip指向了0xffff0的位址位置。bios程式位址只有8kb,範圍為0xfe000 0xfffff。bios程...

Linux 0 11 核心筆記

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