系統(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)該是這樣子:
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
-----------------------------------------------------分界線(不相干的另外一個(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
step2.打上補(bǔ)丁唾那,使源代碼與最新的 gcc 版本兼容,并進(jìn)行編譯
work/Linux_0.01
cd Linux_0.01
patch -p1 < linux_0.01_Compilations_changes.patch
step3.編譯源碼
make
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
成功如下:
tips
由于linux0.01年代久遠(yuǎn)褪尝,要打上不少補(bǔ)赌只瘛:
不要少:
sudo apt install bin86 gcc-multilib build-essential qemu-system-x86 libssl-dev
make失敗
所有Makefile文件加上-std = gnu89
sudo apt install gcc-multilib
增加選項(xiàng) -nographic
一些文件補(bǔ)镀谌:
/home/work2/Linux_0.01/tools/build.c
/home/work2/Linux_0.01/fs/bitmap.c
/home/work2/Linux_0.01/fs/namei.c
/home/work2/Linux_0.01/include/asm/segment.h
/home/work2/Linux_0.01/kernel/fork.c
/home/work2/Linux_0.01/kernel/console.c
/home/work2/Linux_0.01/kernel/hd.c
探索路上小小記錄...
本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布!