1 具體操作
- 下載 linux-3.18.6內核
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz
- 解壓進入linux-3.18.6文件夾
tar -xvf linux-3.18.6.tar.xz
cd linux-3.18.6/
- 編譯
#make x86_64_defconfig # 為x86_64生成配置
#make alldefconfig
make i386_defconfig
make
可能會遇到無compiler-gcc9.h文件的問題,可以在/include/linux目錄直接復制一份文件
cp compiler-gcc5.h compiler-gcc9.h
- ubuntu可以直接使用apt-get來安裝32位的編譯環境和庫
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libgcc1:i386 g++-multilib gcc-multilib
- 通過rootfs/menu生成鏡像(一個最簡單的根文件系統鏡像)
cd /rootfs/menu
gcc -pthread -o init linktable.c menu.c test.c -m32 -static # m32編譯
cp init ../
cd ..
find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img # 將當前menu目錄下所有文件打包為一個鏡像文件,
- 啟動
# 在linux-3.18.6目錄下啟動linux內核與menos
qemu-system-i386 -kernel arch/x86/boot/bzImage -initrd rootfs.img
2 menuos調試
2.1 make menuconfig
make menuconfig的作用是提供一個圖形化界面,讓用戶能夠選擇和配置內核的各種功能和模塊,這些配置信息最終會被保存在.config文件中。
具體來說,make menuconfig的工作流程大致如下:
- 讀取Kconfig文件:make menuconfig會讀取內核源代碼中各個目錄下的Kconfig文件,這些文件定義了內核的配置選項及其依賴關系。
- 生成配置界面:基于Kconfig文件中的信息,make menuconfig會生成一個圖形化的配置界面,讓用戶能夠通過菜單和選項來選擇和配置內核的功能和模塊。
- 保存配置結果:用戶在配置界面中完成配置后,可以將配置結果保存到.config文件中。這個文件包含了所有內核編譯時需要的配置信息。
- 影響編譯過程:在后續的編譯過程中(如執行make命令時),Makefile文件會讀取.config文件中的配置信息,并根據這些信息來決定哪些代碼需要被編譯、哪些模塊需要被包含在內核中,以及如何進行編譯和鏈接等操作。
因此,雖然make menuconfig不會直接生成Makefile文件,但它通過生成和更新.config文件來間接影響Makefile的編譯過程。用戶通過make menuconfig配置的選項最終會被Makefile用來指導內核的編譯和鏈接。
2.2 編譯攜帶調試信息
- 重新編譯,攜帶調試信息
make menuconfig
# 選擇compile-time checks and compiler options的debug_info選項即可
如果不行,直接修改MakeFile
# 在第一個CONFIG_DEBUG_INFO之前加入
CONFIG_DEBUG_INFO=y
然后直接編譯
make
運行
# 啟動內核
qemu-system-i386 -kernel arch/x86/boot/bzImage -initrd rootfs.img -S -s
# 啟動gdb vmlinuxgdb vmlinux
#在gdb中執行,調試連接target remote:1234
# 在gdb中執行命令c, 此時內核會正常運行c