作業系統開發之 乙個簡單的Bootsect

2021-09-07 13:49:11 字數 2508 閱讀 1598

先嚇唬一下讀者朋友呵呵,直接發**:(這是uos作業系統的bootsect)(有興趣的朋友能夠增加我們,****在最後)

;------------------------------

;檔名稱:bootsect.asm

;檔案建立者:@imcjy

;檔案編碼:utf-8

;狀態:o

;build:3

;檔案建立日期:2023年7月24日

;檔案最後改動日期:2023年8月12日

;備註:本檔案為nasm

;凝視等級:lv2

;------------------------------

org 0x7c00 ;裝載此程式至0x7c00處。由於bios缺省會從記憶體0x7c00處開始執行

jmp os_entry

;參照《orange's乙個作業系統的實現》,感謝其作者于淵

;參照 ,感謝其作者

%macro diskaddresspacket 3

db 16 ;資料報尺寸(預設16位元組)

db 0 ;保留

db %2 ;要傳輸的資料塊個數(以扇區為單位),最大讀128扇區

db 0 ;保留

dd %3 ;傳輸緩衝位址(segment:offset)

dq %1 ;磁碟起始絕對塊位址。注意此處的位址是從零開始

%endmacro

os_kernel_s1: diskaddresspacket 3, 128, 0x10000000

os_kernel_s2: diskaddresspacket 131, 128, 0x20000000

os_kernel_s3: diskaddresspacket 259, 128, 0x30000000

[bits 16]

os_entry:

;初始化暫存器

mov ax,cs

mov ds,ax

mov es,ax

mov ss,ax

read_kernel:

;讀核心

ks1: ;狀態1

mov ax,os_kernel_s1

mov si,ax

mov dl,0x80 ;一號硬碟

mov ah,0x42 ;讀盤操作

int 0x13

jc ks1 ;失敗則重試

ks2: ;狀態2

mov ax,os_kernel_s2

mov si,ax

mov ah,0x42 ;讀盤操作

mov dl,0x80 ;一號硬碟

int 0x13

jc ks2 ;失敗則重試

ks3: ;狀態3

mov ax,os_kernel_s3

mov si,ax

mov dl,0x80 ;一號硬碟

mov ah,0x42 ;讀盤操作

int 0x13

jc ks3 ;失敗則重試

jmp 0x8000:0 ;跳轉到段0x8000處並更新cs

times 510 - ($ - $$) db 0 ;填充剩下的空間。使生成的二進位制**恰好為512位元組

db 0x55,0xaa ;bios認可的結束標誌

如今開始解釋一下第一句,「org 0x7c00」,這裡為什麼要裝載到0x7c00處呢。如今也解釋不清楚。這是ibm的大叔設定的,假設有質疑能夠去問問他們哦。

第二句:「jmp os_entry」 這裡為什麼要跳轉呢?那我再問你一句,這一句後面的那些**難道要執行嗎?(那可不能執行)所以要跳轉到bootsect真正的入口點。

第三句:巨集定義,為了降低挨個挨個設定引數的麻煩,引數能夠參照intel手冊來寫。

第四句:依賴巨集定義定義引數,這裡不用解釋了把,相信學過nasm的朋友都能看懂。

第五句:「[bits 16]」,為了使nasm生成出來的是16位**。(話說為什麼一定要生成16位**呢?由於bios僅僅認16位的中斷處理),話說nasm好笨哦。(嘻嘻)

第六句:「os_entry:」標籤,相應第二句。

第七句——第十句:初始化暫存器。有興趣的讀者能夠去掉這句看看。

第十一句——第十五句:將各個引數放到相應的暫存器裡。否則虛擬器(或者真機)會出問題(或許就是重新啟動吧)。

第十六句:呼叫0x13號bios中斷。

後面的以此類推。

到了「jmp 0x8000:0」這一句,看一下凝視把,這裡是乙個長跳轉。跳轉到0x8000記憶體位址處。

最後兩句:為了使bios認可我們的bootsect,我們須要這段**的大小控制到512位元組以內,且最後兩個位元組為0x55 0xaa。

注意事項:

1:我們須要將這段**放到硬碟的第乙個扇區,(話說這也是ibm那群大叔設定的)。

2:我們須要將硬碟的第二個扇區至第三個扇區放置興許的操作**(比方開啟a20啊,進入保護模式啊)。

3:版權歸uos專案組全部。

假設還有問題能夠聯絡我:email:[email protected]

假設讀者朋友也有開發作業系統的想法,能夠聯絡我。

作業系統開發之路(一)

作業系統是提供給計算機硬體的一組基本的程式設計指令,它們構成了計算機的大多數其他功能依賴存在的 程式設計層。程式設計 是作業系統的核心,稱為核心 kernel 核心這個術語是從unix作業系統中演化來的。在unix和linux系統中,連線核心的基本介面稱為外殼 shell 使用者可以在此執行命令。核...

乙個簡單的作業系統

電腦上電後,bios在自檢後會根據使用者指定的裝置啟動作業系統。假設我們指定軟盤為啟動盤,bios會把軟盤的第乙個扇區 512位元組 讀取到記憶體的0x7c00處,如果這個扇區的最後兩個位元組為0xaa55,bios會跳轉到0x7c00處開始執行。我們可以利用這樣乙個過程做乙個簡單的作業系統。我們的...

乙個簡單的51作業系統

os cfg.h include reg51.h define time per sec 200 定義任務時鐘頻率,200hz define clock 22118400 定義時鐘晶振,單位hz define max task 4 定義任務數量 函式變數宣告,在需要用以下函式或變數的檔案中包含此檔案...