如何寫一個bootloader

聲明:本文為學習Codeproject文章的個人總結性文章,

  ? 原文:http://www.codeproject.com/Articles/664165/Writing-a-boot-loader-in-Assembly-and-C-Part

?

本人開發環境:

  操作系統:Ubuntu 32位(64位的會有pushl等指令的不能執行等問題,最好為32位)

  工具:as ld dd bochs

  語言:at&t 16位匯編

?

計算機啟動運行于real mode,ROM會讀取硬盤(或其他介質,如軟盤)的CHS模式的0柱面,0磁道,1扇區的的數據到內存0x7c00處,然后到此處執行。所以bootloader就是一段代碼,將這段代碼寫入0柱面,0磁道,1扇區中。

好了,原理簡單介紹完畢。

?

我的當前用戶目錄是/home/chao/,所以我要在~/Documents/目錄下來寫代碼和進行其他的操作。

創建test.S文件

 1 .code16                    
 2 .text                        
 3      .global _start;
 4 _start:                    
 5 
 6      movb $'X' , %al
 7      movb $0x0e, %ah
 8      int  $0x10
 9 
10      . = _start + 510
11      .byte 0x55
12      .byte 0xaa

解釋一下代碼的意義。

1     movb $'X' , %al
2        movb $0x0e, %ah
3        int  $0x10

這是call BIOS interpret,調用號為0x10,查閱資料得知,0x10是Video Service,根據AH中的參數來調用不同的程序,這里AH中是0x0e,功能為Write Character in TTY Mode,也就是向終端寫入字符,寫入的字符從AL中獲取,也就是字符X。

1 . = _start + 510
2       .byte 0x55
3       .byte 0xaa

因為一個有效的啟動扇區最后的兩個字節內容必須是0x55,0xaa(這是延續下來的,如果不是這兩個字節內容,那么這個啟動扇區會被認為是無效的,不能啟動,所以這兩個字節我把它稱為驗證字節),所以會有地2,3行內容,至于. = _start + 510,這里的 . 代表當前位置,也就是說,把當前位置設置為從代碼開始增加510 bytes的位置,因為一個扇區大小為512 bytes(以前也有別的大小,但是后來512成為主流),所以兩個字節的大小留給驗證字節。

?

至此,我們的demo? bootloader代碼就寫好了,下面進行匯編,鏈接。

  • as test.S -o test.o
  • ld –Ttext 0x7c00 --oformat=binary test.o –o test.bin

-Ttext 0x7c00 告訴linker你想把代碼加載到內存0x7c00處(至于為什么是這個地方,可以百度,很有意思),我們生成的是test.bin,也就是二進制文件,可以直接執行。

好了,程序有了,還需要把它寫入存儲介質的啟動扇區,那我們就來創建一個。

  • dd if=/dev/zero of=floppy.img bs=512 count=2880
  • dd if=test.bin of=floppy.img

我們創建了一個512 bytes的img文件,然后把我們的程序寫入。

現在/home/chao/Documents/目錄下面應該是這個樣子的

?

好了,啟動設備已經就緒,我們還需要測試下它行不行,那就用到bochs了,它是一個虛擬機軟件,

安裝命令:

sudo apt-get install bochs bochs-sdl

有的地方說安裝bochs-x,但是會出現問題,保險起見還是用bochs-sdl.

現在我們為bochs寫一個配置文件

在/home/chao/Documents/目錄下創建bochsrc.txt

1 megs: 32
2 #romimage: file=/usr/share/bochs/BIOS-bochs-latest, address=0xf0000
3 #vgaromimage: /usr/share/bochs/VGABIOS-lgpl-latest
4 floppya: 1_44=floppy.img, status=inserted
5 boot: a
6 log: bochsout.txt
7 mouse: enabled=0
8 display_library: sdl

