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 선택사항 [생략] ###### 리눅스 ###### # 우리는 raspberrypi linux git에서 다운로드했다는 점에 유의하세요. 리눅스브랜치="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 디렉토리에 복사합니다. CD리눅스 목차 목차 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를 만듭니다. # 리눅스 메뉴 구성 O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=${PREFIX}/linux/linux/bin/aarch64-linux-gnu-menuconfig로 만듭니다. # 리눅스 빌드 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 루트 루트 26179040 2월 25일 22:48 /tmp/BE/linux/kernel-out/vmlinux # 리눅스는 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의 경우 이미지 만들기 # 현재 디렉토리에서 컴파일된 리눅스 커널을 검색합니다. ./-iname "*이미지" 찾기