Back to Raspberry Pi Taiwan

【教學/進階】編譯 Raspberry Pi 的核心

Last Updated on 2023 年 3 月 8 日 by 小編

Linux kernel
圖片來源:Linux kernel

本文前言來自鳥哥的私房菜中的第二十四章、Linux 核心編譯與管理

前言

核心是什麼?

其實核心就是系統上面的一個檔案而已,這個檔案包含了驅動主機各項硬體的偵測程式與驅動模組。

為什麼要編譯核心?

因為新功能的需求、原本核心太過臃腫、與硬體搭配的穩定性、其他需求(如嵌入式系統)。


 

編譯 Raspberry Pi 的核心

這裡簡介編譯安裝 Raspberry Pi Kernel 的流程,未來我們還會常常回來看這篇。

1. 在個人電腦建構交叉編譯的環境

步驟可參考這裡

2. 查詢目前 Pi 的核心版本

這篇以安裝 2014-01-07-wheezy-raspbian.img 的映像檔為例,使用的核心版本為 3.10.25。

pi@raspberrypi:~$ uname -a
Linux raspberrypi 3.10.25+ #622 PREEMPT Fri Jan 3 18:41:00 GMT 2014 armv6l GNU/Linux

3. 取得 Pi 的核心設定

pi@raspberrypi:~$ zcat /proc/config.gz > .config

4. 在個人電腦下載核心原始碼

sosorry@ubuntu:~$ cd rpi
sosorry@ubuntu:~/rpi$ git clone https://github.com/raspberrypi/linux.git
Initialized empty Git repository in /home/sosorry/linux/.git/
remote: Counting objects: 3512060, done.
remote: Compressing objects: 100% (586452/586452), done.
Receiving objects: 100% (3512060/3512060), 957.40 MiB | 3.18 MiB/s, done.
remote: Total 3512060 (delta 2897634), reused 3510306 (delta 2896207)
Resolving deltas: 100% (2897634/2897634), done.
Checking out files: 100% (43371/43371), done.

5. 切到目標分支

sosorry@ubuntu:~/rpi$ cd linux
sosorry@ubuntu:~/rpi/linux$ git checkout rpi-3.10.y

6. 讀取目前 Pi 的核心設定

假設 Pi 的 IP 為 192.168.1.2。

sosorry@ubuntu:~/rpi/linux$ make mrproper
  CLEAN   scripts/basic
  CLEAN   scripts/kconfig
  CLEAN   include/config include/generated

sosorry@ubuntu:~/rpi/linux$ scp pi@192.168.1.2:/home/pi/.config .

sosorry@ubuntu:~/rpi/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- oldconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/zconf.lex.c
  SHIPPED scripts/kconfig/zconf.hash.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
scripts/kconfig/conf --oldconfig Kconfig
*
* Restart config...
*
*
* ALSA for SoC audio support
*
ALSA for SoC audio support (SND_SOC) [M/n/?] m
  SoC Audio for the Atmel System-on-Chip (SND_ATMEL_SOC) [N/m/?] n
  SoC Audio support for the Broadcom BCM2708 I2S module (SND_BCM2708_SOC_I2S) [M/n/?] m
    Support for HifiBerry DAC (SND_BCM2708_SOC_HIFIBERRY_DAC) [M/n/?] m
    Support for HifiBerry Digi (SND_BCM2708_SOC_HIFIBERRY_DIGI) [N/m/?] (NEW) 
    Support for RPi-DAC (SND_BCM2708_SOC_RPI_DAC) [M/n/?] m
    Support for IQaudIO-DAC (SND_BCM2708_SOC_IQAUDIO_DAC) [N/m/?] (NEW) 
  Synopsys I2S Device Driver (SND_DESIGNWARE_I2S) [N/m/?] n
  Build all ASoC CODEC drivers (SND_SOC_ALL_CODECS) [N/m/?] n
  ASoC Simple sound card support (SND_SIMPLE_CARD) [N/m/?] n
#
# configuration written to .config
#

7. 以選單方式選取所需要的功能

sosorry@ubuntu:~/rpi/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

raspberry_pi_kernel_configuration

8. 編譯核心(k, –keep-going)

sosorry@ubuntu:~/rpi/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -k V=1

9. 安裝核心模組

sosorry@ubuntu:~/rpi/linux$ mkdir ../modules
sosorry@ubuntu:~/rpi/linux$ make modules_install ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=../modules/

10. 使用內建的工具產生出 Raspberry Pi 的核心(kernel.img)

