0、操做系統啓動過程 https://blog.csdn.net/judyge/article/details/52278384html
第一步:讀取BIOSlinux
按下電源按鈕後,計算機首先讀取一塊ROM芯片,這塊芯片裏的程序是"基本輸入輸出系統"(Basic Input/Output System),即BIOS.git
第二步:硬件自檢 github
BIOS會檢查計算機硬件是否知足運行條件,若是硬件出現問題,主板會發出不一樣含義的蜂鳴,啓動停止。ubuntu
第三步:啓動順序windows
硬件檢查完成後,BIOS會將控制權交給下一階段的啓動程序,注意,「下一階段的啓動程序」可能存放在硬盤中,也可能存放在CD/DVD中,或者軟盤中等等,能夠設置BIOS選擇從哪一個設備啓動。bash
第四步:主引導記錄工具
BIOS找到了「下一階段的啓動程序」所在設備,會讀取該設備的第一個扇區,即讀取最前面的512字節,稱爲主引導記錄。主引導記錄會告訴計算機下一步到哪裏去找操做系統。操作系統
第五步:bootloader.net
計算機讀取"主引導記錄"前面446字節的機器碼以後,運行事先安裝的「啓動管理器」bootloader,由用戶選擇啓動哪一個操做系統。若是你安裝了多個操做系統,那麼就要從這步作出選擇了。
第六步:加載內核
好了,選擇操做系統(內核)後,會加載內核,下面就交給內核去處理了。
咱們製做的操做系統將從第三步以後開始,經過vitrualbox 加載軟盤img鏡像的方式啓動
BIOS讀img文件的前512字節,主引導記錄,主引導記錄的前446字節(boot.bin的前446字節,也是boot.img的前446字節)爲bootloader,肯定啓動哪一個操做系統
一、製做boot.bin (須要下載安裝 nasm https://www.nasm.us/)
編輯文件boot.asm
org 07c00h ; 告訴編譯器程序加載到7c00處 mov ax, cs mov ds, ax mov es, ax call DispStr ; 調用顯示字符串例程 jmp $ ; 無限循環 DispStr: mov ax, BootMessage mov bp, ax ; ES:BP = 串地址 mov cx, 16 ; CX = 串長度 mov ax, 01301h ; AH = 13, AL = 01h mov bx, 000ch ; 頁號爲0(BH = 0) 黑底紅字(BL = 0Ch,高亮) mov dl, 0 int 10h ; 10h 號中斷 ret BootMessage: db "Hello, One OS!" ; 想要開機後在屏幕上顯示的字符串 times 510-($-$$) db 0 ; 填充剩下的空間,使生成的二進制代碼剛好爲512字節 dw 0xaa55 ; 結束標誌
nasm boot.asm -o boot.bin
二、製做img鏡像 https://blog.csdn.net/sunjing_/article/details/78781411
製做img鏡像方法一:Linux下的dd命令(親測可用)
這裏也嘗試過,把方法一中第一步生成的img文件,代替bximage工具生成的img文件,而後繼續使用方法二中的dd命令,生成的a.img,在vitrualbox上沒法啓動,此處不知道緣由,但願有高手解答。
而後,啓動運行就能夠(下面這張是個人圖,上面都是網圖)
附:
https://www.csdn.net/gather_26/MtTacg0sODU2My1ibG9n.html
https://github.com/lucasysfeng/lucasOS.git