elf section类型_在 498 行极小 OS 上跑标准 ELF 程序
簡(jiǎn)介
ELF 在 Linux 系統(tǒng)中作為標(biāo)準(zhǔn)可執(zhí)行文件格式已經(jīng)存在了 ~25 年。
如果要在 Linux 下直接研究 ELF,通常很難繞過(guò) Linux 本身的復(fù)雜度。
為了降低學(xué)習(xí) ELF 的門檻,今天特地引薦一個(gè)極小的系統(tǒng),這個(gè)小系統(tǒng)不僅有 “Bootloader”,有 “OS”,還能加載和運(yùn)行標(biāo)準(zhǔn)的可以打印 Hello 的 ELF 程序。
所有這些都由 CS630-Qemu-Lab 提供。它是一套用于學(xué)習(xí)舊金山大學(xué)課程 CS 630: Advanced Microcomputer Programming 的極簡(jiǎn)實(shí)驗(yàn)環(huán)境,是一個(gè)由泰曉科技主導(dǎo)的開源項(xiàng)目。
它可以獨(dú)立使用,也可以在 Linux Lab 下使用。下面介紹如何在 Linux Lab 下使用它。
準(zhǔn)備環(huán)境
先準(zhǔn)備 Linux Lab(非 Ubuntu 系統(tǒng)請(qǐng)?zhí)崆鞍惭b好 Docker):
$ git clone https://gitee.com/tinylab/cloud-lab $ cd cloud-lab $ tools/docker/run linux-lab執(zhí)行完正常會(huì)看到一個(gè)啟動(dòng)了 LXDE 桌面的瀏覽器,進(jìn)去以后,點(diǎn)擊桌面的控制臺(tái),啟動(dòng)后下載 CS630-Qemu-Lab 到 /labs 目錄下:
$ cd /labs $ git clone https://gitee.com/tinylab/cs630-qemu-lab $ cd cs630-qemu-lab一鍵運(yùn)行 ELF
接下來(lái),通過(guò) CS630 Qemu Lab 提供的極速體驗(yàn)方式,一鍵編譯 Bootloader, OS 和 Hello 匯編程序,并自動(dòng)依次運(yùn)行:
$ make boot SRC=res/elfexec.s APP=res/hello.s運(yùn)行完以后,會(huì)彈出一個(gè) Qemu 界面,并在屏幕打印一個(gè) Hello 字符串。
默認(rèn)是從軟盤加載程序,如果要改為硬盤,可以用:
$ make boot-hd SRC=res/elfexec.s APP=res/hello.s初步解讀
這個(gè)實(shí)驗(yàn)主要包含如下三部分:
- “Bootloader”
- src/quikload_floppy.s:實(shí)際代碼只有 68 行
- src/quikload_hd.s:實(shí)際代碼只有 44 行
- “OS”
- res/elfexec.s:實(shí)際代碼只有 430 行,有提供 write, exit 等幾個(gè)小的系統(tǒng)調(diào)用,還能加載標(biāo)準(zhǔn) ELF
- “APP”
- res/hello.s:實(shí)際代碼僅 19 行,可以打印 Hello 字符串,編譯生成標(biāo)準(zhǔn)的 ELF 程序
以 Floppy 版本為例,上述 bootloader 和 os 加起來(lái)僅有 498 行代碼,含注釋和空行也才 644 行,相比龐大的 Linux 來(lái)講,可謂極其微小,因此特別適合核心 ELF 原理分析。
題外話
CS630 Qemu Lab 的匯編語(yǔ)言實(shí)驗(yàn)案例非常豐富,全部以 X86 為平臺(tái),以 Linux AT&T 匯編語(yǔ)法撰寫,代碼簡(jiǎn)潔清晰,非常適合學(xué)習(xí)。例如,跑一個(gè) rtc 程序:
$ make boot SRC=src/rtc.s下面是演示視頻:
小結(jié)
Jonathan Blow 在莫斯科 DevGAMM 上,做了一個(gè)題為《阻止文明倒塌》的演講。
這個(gè)演講反應(yīng)了一個(gè)普遍的情況,某個(gè)項(xiàng)目,隨著功能的迭代和技術(shù)的發(fā)展,其功能不斷豐富,復(fù)雜度卻在不斷增加。對(duì)于后來(lái)者,學(xué)習(xí)難度和門檻就變得越來(lái)越高。很多內(nèi)容,由于逐步遠(yuǎn)離了當(dāng)初設(shè)計(jì)者和開發(fā)者的環(huán)境,新來(lái)的維護(hù)人員極易出現(xiàn)理解偏差,隨著老一輩 Maintainers 逐漸地離開,系統(tǒng)可能會(huì)變得越來(lái)越難以維護(hù)。
Linux 有點(diǎn)類似這樣,它正在變得越來(lái)越復(fù)雜,我們學(xué)習(xí)一個(gè)可執(zhí)行文件格式,得抱著幾本大磚頭 Linux 圖書,并從數(shù)萬(wàn)行代碼中找出那些關(guān)聯(lián)的片段,看上去就是一個(gè)令人畏懼的工程。
泰曉科技致力于降低 Linux 技術(shù)的學(xué)習(xí)和研究門檻,我們正在做很多努力,去簡(jiǎn)化問(wèn)題的復(fù)雜度,一方面構(gòu)建了多套極簡(jiǎn)又容易快速上手的實(shí)驗(yàn)環(huán)境,另外一方面,從產(chǎn)品實(shí)戰(zhàn)的細(xì)微處追本溯源,分享了大量的技術(shù)原創(chuàng)文章,爭(zhēng)取見微知著。
后續(xù)將進(jìn)一步深度解讀這個(gè) 498 行的極小系統(tǒng),敬請(qǐng)關(guān)注;加微信號(hào) tinylab 可申請(qǐng) “Linux ELF 剖析”系列文章pdf合集。
歡迎關(guān)注專欄作者開設(shè)的 C 語(yǔ)言進(jìn)階課《360° 剖析 ELF》, 進(jìn)一步學(xué)習(xí) Linux ELF 工作原理。
掃碼關(guān)注并加 tinylab,可獲贈(zèng)該系列文章 pdf 合集
Linux ELF 系列文章合集(持續(xù)連載中):
- 吳章金falcon:上手9套工具,玩轉(zhuǎn)二進(jìn)制文件
- 吳章金falcon:為 Linux a.out 舉行一個(gè)特殊的告別儀式
- 吳章金falcon:在 498 行極小 OS 上跑標(biāo)準(zhǔn) ELF 程序
- 吳章金falcon:如何創(chuàng)建一個(gè)可執(zhí)行的 Linux 共享庫(kù)
- 吳章金falcon:深度剖析 Linux 共享庫(kù)的“位置無(wú)關(guān)”實(shí)現(xiàn)原理
- 吳章金falcon:通過(guò)操作 Section 為 Linux ELF 程序新增數(shù)據(jù)
- 吳章金falcon:實(shí)例解析 Linux C 語(yǔ)言程序之變量類型
- 吳章金falcon:《360°剖析Linux ELF》視頻課程新增 15 份實(shí)驗(yàn)材料,累計(jì)已超 70 份
總結(jié)
以上是生活随笔為你收集整理的elf section类型_在 498 行极小 OS 上跑标准 ELF 程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。