注意:2,3行中的路徑可能不同,根據自己的系統查找BIOS-bochs-latest和VGABIOS-lgpl-latest(也可能是其它的而不是VGA,根據自己的情況設置)。

為了方便,可以創建一個build.sh腳本

?

1 as test.S -o test.o
2 ld -Ttext 0x7c00 --oformat=binary test.o -o test.bin
3 dd if=/dev/zero of=floppy.img bs=512 count=2880
4 dd if=test.bin of=floppy.img

?

如果把創建img文件的步驟放入腳本中,那么/home/chao/Documents/目錄下現在有3個文件

?

?

?

打開終端,切換到此目錄,執行build.sh,然后所需要的文件都有了

然后執行命令

bochs

可以看到在bochs中顯示字符 X

至此,一個demo bootloader就寫完了。

這段代碼并沒有干什么事情,只是解釋了如何在計算機啟動時執行我們的代碼,真正的bootloader會加載內核程序(或者加載其他的程序,通過其他的程序來加載內核)。

轉載于:https://www.cnblogs.com/folk/p/5202518.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255949.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255949.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255949.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

定時執行某段程序

有時候我們需要每天 定時的 自動 去執行某段程序,那么這個功能如何實現呢? 經過百度,定時器就可以實現,總結如下: 我用控制臺寫了一個程序,用來在指定時間內 打印 “我執行了” 上面就是程序的運行結構&…

【error】深度優先搜索TypeError: unhashable type: ‘list‘

查網上的原因是: python字典的key不支持list類型和dict類型,需要轉換 但是我沒有使用到key,后來仔細查看發現是增加了一個裝飾器導致的,functions.lru.cache 把裝飾器注釋掉即可 # 利用深度搜索進行查找 lru_cache(None) def …

Okhttp 插入緩存攔截器 解析

我們在做網絡請求的時候,如果網絡請求過于頻繁而且請求的數據變動不大,或者基本沒有變動,這個時候如果沒有緩存功能,我們想一下 會浪費掉多少資源,一次請求刷新一次,去請求一次,不但會消耗用戶的…

淺談PROFINET IO通信的實時性

PROFINET由PROFIBUS國際組織(PROFIBUS International,PI)推出,是新一代基于工業以太網技術的自動化總線標準。作為一項戰略性的技術創新,PROFINET為自動化通信領域提 供了一個完整的網絡解決方案,囊括了諸如…

目標

學習計劃以及目標---------------------------------------------------------------------------------------------------------------------------------------------------------------- 正文 在上大學之前,可以說我完全是一個…

今日頭條核心技術“個性推薦算法”揭秘

今日頭條核心技術“個性推薦算法”揭秘 最近面試華興資本, 他們比較關注今日頭條算法的實現, 今天特轉載網上 今日頭條算法解密【IT168 評論】互聯網給用戶帶來了大量的信息,滿足了用戶在信息時代對信息的需求,也使得用戶在面對大…

PROFINET及其同步實時通訊分析

1 概述 PROFINET實時以太網是由Profibus International(PI)組織提出的基于以太網的自動化標準。從2004年4月開 始,PI與Interbus Club總線俱樂部聯手,負責合作開發與制定標準。PROFINET構成從I/O級直至協調治理級的基于組件的分…

【劍指offer15.二進制中1的個數】——位操作(左移右移等)

目錄 二進制的表示 二進制的位操作 應用: 劍指offer15.統計二進制中1的個數(多種方法,位右移操作、與操作等) 轉自:https://www.jianshu.com/p/3a31065a8e58 紅色為自己添加 我們都知道在計算機中所有的信息最終都…

java 異常處理機制(java 編程思想)

一、概念  “異常”這個詞有“我對此感到意外”的意思。問題出現了,你也許并不清楚該如何處理,但你的確知道不應該置之不理;你要停下來,看看是不是有別人或在別的地方,能夠處理這個問題。只是在當前的環境中還沒有足夠…

怎樣在CentOS 7.0上安裝和配置VNC服務器

