Linux內(nèi)核編譯(版本6.0以及版本v0.01)并用qemu驅(qū)動(dòng)

系統(tǒng)環(huán)境:
ubuntu-22.04.1-desktop-amd64
目標(biāo)平臺(tái):
x86 i386
內(nèi)核版本:
linux-6.0.1
linux-0.0.1

環(huán)境配置

修改root密碼
sudo passwd
修改軟件源(非必要)
vmtools安裝(實(shí)現(xiàn)win-linux軟件互傳)
安裝一些必須的軟件

  • sudo apt install build-essential openssh-server vim net-tools gcc-arm-linux-gnueabi qemu-system-x86 libssl-dev ncurses-dev genext2fs pigz lrzsz unzip

(build-essential”,它包含了 GNU 編輯器集合萝风,GNU 調(diào)試器憎妙,和其他編譯軟件所必需的開發(fā)庫和工具)
(qemu-system-x86 安裝qemu)

rootfs 構(gòu)建

1. cd /path/to/workspace

  • 進(jìn)入到指定的工作目錄顷歌,即工作空間的根目錄孕讳。

2. wget https://buildroot.org/downloads/buildroot-2021.08.tar.gz

  • 使用wget命令從指定URL下載buildroot-2021.08.tar.gz文件。
  • wget是一個(gè)用于在命令行中下載文件的工具炫惩。

3. tar -xvzf buildroot-2021.08.tar.gz

  • 對(duì)buildroot-2021.08.tar.gz文件進(jìn)行解壓縮。
  • tar命令用于解壓縮和歸檔文件,選項(xiàng)x表示提取忽匈,v表示顯示詳細(xì)信息,z表示使用gzip進(jìn)行壓縮矿辽。

** 4.cd buildroot-2021.08**

  • 進(jìn)入解壓后的buildroot-2021.08目錄丹允。

** 5. make menuconfig**

  • 使用make命令運(yùn)行buildroot的配置菜單。
  • 這個(gè)命令打開一個(gè)文本界面嗦锐,允許用戶選擇構(gòu)建配置選項(xiàng)嫌松。

6.在配置菜單中進(jìn)行以下選擇:

  • Target options -> Target Architecture 選擇 i386
    ■ 設(shè)置目標(biāo)架構(gòu)為i386,表示將構(gòu)建適用于i386架構(gòu)的系統(tǒng)奕污。
  • Toolchain -> Enable C++ support 打開
    ■ 啟用C++支持萎羔,表示構(gòu)建時(shí)將包括對(duì)C++的支持。

7.make

  • 使用make命令開始構(gòu)建buildroot環(huán)境碳默。
  • make命令會(huì)根據(jù)之前的配置選項(xiàng)編譯構(gòu)建root文件系統(tǒng)和交叉編譯工具鏈贾陷。

8. export PATH=pwd/output/host/bin:$PATH

  • 將構(gòu)建生成的交叉編譯工具鏈路徑添加到當(dāng)前的環(huán)境變量中。
  • export命令用于設(shè)置環(huán)境變量嘱根,這里將路徑添加到PATH變量中髓废,使其可執(zhí)行文件可在命令行中直接使用。

9. cd ..

  • 返回到上一級(jí)目錄该抒。

10.mkdir rootfs

  • 在當(dāng)前目錄下創(chuàng)建一個(gè)名為rootfs的文件夾慌洪。

11. cd rootfs

  • 進(jìn)入rootfs文件夾。

12. tar vxf ../buildroot-2021.08/output/images/rootfs.tar

  • 解壓縮之前構(gòu)建生成的root文件系統(tǒng)(rootfs)凑保。
  • v表示顯示詳細(xì)信息冈爹,x表示提取,f表示指定要提取的文件欧引。

13. find . | cpio -o -H newc | pigz -5 > pwd/rootfs.img

  • 使用find命令找到當(dāng)前目錄中的所有文件频伤,并將其通過管道傳遞給cpio命令。
  • cpio命令將文件打包為newc格式的cpio歸檔文件芝此。
  • "|"符號(hào)將前一個(gè)命令的輸出作為后一個(gè)命令的輸入憋肖。
  • pigz命令將輸入的數(shù)據(jù)進(jìn)行壓縮,并將結(jié)果寫入到rootfs.img文件中婚苹。
  • -5表示使用較高的壓縮級(jí)別岸更,值越大壓縮率越高。
  • pwd表示當(dāng)前工作目錄的路徑膊升,將rootfs.img文件寫入到rootfs文件夾中坐慰。
    ** 總結(jié)如下代碼**
