Raspberry Pi 4を起動するために、arm64(aarch64)プラットフォーム用のLinuxカーネルを最初からコンパイルしたいと思います。
ホストはamd64で、Debianバリアント(Ubuntu 20.04.1 LTS)を実行します。
すべてのタスクを実行するために、次のスクリプトを作成しました。
###### ビルド環境###### #ホストシステムがコンパイルするために必要なソフトウェアパッケージをダウンロードしてインストールします。 適切なインストールビルド 必須 libgmp-dev libmpfr-dev libmpc-dev libisl-dev libncurses5-dev bc git-core bison flex #RAMに一時的なビルド環境を作成します。 プレフィックス=/tmp/BE mkdir -p ${プレフィックス} ${PREFIX} 2>&1 > /dev/null マウント解除 マウント -t tmpfs tmpfs ${PREFIX} #バイナリユーティリティ: # ftp.gnu.orgからbinutilsをダウンロードしてコンパイルし、ホストにインストールします。 [修正済み] CD obj-binutils ../binutils-${BINUTILSVERSION}/configure --prefix=${PREFIX}/binutils --target=aarch64-linux-gnu --disable-nls インストールするために #湾岸協力協議会: # ftp.gnu.orgからgccをダウンロードし、ホストにコンパイルしてインストールします。 [編集済み] #GCC設定: ../gcc-${GCCVERSION}/configure --prefix=${PREFIX}/gcc --target=aarch64-linux-gnu\ --with-newlib --without-headers --disable-nls --disable-shared --disable-threads\ --disable-libssp --disable-decimal-float --disable-libquadmath --disable-libvtv\ --disable-libgomp --disable-libatomic --有効化-言語=c # GCCをインストールします。 all-gcc -j${thread}の作成 -gccをインストールするには #テスト: ${PREFIX}/gcc/bin/aarch64-linux-gnu-gcc -v # libgcc オプション [省略] ###### Linux ###### #私たちはraspberrypi linux gitからダウンロードしたことに注意してください。 Linuxブランチ="rpi-5.10.y" mkdir -p ${PREFIX}/linux CD ${PREFIX}/linux git clone --深さ=1 -b ${LINUXBRANCH} https://github.com/raspberrypi/linux.git mkdir カーネル出力 #コンパイルされたgcc / binutilsバイナリファイルをlinux / binディレクトリにコピーします。 CDLinux 目次目次 mv ${PREFIX}/binutils/bin/* ${PREFIX}/linux/linux/bin/ mv ${PREFIX}/gcc/bin/* ${PREFIX}/linux/linux/bin/ #RPi4固有の設定 カーネル=カーネル8 O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=${PREFIX}/linux/linux/bin/aarch64-linux-gnu-bcm2711_defconfig を作成します。 # Linuxメニューの設定 O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=${PREFIX}/linux/linux/bin/aarch64-linux-gnu-menuconfig で作成します。 #Linux ビルド make -j${THREADS} O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- #結果は次のとおりです。 ls -l /tmp/BE/linux/kernel-out/vmlinux #私の場合: #-rwxr-xr-x 1 root root 26179040 2月25日22時48分 /tmp/BE/linux/kernel-out/vmlinux # LinuxはvmlinuxをbzImageに圧縮します。 #注:pwd = /tmp/BE/linux/linux bzImage O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- で作成します。 ${PREFIX} -iname vmlinuzを探す
しかし、私は現在vmlinuxでbzImageを生成する最後のステップで停止しています。明らかに、vmlinuxをvmlinuzに圧縮することはできず、それを使用する必要がありますmake bzImage
。ただし、これを行うとエラーが発生します。
#通知:pwd = /tmp/BE/linux/linux make[1]: '/tmp/BE/linux/kernel-out' ディレクトリを入力してください。 make[1]: *** 'bzImage' ターゲットを生成するルールはありません。止まる make[1]: '/tmp/BE/linux/kernel-out' ディレクトリを終了します。 make: *** [Makefile:185: __sub-make] エラー 2
bzImage問題の助けを歓迎します。しかし、一般的に私の質問は、ARM64プラットフォーム用のLinuxカーネルをクロスコンパイルするプロセス全体についてです。
私がここでGCCとbinutilsでやっていることが正しいかどうかについてのアドバイスを歓迎します。あちこちでいくつかのGCCエラーが発生します。ただし、vmlinuxはコンパイルします。まず、生成されたvmlinuxをテストしてvmlinuzに変換してから、Ubuntuで既存のSDカードイメージを変更したいと思います。
このスクリプトがRPi4または他のデバイス用のARM64 Linuxカーネルをコンパイルしたい他の人に役立つように私の質問を編集したいと思います。
ベストアンサー1
明らかに、Linuxカーネルをコンパイルする正しい手順はプラットフォームによって異なります。
#32ビットx86 bzImageの作成 #64ビットx86 zImageの作成 #64ビットARMの場合 イメージの作成 #現在のディレクトリでコンパイルされたLinuxカーネルを検索します。 ./-iname "*イメージ"を探す