1.獲取所需源碼
1)下載地址:
官方網址:https://github.com/raspberrypi
上面列出了樹莓派所有的開源軟件:
- linux:內核源碼
- tools:編譯內核和其他源碼所需的工具——交叉編譯器等
我們只需要以上兩個文件即可,下面的工程可以了解一下
- firmware:樹莓派的交叉編譯好的二進制內核、模塊、庫、bootloader
- documentation:樹莓派離線幫助文檔,教你如何使用、部署樹莓派(樹莓派官方使用教程)
- userland:arm端用戶空間的一些應用庫的源碼——vc視頻硬浮點、EGL、mmal、openVG等
- hats:Hardware Attached on Top,樹莓派 B+型板子的擴展板資料
- maynard:一個gtk寫成的桌面環境
- scratch:一個簡易、可視化編程環境
- noobs:一個樹莓派鏡像管理工具,他可以讓你在一個樹莓派上部署多個鏡像
- weston:一個應用程序
- target_fs:樹莓派最小文件系統,使用busybox制作
- quake3:雷神之錘3有線開發源碼firmwareb
2)下載方法:
git clone https://github.com/raspberrypi/tools git clone --depth=1 https://github.com/raspberrypi/linux
具體見:http://www.cnblogs.com/qiengo/p/5888559.html
2.配置交叉編譯環境
root@ubuntu:......./tools/arm-bcm2708# ls
arm-bcm2708hardfp-linux-gnueabi arm-bcm2708-linux-gnueabi arm-rpi-4.9.3-linux-gnueabihf gcc-linaro-arm-linux-gnueabihf-raspbian gcc-linaro-arm-linux-gnueabihf-raspbian-x64
32系統將如下路徑加入環境變量:
/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian
/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin
64系統將如下路徑加入環境變量:
/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
修改/etc/profile文件即可,完成后source /etc/profile,然后終端輸入arm-linux后雙擊Tab有指令提示說明添加成功
3.編譯、提取內核及其模塊
1)配置內核,配置makefile的ARCH類型和編譯器路徑
可以直接修改內核根目錄的Makefile文件,修改下面的這兩行
ARCH ?=$(SUBARCH)
CROSS_COMPILE ?=$(CONFIG_CROSS_COMPILE:"%"=%)
但是從這兩行上面的注釋可以看出,可以直接使用make指令設置這兩個參數,make ARCH =arm CROSS_COMPILE=arm-linux- ......
執行find ./ -name "*bcm*defconfig*" 查找下對應的默認配置,只保留arm下的結果:
./arch/arm/configs/bcm2835_defconfig ./arch/arm/configs/bcmrpi_defconfig ./arch/arm/configs/bcm2709_defconfig ./arch/arm/configs/bcm_defconfig
Pi 1 使用bcmrpi_defconfig
Pi 2/3 使用bcm2709_defconfig
執行指令
$ cd ....../linux-rpi-4.4.y $ KERNEL=kernel7 $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
配置內核模塊,執行
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
如下圖所示,頂部顯示arm,說明參數設置成功
2)編譯內核鏡像
$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
如果是多處理系統可以添加選項-jn ,n為數字,表示多處理器的數量*1.5。可以加快編譯速度
$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 zImage modules dtbs
4.升級內核及文件系統
將樹莓派的SD卡插在Linux系統電腦上,最好直接使用讀卡器,使用lsblk指令對比插入前后的變化,可以sd中的兩個分區如下:
lsblk
mmcblk0p1是FAT(boot)分區
mmcblk0p2是ext4文件系統(root)分區
掛載SD卡分區:
mkdir mnt/fat32 mkdir mnt/ext4 sudo mount /dev/mmcblk0p1 mnt/fat32 sudo mount /dev/mmcblk0p2 mnt/ext4
安裝modules:
sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install
如果把INSTALL_MOD_PATH設為本地目錄可以提取出對應的modules,最后,把kernel and Device Tree blobs復制到SD卡:
sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img //備份原先的img文件 sudo scripts/mkknlimg arch/arm/boot/zImage mnt/fat32/$KERNEL.img //將zImage格式轉成樹莓派需要的img格式,並復制到SD卡 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
升級內核的另一個辦法是將img文件復制到相同目錄下,使用不同的文件名,如 kernel-myconfig.img,然后修改boot目錄下的config.txt文件,加入:
kernel=kernel-myconfig.img
最后,將SD卡插入樹莓派啟動。
Ref:https://www.raspberrypi.org/documentation/linux/kernel/building.md