sosorry@ubuntu:~/rip/linux$ cd ~/tools/mkimage
sosorry@ubuntu:~/rpi/tools/mkimage$ ./imagetool-uncompressed.py ~/rpi/linux/arch/arm/boot/zImage"

11. 將 kernel、firmware、lib 安裝到 Pi 上

這邊假設 SD 卡已經 mount 在 ~/sdb1 和 ~/sdb2。

sosorry@ubuntu:~/rpi/tools/mkimage$ sudo cp -Rf ~/rpi/modules/lib/firmware/ ~/sdb2/lib/
sosorry@ubuntu:~/rpi/tools/mkimage$ sudo cp -Rf ~/rpi/modules/lib/modules/ ~/sdb2/lib/

12. 移除 SD 卡,重新啟動 Pi,查詢核心版本

可以看到我們從 3.10.25 升級到 3.10.37。

pi@raspberrypi:~$ uname -a
Linux raspberrypi 3.10.37+ #1 PREEMPT Wed Apr 16 03:12:08 CST 2014 armv6l GNU/Linux

常見問與答:

1. 如果沒有 /proc/config.gz 怎麼辦?

請先執行 pi@raspberrypi:~$ sudo modprobe configs 就可以了
(感謝 Jimmy Chen 的貢獻)

RASPBERRY.ORG參考資料

Comments (6)

  • Allen Reply

    請問如何編譯核心,
    我下make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -k V=1,
    畫面出現
    make -f /home/allen/rpi/linux/Makefile silentoldconfig
    make -f scripts/Makefile.build obj=scripts/basic
    rm -f .tmp_quiet_recordmcount
    mkdir -p include/linux include/config
    make -f scripts/Makefile.build obj=scripts/kconfig silentoldconfig
    mkdir -p include/generated
    scripts/kconfig/conf –silentoldconfig Kconfig
    *
    * Restart config…
    *
    *
    * General setup
    *
    Cross-compiler tool prefix (CROSS_COMPILE) [] (NEW)
    Local version – append to kernel release (LOCALVERSION) [] (NEW)
    Automatically append version information to the version string (LOCALVERSION_AUTO) [Y/n/?] (NEW)
    系統又要重新config kernel
    位和我無法編譯??

    2014 年 6 月 17 日 at 下午 3:48
    • service Reply

      您好,請問您有 .config 檔嗎?
      這訊息看起來是原有的 .config 和 kernel 裡的的 KConfig 有衝突,所以才會再問一次。.config 檔案會從 make menuconfig 產生出來。

      2014 年 6 月 17 日 at 下午 7:46
  • TIK Reply

    hi everyone:
    我做到
    “/rpi/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -k V=1”
    後就出現錯誤訊息.能給點意見嗎?,看要先檢查哪些東西 謝謝
    mkdir -p include/generated
    scripts/kconfig/conf –silentoldconfig Kconfig

    *** Error during update of the configuration.

    make[2]: *** [silentoldconfig] Error 1
    make[1]: *** [silentoldconfig] Error 2
    make: *** No rule to make target `include/config/auto.conf’, needed by `include/config/kernel.release’.

    2014 年 8 月 23 日 at 下午 3:56
    • TIK Reply

      *** Error during update of the configuration.
      的問題有可能是source tree放置資料夾權限問題,我有嘗試用chomod 但不管怎麼改,都是”drwxdrwx—-“…..但搬到home目錄下這個問題就消失了

      不過經過一個小時左右的編譯,出現下列錯誤,有人能給點意見或想法嗎?

      make[1]: `include/generated/mach-types.h’ is up to date.
      CALL scripts/checksyscalls.sh
      CHK include/generated/compile.h
      CHK kernel/config_data.h
      make[2]: *** No rule to make target `net/bridge/br_fdb.o’, needed by `net/bridge/bridge.o’. Stop.
      make[1]: *** [net/bridge] Error 2
      make: *** [net] Error 2

      2014 年 8 月 24 日 at 下午 3:06
      • service Reply

        您好,請問您 .config 的檔案是怎麼產生的? 這看起來像是 .config 的相依性有錯,導致需要的 .o 檔沒被先產生而報錯。

        2014 年 8 月 29 日 at 下午 11:39
  • newcomer Reply

    請問能有影片檔demo嗎? 我覺得降比較清楚,也會吸引更多人來這邊學習,thanks

    2014 年 11 月 18 日 at 上午 11:55

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Back to Raspberry Pi Taiwan