這是一個關于怎樣在你的 CentOS 7 上安裝配置 VNC 服務的教程。當然這個教程也適合 RHEL 7 。在這個教程里,我們將學習什么是 VNC 以及怎樣在 CentOS 7 上安裝配置 VNC 服務器 。 我們都知道 這是一個關于怎樣在你的 CentOS 7 上安裝配置 VNC 服務的教程。當然這個教…

MOTOMAN機器人網絡控制的實現

最初程序員在Unix系統下使用Berkeley Socket編寫網絡程序,隨著Windows操作系統的普及,Microsoft、Sun等公司聯合開發了Winsock接口API。它實質上是一種進 程間通信,將之從單機環境擴展到網絡環境以適合于開發主機/客戶機通信程序。網絡通信的…

【劍指offer】——【python中return函數中的and和or表達式的返回值】

目錄 1、# and 結果為真,返回最后一個表達式的結果,若結果為假返回第一個為假的表達式的結果 2、# or 結果為真,返回第一個為真的表達式的結果,若結果為假,返回最后一個表達式的結果 3、應用[劍指 Offer 64. 求12…n…

Spring Cloud構建微服務架構:消息驅動的微服務(入門)【Dalston版】

2019獨角獸企業重金招聘Python工程師標準>>> 之前在寫Spring Boot基礎教程的時候寫過一篇《Spring Boot中使用RabbitMQ》。在該文中,我們通過簡單的配置和注解就能實現向RabbitMQ中生產和消費消息。實際上我們使用的對RabbitMQ的starter就是通過Spring C…

CXF 客服端調用報錯

服務端已經發布了WSDL,現在在客服端生成web service客服端代碼,在eclipse中新建一個project,然后new->web services->web service client生產客戶端代碼 在調用的時候報如下錯誤 解決:缺少axis相應的jar包,加入包…

20145225 《信息安全系統設計基礎》第10周學習總結

cp1.c 進行復制文件的操作,需要有源文件和目的文件,第一次命令沒有加入所以沒有正常完成復制文件的操作fileinfo.c 用來實現顯示文件信息。先判斷命令是否有操作數,有的話才能繼續進行下去,如果沒有報錯就打印出來相關文件信息&am…

做演員是圓夢 做生意學會面對現實

田樸珺是一位擁有多重身份的女性。她是一名演員,也是一位商人,還擔任過電影《中國合伙人》的制片人。 作為演員,田樸珺的作品并不是很多,也一直不溫不 火。但這并不代表她將放棄演藝生涯。她表示,如果機會合適&…

【深度學習】——模型評估指標MAP計算實例計算

目錄 一、知識儲備 1、IOU——交集面積與并集面積之比 2、混淆矩陣(TP、FP、FN、TN) 問題1:上面的TP等具體是如何計算得到的? 3、精度precision&召回率recall 二、ap計算實戰 1、計算流程 1)準備數據&#xf…

第 52 章 Web Server Optimization

系統配置 Intel(R) Xeon(TM) CPU 3.00GHzMemory 4GEthernet adapter 1000M52.1. ulimit 查看 ulimit ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited pending signals …

hdu5489 Removed Interval dp+線段樹優化

現在看這題居然直接秒了。。。去年看的時候還以為神題。。 設以第i項為結尾的lis前綴為f[i],以第j項為結尾的lis后綴為g[i],如果求出f[i]和g[j],然后枚舉i,快速找到最大的滿足a[j]>a[i]的g[j]就可以了。注意到如果將f[i]從后往…

JS原型鏈理解

1. 每個對象都有原型屬性(__proto__)2. 對象的原型(__proto__)指向其構造函數(Constructor)的prototype屬性3. 構造函數(Constructor)的prototype屬性本身也是一個對象,其原型(__proto__)亦指向其構造函數的prototype4. 如此形成一個鏈式結構,而Construc…