1. 程式人生 > >【樹莓派】編譯核心

【樹莓派】編譯核心

編譯核心一般有兩種方法:在樹莓派本地進行編譯,或者使用交叉編譯。後者速度更快,但也更加複雜。

本地編譯

你需要先安裝最新版的Raspbian,這是樹莓派官方的Linux發行版,然後啟動樹莓派,連線網路並登陸到系統。

第一步是獲取核心原始碼,鑑於GFW的緣故,速度會比較慢:

git clone --depth=1 https://github.com/raspberrypi/linux

新增丟失的依賴:

sudo apt-get install bc

配置核心。除了預設配置,你或許需要更加詳細地配置核心或者應用第三方補丁到核心來新增或者移除一些功能。

樹莓派1(或者計算卡)預設編譯配置

cd linux
KERNEL=kernel
make bcmrpi_defconfig

樹莓派2/3預設編譯配置

cd linux
KERNEL=kernel7
make bcm2709_defconfig

編譯並安裝核心,模組和裝置樹:

make -j4 zImage modules dtbs
sudo make modules_install
sudo cp arch/arm/boot/dts/*.dtb /boot/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
sudo
scripts/mkknlimg arch/arm/boot/zImage /boot/$KERNEL.img

注意:在使用樹莓派2/3地時候,-j4選項可以將任務分配到四個核心當中,從而加速編譯過程。

交叉編譯

首先,你需要一個合適地Linxu宿主機用於交叉編譯。建議使用Ubuntu,因為Rasp變也是Debian地一個發行版,這就意味著他們之間有許多相似地地方,比如命令列。

你可以在Windows上安裝虛擬機器或者直接將它安裝到你的電腦上。

安裝交叉編譯工具鏈

使用下面地命令來安裝工具鏈:

git clone https://github.com/raspberrypi/tools

32位系統:複製/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian

目錄到一個公共資料夾。

64位系統:複製/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64目錄到一個公共資料夾。

將bin目錄新增到環境變數。

獲取核心原始碼

要獲取原始碼,你可以訪問GitHub來選擇不同地分支。

git clone --depth=1 https://github.com/raspberrypi/linux

編譯原始碼

交叉編譯地過程中可能需要額外地依賴,如果年發現需要其它東西,那麼可以請求修改文件。

輸入下面地命令來編譯原始碼和裝置樹檔案:

樹莓派1或者計算卡:

cd linux
KERNEL=kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig

樹莓派2/3:

cd linux
KERNEL=kernel7
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig

之後,所有樹莓派都要執行:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

注意:如果你的處理器有多個核心,可以通過-jn選項來加速編譯,n為你的處理器核心數目。

將編譯完成地檔案安裝到樹莓派

將SD卡插入到主機,然後掛載分割槽,一下命令僅供參考,請按照實際情況輸入:

mkdir /mnt/fat32
mkdir /mnt/ext4
sudo mount /dev/sdb1 /mnt/fat32
sudo mount /dev/sdb2 /mnt/ext4

然後,安裝核心模組:

sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/mnt/ext4 modules_install

最後,複製核心和裝置樹檔案到SD卡,為了保險可以備份原核心:

sudo cp /mnt/fat32/$KERNEL.img /mnt/fat32/$KERNEL-backup.img
sudo scripts/mkknlimg arch/arm/boot/zImage /mnt/fat32/$KERNEL.img
sudo cp arch/arm/boot/dts/*.dtb /mnt/fat32/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /mnt/fat32/overlays/
sudo cp arch/arm/boot/dts/overlays/README /mnt/fat32/overlays/
sudo umount /mnt/fat32
sudo umount /mnt/ext4

你也可以選擇不覆蓋原核心,假如你的新核心名稱為my-kernel.img,你可以修改config.txt,新增以下命令來載入新核心:

kernel=my-kernel.img

可能遇到的問題

問題一

arch/arm/boot/dts/omap2.dtsi:11:35: fatal error: dt-bindings/gpio/gpio.h: No such file or directory
compilation terminated.

將原始碼目錄下的include/dt-bindings目錄軟連結到arch/arm/boot/dts/include下即可:

ln -s ./include/dt-bindings ./arch/arm/boot/dts/include