三十天自學作業系統讀後感2

2021-09-29 12:28:03 字數 3009 閱讀 9890

上次完成了最簡單作業系統的**,按下開機鍵後介面展示hello world

基本知識點,作業系統編碼位址記憶體衝0開始,0 到 7c00之前存著bios的相關功能,中斷功能等等。開機以後自動執行bios,bios進行檢查與及相關功能的初始化、把對應的程式裝載到記憶體中。bios通過每個扇區512位元組的末尾0x55aa判斷該扇區是否該裝進記憶體。裝載完了最後就跳到 0x7c00處執行。day01中在該處寫了個展示hello world程式。接下來說記憶體編址,記憶體00到ff是唯讀記憶體,這些是晶元,然後ff--ffff...才是真的記憶體條。

然後之前也沒有說明org指令的意義。 org是origin的縮寫:起始位址,源。在組合語言源程式的開始通常都用一條org偽指令來實現規定程式的起始位址。如果不用org規定則彙編得到的目標程式將從0000h開始。 然而放不進去的,0處是晶元位址,這個地方是rom唯讀,沒辦法寫會出錯。

接下來事上節沒有搞清楚的內容,計算通電後衝記憶體0開始執行,記憶體控制器第一件事就是從晶元上執行,執行完了到記憶體07c00出開始,這裡我們要寫裝載程式,就是把讀取硬碟的程式寫在這裡,程式執行完的時候,下乙個地方就是執行作業系統,這個作業系統就是之前的讀取程式都進來的。那麼考慮當年的記憶體很小。然後在這個小記憶體裡面就寫讀盤程式,把他讀到對應的地方去,記憶體都會被編址的,編址了就會跑到,如果作業系統裡面不寫迴圈,我猜跑到最後乙個位址也就完了。

這次實現的程式是讀盤操作。

首先最簡單的讀盤操作

mov ax,0x0820

mov es,ax ; 習慣使用es作為目的位址的段位址,因為這裡要複製

​mov ch,0 ; 柱面 0

mov dh,0 ; 磁頭 0

mov cl,2 ; 扇區 2

​mov ah,0x02 ; ah=02 : 讀盤

mov al,1 ; 1個扇區

mov bx,0

mov dl,0x00 ; a驅動器

int 0x13 ; 呼叫磁碟bios

jc error ; 條件跳轉error

迴圈執行以上過程,就會把硬碟上的作業系統讀進記憶體,然後cpu就是老老實實從記憶體0位址開始執行,bios,然後讀盤,讀取完畢以後執行跳轉,調轉到作業系統的位址開始執行。

接下來寫下完整的磁碟函式:

讀磁碟

mov ax,0x0820

mov es,ax

mov ch,0 ; 柱面0

mov dh,0 ; 磁頭0

mov cl,2 ; 扇區

readloop:

mov si,0 ; 記錄失敗次數的暫存器

retry:

mov ah,0x02 ; ah=0x02 : 讀入磁碟

mov al,1 ; 1個扇區

mov bx,0

mov dl,0x00 ; a驅動器

int 0x13 ; 呼叫磁碟bios

jnc next ; 沒出錯時跳轉到next

add si,1 ; si加1

cmp si,5 ; 比較si與5

jae error ; si >= 5 時候,跳轉error , 重試 5 次 都失敗 報錯

mov ah,0x00

mov dl,0x00 ; a驅動器

int 0x13 ; 重置驅動器

jmp retry

next:

mov ax,es ; 把記憶體位址往後移動 0x200

add ax,0x0020

mov es,ax ; 因為沒有 add es,0x020指令,所以這裡稍微繞個彎兒

add cl,1 ; cl 加1

cmp cl,18 ; 比較cl 與 18

jbe readloop ; 如果cl <= 18,則跳轉回去readloop

mov cl,1

add dh,1

cmp dh,2

jb readloop ; 如果 dh < 2 跳回去 readloop

mov dh,0

add ch,1

cmp ch,cyls

jb readloop ; 如果dh < cyls, 則跳轉到readloop `這裡的cyls 箱單是 10 是個巨集定義

這個讀盤程式位於什麼地方呢?顯然 他應該位於mbr中,mbr被稱為主引導程式,那麼主引導程式是什麼時候被讀入記憶體的呢?這個過程之前介紹過只是沒有意識到,biso通過55aa判斷主引導程式,mbr只有 512 個位元組,因此,mbr一般唯一磁碟的第乙個扇區,這個扇區裡面有分割槽表,就是磁碟分多少個區,然後就是讀盤程式,和跳轉程式,從第二個扇區開始讀取,一般又這個磁碟上的程式決定讀取多少內容,讀取完畢以後,一行跳轉命令跳到作業系統其實位置,開始執行作業系統。這一塊算是搞懂了。

然後突然想到乙個問題,為什麼計算機會在啟動的時候按下f2就能進入bios管理介面,這個很奇怪呀。通過不懈努力,終於在知乎上找到了答案,是說開機的時候bios會有1個三到五秒等待鍵盤命令,這個等待是可以取消的,如果通過bios管理取消了,那麼計算機以後開機都沒有這些過程了,然後就沒有辦法進入bios管理介面了,如果想要進入,只能重置bios,就是把bios摳出來,放下電。

如果有錯,歡迎指出。

《嵌入式作業系統風雲錄》讀後感

這本書應該算是一本科普性質的書籍,講述了嵌入式作業系統及周邊產品的歷史 特點和展望,相比較而言,教科書通常是某乙個rtos的深入解讀,而這本書是教科書的輔助書籍,提到了很多教科書所沒有的內容,值得一讀。1 看完書,我才知道ucos不是最早的rtos,vxworks也不是,而是vrtx,他是第乙個真正...

30天自製作業系統day2

這一章主要講解彙編基礎知識和makefile的使用 org指令 指定開始執行程式的時候,把程式裝載到記憶體的哪個位址。如果不指定,則預設從0x0開始,會與bios程式發生衝突。程式helloos.nas中,指定的是0x7c00。這是因為規定的啟動區內容裝載位址是0x00007c00 0x00007d...

30天自製作業系統 Day2

還是follow書籍,並且也參考別人的筆記,還是這位大佬的筆記做的很詳細,把鏈結放在這裡 既然別人已經做了很詳細的筆記了,我就不用再重複了。學習中遇到了一些問題,和大家分享一下。最開始我按照書裡的描述,把檔案copy到helloos4下面,執行make r helloos.img的時候,報錯說 no...