2022.2.12.-10
本文闡述拿到Linux源碼之后,如何對其進行配置、編譯,讓Linux跑到目標硬件環(huán)境上。
閱讀建議:
如果你關(guān)心linux內(nèi)核編譯和調(diào)試,只用看1和5。
如果你關(guān)注Linux移植,需要全看,特別要注意步驟4。
linux中,存在多種配置方式,這些方式都是圖形化給普通人看的:
這些不同的配置方式原理是相似的
在Linux倉庫里已經(jīng)適配的開發(fā)板如果要用的開發(fā)版已經(jīng)在Linux倉庫里了,可以先使用defconfig,選擇開發(fā)板的默認配置,然后在此基礎(chǔ)上使用圖形化的配置方法進行個性化配置。
方法如下進入到Linux代碼目錄下,進行配置:
make ARCH=arm vexpress_defconfig
make ARCH=arm menuconfig
# 還可以使用 make ARCH=arm nconfig/xconfig/gconfig
ARCH請選擇Linux目錄arch子目錄下的名稱,如果不指定arm,則會自動檢測當前的體系結(jié)構(gòu),基本上都是x86.
默認的配置文件請選擇對應(yīng)的arch目錄下的configs文件夾下的文件
如果倉庫里沒有我們想要的開發(fā)板,可以直接采用menuconfig進行逐一配置。
make ARCH=arm menuconfig
# 還可以使用 make ARCH=arm nconfig/xconfig/gconfig
本文認為更靠譜、更快速的方式是找一個倉庫中已有的開發(fā)板,復(fù)制一份其defconfig,即建立一個自定義的defconfig進行集中修改,然后再使用menuconfig進行修改。
編譯配置好的Linux編譯的前提,一定是通過前面的配置,生成了.config,這是會影響到各個功能模塊的選擇。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
編譯好之后,會得到vmlinux,這是一個elf格式的可執(zhí)行文件。
2. Bootloader為什么要有Bootloader?
vmlinux的入口地址是0x80008000,不是0x0或者某個所有硬件都遵循的地址,所以這個elf并不能夠直接運行,而是需要一個軟件將其搬移到正確的位置,然后將控制權(quán)交給它。
uboot的編譯和配置過程與linux相似(configs文件夾提前了),本小節(jié)直接給出編譯vexpress的Uboot的過程。
git clone https://github.com/u-boot/u-boot.git
cd u-boot
make ARCH=arm vexpress_ca9x4_defconfig
make ARCH=arm menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
編譯結(jié)束之后,在根目錄下,會生成u-boot,這是一個elf文件
根文件系統(tǒng)可以提供應(yīng)用代碼存儲的地方,在linux啟動之后,從文件系統(tǒng)中加載應(yīng)用程序進行執(zhí)行。此外,還可以存儲驅(qū)動module,存儲Linux命令的鏡像等等,實際上根文件系統(tǒng)相當于提供了一個與Linux內(nèi)核交互的方式。
wget https://www.busybox.net/downloads/busybox-1.36.0.tar.bz2
tar -xvf busybox-1.36.0.tar.bz2
cd busybox-1.36.0
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm menuconfig
mkdir myrootfs
make install CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm CONFIG_PREFIX=myrootfs -j20
編譯之后,可以在指定的文件夾下面看到被寫入了四個文件(夾)。
可以看見,以及生成了很多l(xiāng)inux下的命令,這樣我們就能在目標板上使用linux命令了。
# 創(chuàng)建硬盤鏡像,block_size=1M,1024個block, 即1GB硬盤
dd if=/dev/zero of=rootfs.ext3 bs=1M count=1024
# 將這個硬盤進行分區(qū)
sgdisk -n 0:0:+10M -c 0:kernel rootfs.ext3
sgdisk -n 0:0:0 -c 0:rootfs rootfs.ext3
# 將這個硬盤鏡像,映射到文件夾,方便做操作
losetup -f
sudo losetup /dev/loop1 rootfs.ext3
sudo partprobe /dev/loop1
sudo mkfs.ext3 /dev/loop1p1
sudo mkfs.ext3 /dev/loop1p2
sudo mount -t ext3 /dev/loop1p1 p1
sudo mount -t ext3 /dev/loop1p2 p2
# 將Linux壓縮鏡像和對應(yīng)的dtb復(fù)制到第一分區(qū)
sudo cp linux_old1/arch/arm/boot/zImage p1
sudo cp linux_old1/arch/arm/boot/dts/vexpress-v2p-ca9.dtb p1
# 將根文件系統(tǒng)放到第二分區(qū),并且創(chuàng)建4個tty設(shè)備文件
sudo cp -raf busybox-1.36.0/myrootfs/* p2
sudo mkdir dev
cd dev
sudo mknod tty1 c 4 1
sudo mknod tty2 c 4 2
sudo mknod tty3 c 4 3
sudo mknod tty4 c 4 4
#硬盤鏡像創(chuàng)建結(jié)束,接觸映射,這時所有的文件都寫入到rootfs.ext3這個硬盤鏡像中了
cd ../.. #回到主目錄
sudo umount p1 p2
sudo losetup /dev/loop1
sudo losetup -d /dev/loop1
5. qemu仿真和GDB調(diào)試
方法一:直接調(diào)試內(nèi)核在啟動之前,需要首先確定內(nèi)核的入口地址,本文是0x80008000,需要在啟動qemu時,讓loader把內(nèi)核鏡像加載到這個地址。
啟動qemu模擬器,并且暫停運行,等待GDB接入(-s -S).
qemu-system-arm -M vexpress-a9 -m 512M -kernel arch/arm/boot/zImage-dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -append "console=ttyAMA0" -nographic -s -S -device loader,addr=0x80008000,cpu-num=0
# Boot Image or Kernel specific:
# -bios file set the filename for the BIOS
# -pflash file use 'file' as a parallel flash image
# -kernel bzImage use 'bzImage' as kernel image
# -append cmdline use 'cmdline' as kernel command line
# -initrd file use 'file' as initial ram disk
# -dtb file use 'file' as device tree image
# -S freeze CPU at startup (use 'c' to start execution)
# -s shorthand for -gdb tcp::1234
# -device loader,addr= The loader device allows the CPU’s PC to be set from the command line。
然后使用gdb-multiarch進行調(diào)試
sudo apt install gdb-multiarch #如果沒有的話執(zhí)行這句話
gdb-multiarch vmlinux
(gdb) target remote:1234
(gdb) layout src
之后可以看到linux的源碼被加載到gdb中了:
這種方式更加復(fù)雜,從bootloader到linux內(nèi)核再到加載根文件系統(tǒng)。這更加符合實際的流程,因此要先制作磁盤鏡像,也就是把Linux內(nèi)核和根文件系統(tǒng)放到磁盤中(flash),然后u-boot從磁盤中加載內(nèi)核,內(nèi)核再從磁盤中加載根文件系統(tǒng)。
qemu-system-arm -M vexpress-a9 -m 512M -kernel u-boot/u-boot -append "root=/dev/mmcblk0 console=ttyAMA0 rw init=/linuxrc" -sd rootfs.ext3 -serial stdio
在自動boot前,按空格鍵,進入手動模式,然后在qemu上的Linux下輸入:
mmc dev 0
part list mmc 0
load mmc 0:1 0x60008000 zImage
setenv bootargs 'root=/dev/mmcblk0p2 rw rootfstype=ext3 rootwait earlycon console=tty0 console=ttyAMA0 init=/linuxrc ignore_loglevel'
如果要u-boot自動加載內(nèi)核鏡像,需要去配置u-boot的makefile重新編譯u-boot. 有需要可以留言。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
文章題目:Linux配置、編譯和移植以及GDB調(diào)試-創(chuàng)新互聯(lián)
標題網(wǎng)址:http://chinadenli.net/article6/dgjjog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、動態(tài)網(wǎng)站、網(wǎng)頁設(shè)計公司、企業(yè)網(wǎng)站制作、網(wǎng)站設(shè)計公司、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容