配置樹莓派linux的核心和編譯並將映象拷貝至樹莓派

FHNCSDN發表於2020-11-01

驅動程式碼的編寫需要一個提前編譯好的核心,編譯核心就必須配置,配置的最終目標會生成.config檔案,該檔案指導makefile去把有用的東西組織成核心。
如何生成.config檔案:
第一種方式:
廠家配linux核心原始碼,比如說買了樹莓派,現在要研發樹莓派的底層,廠家會提供樹莓派linux核心原始碼,直接cp    廠家.config    .config
第二種方式:
make menuconfig 一項項配置,通常是基於廠家的config來配置的。
第三種方式:
完全自己來
如何配置樹莓派linux的核心:
1、配置config
linux原始碼中有很多工程:
樹莓派1的工程是bcmrpi_defconfig;
樹莓派2、3的工程是bcm2709_defconfig。

1.1、獲取當前樹莓派的config

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
//ARCH是指定是arm架構
//CROSS_COMPILE指定編譯器是arm-linux-gnueabihf-(不同架構用不同的編譯器)
//KERNEL是樹莓派裡特別指定的
//用的config是bcm2709_defconfig

執行結果如下圖:

feng@ubuntu:~/SYSTEM/linux-rpi-4.14.y$  ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/zconf.lex.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
#
# configuration written to .config//將廠家的config變成了.config
#

此命令功能是獲取bcm2709_defconfig的配置到 .config裡。
我們可以直接用工程裡的配置,但這樣的話可能會丟失原來使用的樹莓派的配置,這裡提供一個方法可以獲取當前正在使用的樹莓派的config。
出現上圖核心配置已完成!下一步核心的編譯。
編譯:
安裝必要的庫:

sudo apt-get install bc
sudo apt-get install libncurses5-dev libncursesw5-dev
sudo apt-get install zlib1g:i386
sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5

1、執行menuconfig

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig

在這裡插入圖片描述

如果沒什麼改的就不用執行這一步。

2、編譯

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs 
//-j4指定用多少電腦資源來編譯,4是4程式。
//zImage是生成核心映象
//modules要生成驅動模組
//dtbs是生成配置檔案

以n程式編譯。不指明幾程式的話則預設以單程式編譯,編譯成功後,看到原始碼樹多了vmlinux(沒有壓縮的linux),失敗則無此檔案,成功後目標檔案zImage映象在arch/arm/boot底下。

3、打包zImage檔案成樹莓派可用的xxx.img
直接用linux原始碼包裡的工具:

./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img
//scripts是一個指令碼資料夾,其中的mkknlimg會將zImage打包成kernel_new.img

在本目錄生成一個kernel_new.img檔案,這個檔案就是要放到sd卡中的檔案。
注:網上很多地方說的用 tools/mkimage/imagetool-uncompressd.py 的方法不行!!

映象的拷貝:

一、掛載樹莓派sd卡,並安裝編譯出的DIRECTLY 到sd卡
把樹莓派的sd卡插入ubuntu系統電腦,樹莓派的sd卡有兩個分割槽:
一個fat分割槽,是boot相關的內容,kernel的img檔案就放在這個分割槽裡;
一個是ext4分割槽,也就是系統的根目錄分割槽。

我們生成的檔案涉及到這兩個分割槽的內容,一般插入ubuntu後會自動掛載,fat分割槽可以不用root許可權操作,ext4分割槽需要root許可權操作。

兩個分割槽具體掛載在什麼地方可以自己決定,以下用[fat]表示boot掛載的路徑,[ext4]表示ext4掛載的路徑。

二、掛載
插入sd卡輸入dmesg去檢視核心的資訊,如有裝置接入,核心會列印一些驅動方面的資訊,如圖:會看到兩個分割槽,sdb1和sdb2
在這裡插入圖片描述

資料拷貝:

mkdir data1
mkdir data2
//建立兩個資料夾,對應stb1和stb2

掛載U盤:

sudo mount /dev/sdb1 data1  一個是fat分割槽,是boot相關的內容,kernel的img
sudo mount /dev/sdb2 data2  一個是ext4分割槽,也就是系統的根目錄分割槽
//將dev下的sdb1和sdb2分別掛載到data1和data2

如圖,可以看到sd卡中的檔案以掛載到data1和data2:
在這裡插入圖片描述

三、開始拷貝
1、安裝modules(也是編譯生成的,主要是裝置驅動檔案,比如:hdmi,usb,wifi…)

sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=[ext4] modules_install
//其中的[ext4]是根據自己掛載的檔名稱填寫,是存放根目錄的資料夾路徑。
演示:
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/feng/data2 modules_install

安裝後如圖:
在這裡插入圖片描述
2、可以考慮先備份(防止拷貝失敗,樹莓派不能開機)如圖:
在這裡插入圖片描述

然後更新 kernel.img 檔案,再將新生成的映象檔案拷貝到data1,其名為kernel7.img,將原來的(kernel7.img)覆蓋掉,前面已經用 mkknlimg 工具打包了kernel_new.img檔案了,把它複製到boot分割槽並配置使用即可:

cp kernel_new.img [fat]/

3、複製其他相關檔案(這些是配置檔案,為了能夠載入驅動等)

cp arch/arm/boot/dts/.*dtb* [fat]/
cp arch/arm/boot/dts/overlays/.*dtb* [fat]/overlays/
cp arch/arm/boot/dts/overlays/README [fat]/overlays/
//*dtb*中的*是萬用字元就是以.開頭以dtb在中間這種形式的檔案,.和dtb之間的東西不管,dtb後有什麼字元也不管。

在這裡插入圖片描述

更新完成後插回樹莓派即可開機,可以通過串列埠開機(可以看作業系統是否起來了),開機後可以用 uname -a 命令檢視kernel資訊已經改變。

驅動載入的兩種方式:

  • *  編譯核心     zImage包含了驅動
  • M  模組方式生成驅動檔案xxx.ko    系統啟動後,通過命令inmosd  xxx.ko載入

指令補充:

dmesg
//檢視硬體底層的一些連線資料
feng@ubuntu:~/SYSTEM/linux-rpi-4.14.y$ du kernel_new.img
4828	kernel_new.img
feng@ubuntu:~/SYSTEM/linux-rpi-4.14.y$ du kernel_new.img -h
4.8M	kernel_new.img
feng@ubuntu:~/SYSTEM/linux-rpi-4.14.y$ md5sum kernel_new.img
6350420d173bddfe02f4d8f81791e91f  kernel_new.img
feng@ubuntu:~/SYSTEM/linux-rpi-4.14.y$ md5sum /home/feng/data1/kernel7.img 
6350420d173bddfe02f4d8f81791e91f  /home/feng/data1/kernel7.img
feng@ubuntu:~/SYSTEM/linux-rpi-4.14.y$ 
//du指令檢視檔案的大小,-h是以兆為單位顯示
//每個檔案都有它唯一的的編碼號就是md5sum的值,在拷貝時若發生損壞則md5sum的值會發生改變,可以用其驗證是否烤壞。

參考博文:https://blog.csdn.net/nicekwell/article/details/78482833

相關文章