本身寫操做系統 1

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命令(親測可用)

1. 製做軟盤鏡像文件diska.img
命令: dd if=/dev/zero of=diska.img bs=512 count=2880
2. 複製boot.bin到boot.img中
命令: dd if=boot.bin of=boot.img bs=512 count=1
3. 複製diska.img中從第512字節日後的內容添加到boot.img中
命令: dd if=diska.img of=boot.img skip=1 seek=1 bs=512 count=2879
 
嘗試過,若是把這裏的第2,3步換成用FloppyWriter在windows上寫boot.bin到diska.img鏡像中,會出現virtualbox能識別diska.img鏡像,但運行過程報「FATAL: No bootable medium found! System halted.」的錯誤,也就是說boot.bin其實沒有生效。
 
製做img鏡像方法二:使用bximage工做和dd命令(親測可用)
使用linux下bximage命令,以ubuntu爲例
sudo apt-get install bximage
bximage
fd
[Enter]
[Enter]
默認生成a.img的軟盤鏡像文件
 
而後把boot.bin寫入a.img文件前512字節內
dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
如圖:

 

這裏也嘗試過,把方法一中第一步生成的img文件,代替bximage工具生成的img文件,而後繼續使用方法二中的dd命令,生成的a.img,在vitrualbox上沒法啓動,此處不知道緣由,但願有高手解答。

 
 三、使用vitrualbox啓動boot.img  http://www.cnblogs.com/777777-716/p/5003964.html

 

 

而後,啓動運行就能夠(下面這張是個人圖,上面都是網圖)

 

 

附:

https://www.csdn.net/gather_26/MtTacg0sODU2My1ibG9n.html

https://github.com/lucasysfeng/lucasOS.git

相關文章
相關標籤/搜索