你好碳胳,我是 shengjk1勇蝙,多年大廠經(jīng)驗(yàn),努力構(gòu)建 通俗易懂的挨约、好玩的編程語(yǔ)言教程味混。 歡迎關(guān)注!你會(huì)有如下收益:
- 了解大廠經(jīng)驗(yàn)
- 擁有和大廠相匹配的技術(shù)等
希望看什么诫惭,評(píng)論或者私信告訴我翁锡!
一、背景
其實(shí)也沒(méi)有啥背景夕土。
最主要的原因就像 《30天自制操作系統(tǒng)》一書(shū)作者說(shuō)的那樣馆衔,寫(xiě)一個(gè)操作系統(tǒng)瘟判,僅僅想想就是一件特別有趣的事情呢。一兩年前曾經(jīng)入手開(kāi)始寫(xiě)過(guò)角溃,但慢慢的就不了了之了】交瘢現(xiàn)在又有這個(gè)想法了,準(zhǔn)備一直干下去减细,最終寫(xiě)一個(gè)操作系統(tǒng)出來(lái)匆瓜,算是程序員生涯的一份禮物。
其次的原因未蝌,是因?yàn)槲乙舱J(rèn)為未來(lái)初級(jí)程序員的崗位會(huì)越來(lái)越少驮吱,借助 LLM 人人都是初級(jí)程序員可能會(huì)變成現(xiàn)實(shí)。這個(gè)時(shí)候?qū)I(yè)性和底層就會(huì)越來(lái)越重要
二萧吠、匯編介紹
《30天自制操作系統(tǒng)》一書(shū)中第二課的匯編語(yǔ)言糠馆,注釋如下:
; hello-os
; TAB=4
; bootloader code
ORG 0x7c00 ; 指明程序裝載地址 出廠的時(shí)候BIOS就被組裝在電腦主板上的ROM單元里。電腦廠家在BIOS中預(yù)先寫(xiě)入了操作系統(tǒng)開(kāi)發(fā)人員經(jīng)常使用的一些程序
; 標(biāo)準(zhǔn)FAT12格式軟盤(pán)專(zhuān)用的代碼 Stand FAT12 format floppy code
JMP entry
DB 0x90
DB "HELLOIPL" ; 啟動(dòng)扇區(qū)名稱(chēng)(8字節(jié))
DW 512 ; 每個(gè)扇區(qū)(sector)大性醣铩(必須512字節(jié))
DB 1 ; 簇(cluster)大杏致怠(必須為1個(gè)扇區(qū))
DW 1 ; FAT起始位置(一般為第一個(gè)扇區(qū))
DB 2 ; FAT個(gè)數(shù)(必須為2)
DW 224 ; 根目錄大小(一般為224項(xiàng))
DW 2880 ; 該磁盤(pán)大邪泶(必須為2880扇區(qū)1440*1024/512)
DB 0xf0 ; 磁盤(pán)類(lèi)型(必須為0xf0)
DW 9 ; FAT的長(zhǎng)度(必??9扇區(qū))
DW 18 ; 一個(gè)磁道(track)有幾個(gè)扇區(qū)(必須為18)
DW 2 ; 磁頭數(shù)(必??2)
DD 0 ; 不使用分區(qū)毕匀,必須是0
DD 2880 ; 重寫(xiě)一次磁盤(pán)大小
DB 0,0,0x29 ; 意義不明(固定)
DD 0xffffffff ; (可能是)卷標(biāo)號(hào)碼
DB "HELLO-OS " ; 磁盤(pán)的名稱(chēng)(必須為11字?,不足填空格)
DB "FAT12 " ; 磁盤(pán)格式名稱(chēng)(必??8字?癌别,不足填空格)
RESB 18 ; 先空出18字節(jié)
; 程序主體
entry: ;0x7c50
MOV AX,0 ; 初始化寄存器 MOV:賦值
MOV SS,AX
MOV SP,0x7c00
MOV DS,AX
MOV ES,AX
MOV SI,msg
putloop:
MOV AL,[SI] ; [] 表示內(nèi)存皂岔,表示把 SI對(duì)應(yīng)的內(nèi)存地址上數(shù)據(jù)的1個(gè)字節(jié)的內(nèi)容讀入到 AL 中。 MOV的數(shù)據(jù)傳送源和傳送目的地不僅可以是寄存器或常數(shù)展姐,也可以是內(nèi)存地址躁垛。 MOV會(huì)自動(dòng)要求源數(shù)據(jù)和目標(biāo)數(shù)據(jù)位數(shù)一致
ADD SI,1 ; 給SI加1
CMP AL,0
JE fin ; 如果結(jié)果相等則跳轉(zhuǎn)到指定地址,如果不等則不跳轉(zhuǎn)
MOV AH,0x0e ; 顯示一個(gè)字符 INT 0x10, AH = 0xE -- display char圾笨,這是調(diào)用 BIOS 的 “Teletype Output” 功能教馆,用于在屏幕上顯示一個(gè)字符,并推進(jìn)光標(biāo)
MOV BX,15 ; 指定字符顏色
INT 0x10 ; 調(diào)用顯卡顯示文字,INT 0x10 = Video display functions (including VESA/VBE) INT軟件中斷指令
JMP putloop
fin:
HLT ; 讓CPU停止擂达,等待指令
JMP fin ; 無(wú)限循環(huán)
msg: ;0x7c74
DB 0x0a, 0x0a ; 換行兩次
DB "hello, world"
DB 0x0a ; 換行
DB 0
RESB 0x7dfe-$ ; 填寫(xiě)0x00填充到0x7def, 有了 ORG土铺,$代表將要讀入的內(nèi)存地址
DB 0x55, 0xaa
; AX —— accumulator,累加寄存器 0-7位的低8位成為AL,8-15位的高8位稱(chēng)為 AH
; CX —— counter板鬓,計(jì)數(shù)寄存器
; DX —— data悲敷,數(shù)據(jù)寄存器
; BX —— base,基址寄存器 通常在內(nèi)存尋址中用來(lái)存放基地址俭令。它與源索引SI和目的索引DI寄存器結(jié)合后德,可以用于訪問(wèn)數(shù)組或其他數(shù)據(jù)結(jié)構(gòu)。
; SP —— stack pointer抄腔,棧指針寄存器 SP寄存器指向當(dāng)前棧的頂部瓢湃。在執(zhí)行函數(shù)調(diào)用窟赏、參數(shù)傳遞、局部變量分配和函數(shù)返回時(shí)箱季,棧指針會(huì)相應(yīng)地增加或減少。
; BP —— base pointer棍掐,基地址指針寄存器 通常用于訪問(wèn)堆棧中的局部變量和函數(shù)參數(shù)藏雏。在棧幀中,BP通常指向幀的起始位置作煌。
; SI —— source index掘殴,源變址寄存器 通常用于字符串操作和數(shù)組處理中,指向源數(shù)據(jù)的位置
; DI —— destination index粟誓,目的變址寄存器 同樣用于字符串操作和數(shù)組處理奏寨,但它指向目標(biāo)數(shù)據(jù)的位置
; 這些都是 16 位寄存器,所以可以存儲(chǔ)16位的二進(jìn)制. 按照機(jī)器語(yǔ)言中寄存器的編號(hào)順序排列的
; 指令編碼:操作碼 opcode 和 操作數(shù) operand 構(gòu)成
; CPU中的8個(gè)8位寄存器鹰服,具體為:
; AL——累加寄存器低位(accumulator low)
; CL——計(jì)數(shù)寄存器低位(counter low)
; DL——數(shù)據(jù)寄存器低位(data low)
; BL——基址寄存器低位(base low)
; AH——累加寄存器高位(accumulator high)
; CH——計(jì)數(shù)寄存器高位(counter high)
; DH——數(shù)據(jù)寄存器高位(data high)
; BH——基址寄存器高位(base high)
; 段寄存器
; 這些段寄存器都是16位寄存器病瞳。
; ES——附加段寄存器(extra segment)
; CS——代碼段寄存器(code segment)
; SS——棧段寄存器(stack segment)
; DS——數(shù)據(jù)段寄存器(data segment)
; FS——沒(méi)有名稱(chēng)(segment part 2)
; GS——沒(méi)有名稱(chēng)(segment part 3)
重點(diǎn)關(guān)注一下幾個(gè)點(diǎn):
- 通過(guò)匯編開(kāi)發(fā)程序,被成為 Bootloader Code 具體 Bootloader 是什么以及在計(jì)算機(jī)啟動(dòng)過(guò)程中有啥作用悲酷,這篇文章有較為詳細(xì)的介紹
- 程序的裝在位置什么是:0x7c00
這一塊是 IBM 大叔們規(guī)定的套菜,It should also be noted that your bootloader code is loaded and running in memory at physical addresses 0x7C00 through 0x7DFF. - INT 0x10, MOV AH 0xE 表示 display char。這些都是在調(diào)用 BIOS function
- BIOS 在這篇文章中也有介紹设易。
這里再補(bǔ)充一下:BIOS 是計(jì)算機(jī)出廠時(shí)就被組裝在電腦主板上的ROM單元里逗柴。電腦廠家在BIOS中預(yù)先寫(xiě)入了操作系統(tǒng)開(kāi)發(fā)人員經(jīng)常使用的一些程序。
三顿肺、Makefile
Makefile 是一個(gè)文本文件戏溺,用于控制自動(dòng)化構(gòu)建過(guò)程,特別是在軟件開(kāi)發(fā)領(lǐng)域屠尊。它是由 make 命令讀取的腳本旷祸,用來(lái)指導(dǎo)編譯器和鏈接器如何構(gòu)建源代碼、庫(kù)和其他依賴(lài)項(xiàng)讼昆。
Makefile 通常包含以下元素:
- 目標(biāo)(Targets):Makefile 中的目標(biāo)通常是最終要生成的文件肋僧,比如可執(zhí)行程序或庫(kù)文件。
- 依賴(lài)關(guān)系:每個(gè)目標(biāo)可以有零個(gè)或多個(gè)依賴(lài)項(xiàng)控淡,這些依賴(lài)項(xiàng)是該目標(biāo)所依賴(lài)的其他目標(biāo)和文件的列表嫌吠。
- 命令:當(dāng)目標(biāo)的依賴(lài)項(xiàng)比目標(biāo)本身更新時(shí),需要執(zhí)行的命令列表掺炭,例如編譯器的編譯指令等辫诅。
- 變量:用于簡(jiǎn)化 Makefile 的維護(hù)和增強(qiáng)其可讀性的名稱(chēng)/值對(duì)。
- 自動(dòng)變量和模式規(guī)則:用于進(jìn)一步抽象常見(jiàn)的構(gòu)建任務(wù)涧狮。
- 隱含規(guī)則:make 提供了一些內(nèi)置的規(guī)則和變量炕矮,可用于常見(jiàn)的目標(biāo)類(lèi)型么夫,如 .o 文件和可執(zhí)行文件。
Makefile 的語(yǔ)法相對(duì)簡(jiǎn)單肤视,但是非常強(qiáng)大且靈活档痪,可以適應(yīng)各種復(fù)雜的構(gòu)建場(chǎng)景。對(duì)于大型項(xiàng)目來(lái)說(shuō)邢滑,手工編譯每一個(gè)模塊不僅費(fèi)時(shí)而且容易出錯(cuò)腐螟,而 Makefile 可以幫助自動(dòng)化這一過(guò)程,確保項(xiàng)目的各個(gè)部分按照正確的順序和規(guī)則進(jìn)行編譯和鏈接困后。
在實(shí)際的開(kāi)發(fā)環(huán)境中乐纸,尤其是涉及 C/C++ 語(yǔ)言的項(xiàng)目中,Makefile 被廣泛使用摇予。此外汽绢,許多現(xiàn)代構(gòu)建系統(tǒng)和包管理器(如 CMake、GNU Build System 等)也支持或生成為舊版 make 系統(tǒng)編寫(xiě)的 Makefile侧戴。
四宁昭、BIOS 擴(kuò)展
BIOS(基本輸入輸出系統(tǒng))是一種固件,它既不屬于純粹的軟件也不完全是硬件酗宋。固件是介于軟件和硬件之間的一種特殊形式久窟,它通常被編程到計(jì)算機(jī)主板上的一塊閃存或EPROM芯片中。BIOS負(fù)責(zé)在計(jì)算機(jī)啟動(dòng)時(shí)初始化硬件本缠,并提供一個(gè)到操作系統(tǒng)的橋梁斥扛,使得計(jì)算機(jī)能夠加載操作系統(tǒng)。雖然BIOS在功能上類(lèi)似于軟件丹锹,但它的存儲(chǔ)和執(zhí)行方式又與硬件相似稀颁,因此它被看作是一種固件。
BIOS(基本輸入輸出系統(tǒng))的概念最初是在1975年由Gary Kildall為Intel 8080微處理器設(shè)計(jì)的CP/M操作系統(tǒng)(Control Program/Monitor)的一部分而產(chǎn)生的楣黍。以下是BIOS發(fā)展的一些關(guān)鍵點(diǎn):
- CP/M操作系統(tǒng):Gary Kildall創(chuàng)建的CP/M操作系統(tǒng)需要一個(gè)方法來(lái)與不同的硬件進(jìn)行通信匾灶。為了解決這個(gè)問(wèn)題,他設(shè)計(jì)了一個(gè)BIOS租漂,它包含了一系列底層硬件接口的例程阶女,這些例程可以被CP/M調(diào)用以執(zhí)行輸入輸出操作。
- IBM PC的推出:1981年哩治,IBM推出了第一臺(tái)個(gè)人計(jì)算機(jī)IBM PC秃踩。為了使軟件開(kāi)發(fā)變得更加容易,IBM決定在其PC上使用BIOS來(lái)提供一個(gè)標(biāo)準(zhǔn)的硬件接口业筏。這樣憔杨,軟件開(kāi)發(fā)者就可以編寫(xiě)應(yīng)用程序,而不必?fù)?dān)心與各種硬件的直接交互蒜胖。
- BIOS的作用:在IBM PC中消别,BIOS負(fù)責(zé)在計(jì)算機(jī)啟動(dòng)時(shí)執(zhí)行POST(電源自檢)來(lái)檢查硬件配置抛蚤,初始化硬件組件,并提供一個(gè)引導(dǎo)加載程序來(lái)從磁盤(pán)或其他存儲(chǔ)設(shè)備加載操作系統(tǒng)寻狂。
- 兼容性和標(biāo)準(zhǔn)化:隨著IBM PC及其兼容機(jī)的普及岁经,BIOS成為行業(yè)標(biāo)準(zhǔn)。其他硬件制造商開(kāi)始為他們的主板編寫(xiě)兼容的BIOS蛇券,以保持與IBM PC軟件的兼容性缀壤。
- BIOS的發(fā)展:隨著時(shí)間的推移,BIOS的功能不斷擴(kuò)展怀读,以支持新的硬件技術(shù)和功能。盡管后來(lái)UEFI(統(tǒng)一可擴(kuò)展固件接口)開(kāi)始逐漸取代傳統(tǒng)的BIOS骑脱,但BIOS的概念和基本功能仍然在現(xiàn)代計(jì)算機(jī)系統(tǒng)中發(fā)揮著作用菜枷。
BIOS的產(chǎn)生是計(jì)算機(jī)歷史上一個(gè)重要的里程碑,它為硬件和軟件之間的標(biāo)準(zhǔn)化交互奠定了基礎(chǔ)叁丧,并且極大地推動(dòng)了個(gè)人計(jì)算機(jī)的普及和發(fā)展啤誊。
五、總結(jié)
通過(guò)匯編語(yǔ)言的介紹拥娄,作者展示了操作系統(tǒng)開(kāi)發(fā)的基礎(chǔ)蚊锹,包括Bootloader Code的重要性和BIOS在計(jì)算機(jī)啟動(dòng)過(guò)程中的作用。Makefile的自動(dòng)化構(gòu)建過(guò)程和BIOS的歷史發(fā)展也被詳細(xì)闡述稚瘾,為讀者提供了計(jì)算機(jī)系統(tǒng)開(kāi)發(fā)的深入理解牡昆。