自己動手寫作業系統(二)
系統啟動流程簡單來說就是下面的順序:
===============================
1.BIOS:開機主動執行的韌體,會認識到第一個可開機的裝置
2.MBR:第一個可開機裝置的第一個扇區內的主引導分割槽塊,內包含引導載入程式
=>由stage1.asm編譯成的boot.bin被寫入mbr分割槽
3.引導載入程式(Boot loader): 一支可讀取核心檔案來執行的軟體
=>由stage2.asm編譯成的STAGE2.SYS會被讀取到記憶體
4.核心檔案: 開始作業系統的功能
=>由core編譯成的core.sys被讀取到記憶體,並且eip跳轉到core.sys的入口函式。
第一步是CPU自己去負責的,我們不需要做任何處理,所以我們要做的是從第二步開始。
程式碼介紹如下:
FATSize: dw 0x0000
FATDataSector: dw 0x0000
Stage2ImageName: db "STAGE2 SYS"
Stage2CurrentCluster: dw 0x0000
Stage2FileNotFoundMsg: db "FATAL**: Missing or corrupt STAGE2 image.",0
Stage2ImageName就是第三步中的需要讀取到記憶體的檔名(我們這裡簡單的叫做stage2.sys)。; Loading addresses FatRootLoadLoc: dw 0x0200 ; (7C00:0200) Stage2LoadLoc: dw 0x0050 ; (0050:0000)
Stage2LoadLoc是指Stage2.sys需要載入到的記憶體地址,這個需要和stage2.asm中的[ORG 0x500] ; (0x50:0)對應。
接下來就是一個跳轉,將IP直接跳轉到0x50:0即0x500上,
push WORD [Stage2LoadLoc] ; IP register..
push WORD 0x0000 ; and code segment for..
retf ; far jump
我們看到stage2.sys的用ORG定義了起始的地址是0x500,所以這個就是stage1.sys中的跳轉連線上了。
[ORG 0x500] ; (0x50:0)
jmp STAGE2_MAIN
接下來,0x500上的第一條指令就是STAGE_MAIN,這樣就完成了步驟2的過程,開始步驟3的處理了。stage2.sys的處理下週再分析。
PS:
1.這裡省略了用匯編從檔案系統中查詢stage2.sys的流程(FIND_FILE),有興趣的同學可以自己研究。哈哈。我這裡實際上也是直接抄襲了別人的處理流程。
2.如果boot.bin和stage2.sys都編譯成功後,我們可以通過下面的dd命令來寫入mrb塊。
dd if=/dev/zero of=$OUT_DIR/diska.img bs=512 count=2880
dd if=$OUT_DIR/boot.bin of=$OUT_DIR/boot.img bs=512 count=1
dd if=$OUT_DIR/diska.img of=$OUT_DIR/boot.img skip=1 seek=1 bs=512 count=2879
謝謝。
相關推薦
自己動手寫作業系統(二)
系統啟動流程簡單來說就是下面的順序: =============================== 1.BIOS:開機主動執行的韌體,會認識到第一個可開機的裝置 2.MBR:第一個可開機裝置的第一個扇區內的主引導分割槽塊,內包含引導載入程式
自己動手寫作業系統(五)
這裡開始就進入了core的啟動流程(類似於linux的kernel)。core的入口函式是start_core,如何定義如何函式呢?我們這裡通過編譯指令就可以了。參看下面的配置檔案: ENTRY (start_core) SECTIONS { . = 0x10
自己動手寫作業系統(一)
從去年就想好好的讀一下這本書,跟著書上做一下,但是給耽擱了,現在就好好的開始探索這麼書吧! 雖然我很想在這裡吹一段這本書有多麼的厲害,但是!我第一章都沒有看完,吹不了!!!等我讀的個七七八八再回來吹吧。 我是在搜尋嵌入式的學習路線中發現的這本書,當時他們說這本書很有趣,操作
自己動手寫作業系統二(編寫核心Hello World 教程)
By EvilBinary 小E 本文用到的boot.s 和setup.s 兩個檔案見本blog MyOs 分類相關文章。 我們編寫start.s 來啟動初始化資訊,然後進入main.c核心程式碼,然後顯示Evilbinary os字樣 //star
自己動手寫SSO(單點登錄)
getattr apach tpc style inter -m commons getwriter servle SSO在我們的應用中非常常見,例如我們在OA系統登錄了,我們就可以直接進入采購系統,不需要再登錄了,這樣使我們非常方便。
深入學習Tomcat----自己動手寫伺服器(附伺服器原始碼)
相信大多Web開發者對Tomcat是非常熟悉的,眾所周知Tomcat是一款非常好用的開源Servlet容器,您一定對這個最流行的Servlet容器充滿好奇,雖然它並不像一個黑盒子那樣讓人無法觸控但是Tomcat的原始碼的確讓人看起來頭疼。筆者就在這裡和大家共同分析一個簡單的W
理解Java 動態代理和AOP(可以自己動手寫AOP框架!)
說到AOP,很容易就想到 spring AOP。因為它是AOP裡最優秀的實現框架。但本文不打算討論 spring AOP,只想把如何通過動態代理方式實現AOP思想說通。當然,整明白了這個道理,理解 spring AOP 也就簡單了! 首先我覺得需特別強調一下什麼是面向介面程
我是如何學習寫一個作業系統(二):作業系統的啟動之Bootloader
前言 今天本來的任務看書和把之前寫的FragileOS整理一下,但是到現在還在摸魚,書也只看一點。後來整理了一下寫這個系列的思路,原本的目的是對作業系統原理性的學習和對之前寫的一個玩具型作業系統的回顧,就是想對作業系統的知識的輪廓能有一個瞭解,現在想來想減少對之前寫的系統的回顧,畢竟也只有2000多行,但是還
自己定義控件(二)自己定義Dialog
ble top cancel type lis icon ner javascrip findview 本節要實現:自己定義一個Dialog 結果例如以下: 步 驟 1.配置register_dialog.xml: 以下是一個自己定義的dia
使用Spring+MySql實現讀寫分離(二)spring整合多數據庫
ont 依據 xml配置 實現 整合 配置 item 匹配 mic 緊接著上一章,因為現在做的項目還是以spring為主要的容器管理框架,所以寫以下spring如何整合多個數據源。 1. 背景 我們一般應用對數據庫而言都是“讀多寫少”,也就說對數據庫讀取數據的壓力比較大
利用 Composer 完善自己的 PHP 框架(二)
pass 簡易 cte 郵件接收 ces api cep home ase 回顧 上一篇文章中,我們手工建造了一個簡易的視圖加載器,順便引入了錯誤處理包,讓我們的 MFFC 框架在 M、V、C 三個方面都達到了“好用”的水平。View 是一個可插拔組件,在本篇文章中我們要創
Python從零開始寫爬蟲(二)BeautifulSoup庫使用
Beautiful Soup 是一個可以從HTML或XML檔案中提取資料的Python庫, BeautifulSoup在解析的時候是依賴於解析器的,它除了支援Python標準庫中的HTML解析器,還支援一些第三方的解析器比如lxml等。可以從其官網得到更詳細的資訊:http://beau
搭建自己的博客(二):創建表,創建超級用戶
HERE clas content span self. alt 更新 記得 運行 接上一篇搭建完成之後,開始構建一些表了。 一篇博客首先需要一個表來存放博客,然後一篇博客應該需要不同的標簽來分類,還應該有作者。下面動手創建表。作者表暫時準備使用django自帶的user表
python檔案讀寫指南(二)
我們知道當檔案不存在的時候,open()方法的寫模式與追加模式都會新建檔案,但是對檔案進行判斷的場景還有很多,比如,在爬蟲下載圖片的時候,可能需要判斷檔案是否存在,以免重複下載;又比如,建立新檔案的時候,可能需要判斷檔案是否存在,存在就先做個備份......所以,學習判斷檔案是否存在,還是很有必要的
作業系統(二)
在多重處理系統中,處理死鎖的辦法有兩種:一是防止其發生,二是發生後進行處理。 所謂死鎖deadlocks 是指兩個或者兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們將推進下去。此時稱系統處於死鎖狀態或者系統產生了死鎖。 產
全面剖析《自己動手寫作業系統》的pmtest1.asm
##段機制輕鬆體驗 段機制輕鬆體驗 記憶體定址: 真實模式下的記憶體定址: 讓我們首先來回顧真實模式下的定址方式 段首地址×16+偏移量 = 實體地址 為什麼要×16?因為在8086CPU中,地址線是20位,但暫存器是16位的,最高定址64KB,它無法定址到1M記憶體。於是,Int
使用tensorflow訓練自己的資料集(二)
使用tensorflow訓練自己的資料集—定義神經網路 上一篇使用tensorflow訓練自己的資料集(一)中製作已經介紹了製作自己的資料集、接下來就是定義向前傳播過程了也就是定義神經網路。本次使用了兩層卷積兩層最大池化兩層全連線神經網路最後加softmax層的
《自己動手寫作業系統》第2版:簡介
今年剛畢業,從事電商java開發崗位,一直對著需求編碼的話感覺技術長進不會太大,碰巧對作業系統這塊有些許興趣,就想著學習這塊的知識,如果學得好的話看將來能不能轉型成作業系統,系統安全或者c/c++相關的開發人員。 於是在網上找了很多資料,其實大部分都是理論書
CentOS6中MySql5.6資料庫主從複製/讀寫分離(二)
程式碼層面實現讀寫分離 在文章(一)中我們已經有了兩個資料庫而且已經實現了主從資料庫同步,接下來的問題就是在我們的業務程式碼裡面實現讀寫分離,假設我們使用的是主流的ssm的框架開發的web專案,這裡面我們需要多個數據源。 在此之前,我們在專案中一般會使用一
讀 自己動手寫作業系統
用一個月左右的時間讀了《自己動手寫作業系統》,這是一本讓人讀著很過癮,卻也特別累的一本書。 對作業系統的興趣由來已久,只是一直未能找到入門之徑。作業系統教材是個令人生畏的東西,它可以告訴人有什麼,卻不能告訴人為什麼,從那裡瞭解的作業系統有如盲人摸到的象,得到各個部分,卻不