wget https://buildroot.org/downloads/buildroot-2021.08.tar.gz
tar -xvzf buildroot-2021.08.tar.gz
cd buildroot-2021.08
make menuconfig
#Target options -> Target Architecture 選擇 i386
 Toolchain -> Enable C++ support 打開
make
export PATH=`pwd`/output/host/bin:$PATH
cd ..
mkdir rootfs
cd rootfs
tar vxf ../buildroot-2021.08/output/images/rootfs.tar
find . | cpio -o -H newc | pigz -5 > `pwd`/rootfs.img

編譯linux kernel

1.$cd /path/to/workspace
進(jìn)入到指定的工作目錄,即工作空間的根目錄。

2.$wget https://mirror.tuna.tsinghua.edu.cn/kernel/v6.x/linux-6.0.1.tar.gz

使用wget命令從指定URL下載Linux內(nèi)核源代碼的壓縮包结胀。
這里下載的是Linux 6.0.1版本的源代碼赞咙。

3.$ tar -xzvf linux-6.0.1.tar.gz

對(duì)Linux內(nèi)核源代碼壓縮包進(jìn)行解壓縮。
tar命令用于解壓縮和歸檔文件糟港,選項(xiàng)x表示提取攀操,z表示使用gzip進(jìn)行壓縮,v表示顯示詳細(xì)信息秸抚。

4.$ cd linux-6.0.1

進(jìn)入解壓后的Linux內(nèi)核源代碼目錄速和。

5.$ make ARCH=i386 defconfig
使用make命令為i386架構(gòu)配置內(nèi)核的默認(rèn)配置選項(xiàng)。
ARCH=i386表示編譯針對(duì)i386架構(gòu)的內(nèi)核剥汤。
defconfig表示使用默認(rèn)的配置選項(xiàng)文件進(jìn)行配置颠放。

6.$ make ARCH=i386 bzImage
使用make命令編譯內(nèi)核并生成bzImage文件。
ARCH=i386表示編譯針對(duì)i386架構(gòu)的內(nèi)核吭敢。
bzImage是一個(gè)壓縮的內(nèi)核鏡像文件碰凶,是Linux內(nèi)核的一種常見格式。
這些代碼的目的是下載Linux內(nèi)核源代碼鹿驼,并在指定架構(gòu)下進(jìn)行配置和編譯欲低,最終生成一個(gè)bzImage文件,該文件可以作為啟動(dòng)Linux系統(tǒng)的內(nèi)核鏡像
cd /path/to/workspace
wget https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/snapshot/linux-5.14.tar.gz
tar -xzvf linux-5.14.tar.gz
cd linux-5.14

make ARCH=i386 defconfig
make ARCH=i386 bzImage

執(zhí)行完應(yīng)該是這樣子:

file

qemu驅(qū)動(dòng)

在linux-6.0.1目錄

qemu-system-i386 -m 2048M -kernel arch/i386/boot/bzImage --append "root=/dev/ram0 rdinit=/linuxrc console=ttyS0 " smp 1 -nographic -serial mon:stdio -initrd ../rootfs/rootfs.img

  • qemu-system-i386: 這是運(yùn)行 qemu-system 系統(tǒng)的命令畜晰。
  • -m 2048M: 指定系統(tǒng)的內(nèi)存大小為 2048MB砾莱。
  • -kernel arch/i386/boot/bzImage: 指定內(nèi)核鏡像的路徑為 arch/i386/boot/bzImage,這是 mu-system 內(nèi)核的路徑凄鼻。
    *-append "root=/dev/ram0 rdinit=/linuxrc console=ttyS0 ": 這是內(nèi)核啟動(dòng)參數(shù)腊瑟,用于傳遞給內(nèi)核的命令行參數(shù)。其中包含以下參數(shù):
  • root=/dev/ram0: 將 /dev/ram0 設(shè)置為根文件系統(tǒng)块蚌,這表示使用內(nèi)存中的一個(gè) RAM 磁盤作為根文件系統(tǒng)扫步。
  • rdinit=/linuxrc: 指定初始化進(jìn)程的路徑為 /linuxrc。
  • console=ttyS0: 將串口設(shè)備 ttyS0 設(shè)置為系統(tǒng)的控制臺(tái)輸出匈子。
  • smp 1: 啟用對(duì)稱多處理 (SMP) 模式,并指定處理器數(shù)量為 1闯袒。
  • -nographic: 禁用圖形界面顯示虎敦,只使用命令行界面。
  • -serial mon:stdio: 將串口設(shè)備連接到標(biāo)準(zhǔn)輸入/輸出政敢,從而可以通過標(biāo)準(zhǔn)輸入輸出進(jìn)行交互其徙。
  • -initrd ../rootfs/rootfs.img: 指定初始 RAM 磁盤映像的路徑為 ../rootfs/rootfs.img,這是包含根文件系統(tǒng)的映像文件喷户。


    file
