先嚇唬一下讀者朋友呵呵,直接發**:(這是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 定義任務數量 函式變數宣告,在需要用以下函式或變數的檔案中包含此檔案...