file

-----------------------------------------------------分界線(不相干的另外一個(gè)part)補(bǔ)丁-------------------------------------------

Linux0.0.1編譯運(yùn)行

環(huán)境:

  • Ubuntu22.04.1
  • gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
  • qemu

Step1.克隆源碼
path/to/work
git clone https://github.com/mahadevvinay/Linux_0.01

file

step2.打上補(bǔ)丁唾那,使源代碼與最新的 gcc 版本兼容,并進(jìn)行編譯
work/Linux_0.01
cd Linux_0.01
patch -p1 < linux_0.01_Compilations_changes.patch

file

step3.編譯源碼
make
file

step4.驅(qū)動(dòng)(在用戶狀態(tài)執(zhí)行)
sudo qemu-system-i386 -drive format=raw,file=Image,index=0,if=floppy -boot a -hdb Images/linux-0.11.img -m 8 -machine pc-i440fx-2.5
成功如下:
file

tips

由于linux0.01年代久遠(yuǎn)褪尝,要打上不少補(bǔ)赌只瘛:
不要少:

sudo apt install bin86 gcc-multilib build-essential qemu-system-x86 libssl-dev

make失敗
所有Makefile文件加上-std = gnu89

file

file

sudo apt install gcc-multilib
file


file

增加選項(xiàng) -nographic

一些文件補(bǔ)镀谌:
/home/work2/Linux_0.01/tools/build.c


file

/home/work2/Linux_0.01/fs/bitmap.c


file

/home/work2/Linux_0.01/fs/namei.c
file

/home/work2/Linux_0.01/include/asm/segment.h
file

/home/work2/Linux_0.01/kernel/fork.c


file

/home/work2/Linux_0.01/kernel/console.c
file

/home/work2/Linux_0.01/kernel/hd.c


file

探索路上小小記錄...

主頁鏈接:http://www.xiaocr.fun/

本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末避诽,一起剝皮案震驚了整個(gè)濱河市龟虎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沙庐,老刑警劉巖鲤妥,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拱雏,居然都是意外死亡棉安,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門铸抑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贡耽,“玉大人,你說我怎么就攤上這事羡滑」阶Γ” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵柒昏,是天一觀的道長凳宙。 經(jīng)常有香客問我,道長职祷,這世上最難降的妖魔是什么氏涩? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮有梆,結(jié)果婚禮上是尖,老公的妹妹穿的比我還像新娘。我一直安慰自己泥耀,他們只是感情好饺汹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著痰催,像睡著了一般兜辞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上夸溶,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天逸吵,我揣著相機(jī)與錄音,去河邊找鬼缝裁。 笑死扫皱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播韩脑,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼氢妈,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了扰才?” 一聲冷哼從身側(cè)響起允懂,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎衩匣,沒想到半個(gè)月后蕾总,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡琅捏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年生百,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柄延。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蚀浆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搜吧,到底是詐尸還是另有隱情市俊,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布滤奈,位于F島的核電站摆昧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蜒程。R本人自食惡果不足惜绅你,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昭躺。 院中可真熱鬧忌锯,春花似錦、人聲如沸领炫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帝洪。三九已至似舵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碟狞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國打工婚陪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留族沃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像脆淹,于是被迫代替她去往敵國和親常空。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容